基于单片机控制的多功能数字时钟设计程序.docx
《基于单片机控制的多功能数字时钟设计程序.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的多功能数字时钟设计程序.docx(38页珍藏版)》请在冰点文库上搜索。
基于单片机控制的多功能数字时钟设计程序
编号XXXXXXX
毕业论文
附录部分
(2012届本科)
题目:
基于单片机控制的多功能数字时钟设计
学院:
物理与机电学院
专业:
电气工程及其自动化
作者姓名:
XXXXXX
指导教师:
XXXX职称:
XXX
完成日期:
2012年5月16日
二○一二年五月
附录A源程序代码
***************************************
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineTIME(0X10000-50000)
#defineFLAG0XEF//闹钟标志
//引脚连接图
sbitrst=P3^5;
sbitclk=P3^4;
sbitdat=P3^3;
sbitrs=P1^5;
sbitrw=P1^6;
sbite=P1^7;
sbitDQ=P1^4;//温度输入口
sbitP3_2=P3^2;
sbitACC_7=ACC^7;
//全局变量及常量定义
uchari=20,j,time1[16];
ucharalarm[2],time2[15],time[3];
ucharcodeDay[]={31,28,31,30,31,30,31,31,30,31,30,31};//12个月的最大日期(非闰年)
//音律表
uintcodetable1[]={64260,64400,64524,64580,64684,64777,
64820,64898,64968,65030,65058,65110,65157,65178,65217};
//发声部分的延时时间
ucharcodetable2[]={0x82,1,0x81,0xf4,0xd4,0xb4,0xa4,
0x94,0xe2,1,0xe1,0xd4,0xb4,0xc4,0xb4,4,0};
//LCD自建字
ucharcodetab[]={0x18,0x1b,5,4,4,5,3,0,
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//年
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,//月
0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00};//日
//*******温度小数部分用查表法**********//
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//闹钟中用的全局变量
ucharth1,tl1;
uchartemp_data[2]={0x00,0x00};//读出温度暂放
bitflag;//18b20存在标志位
/***********11微秒延时函数**********/
delay(uintt)
{
for(;t>0;t--);
}
/***********18B20复位函数**********/
ow_reset(void)
{
uchari;
DQ=1;_nop_();_nop_();
DQ=0;//
delay(50);//550us
DQ=1;//
delay(6);//66us
for(i=0;i<0x30;i++)
{
if(!
DQ)
gotod1;
}
flag=0;//清标志位,表示ds1820不存在
DQ=1;
return;
d1:
delay(45);//延时500us
flag=1;
DQ=1;//置标志位,表示ds1820存在
}
/**********18B20写命令函数*********/
//向1-WIRE总线上写一个字节
voidwrite_byte(ucharval)
{
uchari;
for(i=8;i>0;i--)//
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ=val&0x01;//最低位移出
delay(6);//66us
val=val/2;//右移一位
}
DQ=1;
delay
(1);
}
/*********18B20读1个字节函数********/
//从总线上读取一个字节
ucharread_byte(void)
{
uchari;
ucharvalue=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;//
_nop_();_nop_();_nop_();_nop_();//4us
DQ=1;_nop_();_nop_();_nop_();_nop_();//4us
if(DQ)
value|=0x80;
delay(6);//66us
}
DQ=1;
return(value);
}
/***********读出温度函数**********/
read_temp()
{
ow_reset();//总线复位
if(!
flag)//判断ds1820是否存在?
若ds18b20不存在则返回
return;
//write_byte(0xCC);//SkipROM
//write_byte(0x44);//发转换命令
//delay(70);
write_byte(0xCC);//发SkipROM命令
write_byte(0xBE);//发读命令
temp_data[0]=read_byte();//温度低8位
temp_data[1]=read_byte();//温度高8位
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0x44);//发转换命令
}
/***********温度数据处理函数**********/
work_temp()
{
ucharn=0,m;
if(temp_data[1]>127)//负温度求补码
{
temp_data[1]=(256-temp_data[1]);
temp_data[0]=(256-temp_data[0]);
n=1;
}
time2[13]=ditab[temp_data[0]&0x0f]+'0';
time2[12]='.';
m=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
if(n)
{
m-=16;
}
time2[9]=m/100+'0';
time2[11]=m%100;
time2[10]=time2[11]/10+'0';
time2[11]=time2[11]%10+'0';
if(time2[9]=='0')//最高位为0时都不显示
{
time2[9]=0x20;
if(n)//负温度时最高位显示"-"
{
time2[9]='-';
}
if(time2[10]=='0')
{
if(n)
{
time2[10]='-';
time2[9]=0x20;
}
else
time2[10]=0x20;
if(time2[11]=='0'&&time2[13]=='0')
time2[11]=time2[12]=0x20;
}
}
}
delay1ms(uchartime)//延时1ms
{
uchari,j;
for(i=0;i