基于单片机控制的多功能数字时钟设计程序.docx

上传人:b****1 文档编号:10661743 上传时间:2023-05-27 格式:DOCX 页数:38 大小:32.23KB
下载 相关 举报
基于单片机控制的多功能数字时钟设计程序.docx_第1页
第1页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第2页
第2页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第3页
第3页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第4页
第4页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第5页
第5页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第6页
第6页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第7页
第7页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第8页
第8页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第9页
第9页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第10页
第10页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第11页
第11页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第12页
第12页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第13页
第13页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第14页
第14页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第15页
第15页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第16页
第16页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第17页
第17页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第18页
第18页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第19页
第19页 / 共38页
基于单片机控制的多功能数字时钟设计程序.docx_第20页
第20页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于单片机控制的多功能数字时钟设计程序.docx

《基于单片机控制的多功能数字时钟设计程序.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的多功能数字时钟设计程序.docx(38页珍藏版)》请在冰点文库上搜索。

基于单片机控制的多功能数字时钟设计程序.docx

基于单片机控制的多功能数字时钟设计程序

编号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

{

for(j=0;j<250;j++);

}

}

//LCD驱动部分

enable()

{

rs=0;

rw=0;

e=0;

delay1ms(3);

e=1;

}

write2(uchari)

{

P0=i;

rs=1;

rw=0;

e=0;

delay1ms

(2);

e=1;

}

write1(uchardata*address,m)

{

uchari,j;

for(i=0;i

{

j=*address;

write2(j);

}

}

//LCD显示

lcdshow()

{

P0=0XC;//显示器开、光标关

enable();

P0=0x80;//写入显示起始地址

enable();

write1(time1,16);

P0=0xc1;//写入显示起始地址

enable();

write1(time2,15);

}

//自建字

zijianzi()

{

uchari;

P0=0x40;

enable();

for(i=0;i<32;i++)

{

write2(tab[i]);

delay1ms

(2);

}

}

//DS1302读写子程序

write(ucharaddress)

{

uchari;

clk=0;

_nop_();

rst=1;

_nop_();

for(i=0;i<8;i++)

{

dat=address&1;

_nop_();

clk=1;

address>>=1;

clk=0;

}

}

ucharread()

{

uchari,j=0;

for(i=0;i<8;i++)

{

j>>=1;

_nop_();

clk=0;

_nop_();

if(dat)

j|=0x80;

_nop_();

clk=1;

}

return(j);

}

//部分显示数据初始化

timestart()

{

time1[1]=time1[13]=time2[8]=time2[9]=time2[10]=0x20,time2[14]=0;

time1[6]=1,time1[9]=2,time1[12]=3,time1[2]='2',time1[3]='0';

time1[14]='W',time2[2]=time2[5]=':

';

write(0xc1);

alarm[0]=read();

rst=0;

write(0xc3);

alarm[1]=read();

rst=0;

write(0xc5);

time1[0]=read();

rst=0;

}

//读取时间

readtime()

{

uchari,m,n;

write(0x8d);//读取年份

m=read();

rst=0;

time1[4]=m/16+0x30;

time1[5]=m%16+0x30;

write(0x8b);//读取星期

m=read();

rst=0;

time1[15]=m+0x30;

for(i=7,n=0x89;i<11;i+=3,n-=2)//读取月份和日期

{

write(n);

m=read();

rst=0;

time1[i]=m/16+0x30;

time1[i+1]=m%16+0x30;

}

for(m=0,i=0,n=0x85;i<7;i+=3,n-=2,m++)//读取时,分,秒

{

write(n);

time[m]=read();

rst=0;

time2[i]=time[m]/16+0x30;

time2[i+1]=time[m]%16+0x30;

}

}

time0()interrupt1using1

{

i--;

if(i==0)

{

if(j!

=0)

j--;

i=20;

}

TH0=TIME/256,TL0=TIME%256;

}

//闹钟部分

intime1()interrupt3

{

TH1=th1,TL1=tl1;

P3_2=!

P3_2;

}

showalarm()

{

uchari,j,a,b,n;

ET1=1;

for(j=0;j<6;j++)

{

i=0;

while

(1)

{

a=table2[i];

if(a==0)

break;

b=a&0xf;

a>>=4;

if(a==0)

{

TR1=0;

gotoD1;

}

a=((--a)<<1)/2;

TH1=th1=table1[a]/256,TL1=tl1=table1[a]%256;

TR1=1;

D1:

do

{

b--;

for(n=0;n<3;n++)

{

readtime();

lcdshow();

P2=0xf7;

if(P2==0xe7)

{

delay1ms(100);

if(P2==0xe7)

{

TR1=0;

ET1=0;

return;

}

}

}

}while(b!

=0);

i++;

}

TR1=0;

}

ET1=0;

}

//根据日期的变动自动调整星期

ucharsetweek()

{

uchari=5,j,n;

j=(time1[4]&0xf)*10+(time1[5]&0xf);

n=j/4;

i=i+5*n;

n=j%4;

if(n==1)

i+=2;

elseif(n==2)

i+=3;

elseif(n==3)

i+=4;

j=(time1[7]&0xf)*10+(time1[8]&0xf);

if(j==2)

i+=3;

elseif(j==3)

i+=3;

elseif(j==4)

i+=6;

elseif(j==5)

i+=1;

elseif(j==6)

i+=4;

elseif(j==7)

i+=6;

elseif(j==8)

i+=2;

elseif(j==9)

i+=5;

elseif(j==11)

i+=3;

elseif(j==12)

i+=5;

if(n==0)

if(j>2)

i++;

j=(time1[10]&0xf)*10+(time1[11]&0xf);

i+=j;

i%=7;

if(i==0)

i=7;

return(i);

}

//设置时间

settime()

{

uchari=0x85,year,month,day,n;

time2[6]=time2[7]=0x30,time1[14]=time1[15]=0x20;

lcdshow();

while

(1)

{

P0=0xe;//显示器开、光标开

enable();

P0=i;//定光标

enable();

P2=0xf7;

if(P2!

=0XF7)

{

delay1ms(100);//延时0.1s去抖动

if(P2!

=0XF7)

{

j=7;

if(P2==0X77)

{

i+=3;

if(i==0x8e)

i=0xc2;

elseif(i>0xc5)

i=0x85;

}

elseif(P2==0xb7)

{

year=(time1[4]&0xf)*10+(time1[5]&0xf);

month=(time1[7]&0xf)*10+(time1[8]&0xf);

day=(time1[10]&0xf)*10+(time1[11]&0xf);

if(i==0x85)

{

year++;

if(year>99)

year=0;

if((year%4)!

=0)

if(month==2&&day==29)

day=28;

}

elseif(i==0x88)

{

month++;

if(month>12)

month=1;

if(day>Day[month-1])

{

day=Day[month-1];

if(month==2&&(year%4)==0)

day=29;

}

}

elseif(i==0x8b)

{

day++;

if(day>Day[month-1])

{

if(month==2&&(year%4)==0)

{

if(day>29)

day=1;

}

if(month!

=2)

day=1;

}

}

elseif(i==0xc2)

{

n=(time2[0]&0xf)*10+(time2[1]&0xf);

n++;

if(n>23)

n=0;

time2[0]=n/10+0x30;

time2[1]=n%10+0x30;

}

else

{

n=(time2[3]&0xf)*10+(time2[4]&0xf);

n++;

if(n>59)

n=0;

time2[3]=n/10+0x30;

time2[4]=n%10+0x30;

}

time1[4]=year/10+0x30;

time1[5]=year%10+0x30;

time1[7]=month/10+0x30;

time1[8]=month%10+0x30;

time1[10]=day/10+0x30;

time1[11]=day%10+0x30;

lcdshow();

}

elseif(P2==0xd7)

{

write(0x8c);

write((time1[4]&0xf)*16+(time1[5]&0xf));

rst=0;

write(0x8a);

write(setweek());

rst=0;

for(i=7,n=0x88;i<11;i+=3,n-=2)

{

write(n);

write((time1[i]&0xf)*16+(time1[i+1]&0xf));

rst=0;

}

for(i=0;i<7;i+=3,n-=2)

{

write(n);

write((time2[i]&0xf)*16+(time2[i+1]&0xf));

rst=0;

}

TR0=0;

time1[14]='W';

return;

}

else

{

TR0=0;

time1[14]='W';

return;

}

}

}

if(j==0)

{

TR0=0;

time1[14]='W';

return;

}

}

}

//设置闹钟

setalarm()

{

uchari,n;

for(i=1;i<16;i++)

{

time1[i]=0x20;

}

time2[0]=alarm[0]/16+0x30;

time2[1]=(alarm[0]&0xf)+0x30;

time2[3]=alarm[1]/16+0x30;

time2[4]=(alarm[1]&0xf)+0x30;

time2[6]=time2[7]=0x30;

lcdshow();

i=0xc2;

while

(1)

{

P0=0xe;//显示器开、光标开

enable();

P0=i;//定光标

enable();

P2=0xf7;

if(P2!

=0XF7)

{

delay1ms(100);//延时0.1s去抖动

if(P2!

=0XF7)

{

j=7;

if(P2==0X77)

{

i+=3;

if(i>0xc5)

i=0xc2;

}

elseif(P2==0xb7)

{

if(i==0xc2)

{

n=(time2[0]&0xf)*10+(time2[1]&0xf);

n++;

if(n>23)

n=0;

time2[0]=n/10+0x30;

time2[1]=n%10+0x30;

}

else

{

n=(time2[3]&0xf)*10+(time2[4]&0xf);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2