单片机数字时钟课程设计报告_第1页
单片机数字时钟课程设计报告_第2页
单片机数字时钟课程设计报告_第3页
单片机数字时钟课程设计报告_第4页
单片机数字时钟课程设计报告_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XXXX大学课程设计报告课程设计名称:多功能数字时钟学院:信息科学与工程学院姓名:班级:09通1班学号:指导老师:时间:2012.2.20—3.11“多功能数字时钟”设计要求一、基于DS1302二、能调时间(日期、星期、时、分)三、有三个以上闹铃点,并可以分别设置是否起作用;四、有一个定时开关,在一个可以设定的时间段内能保持驱动继电器控制输出;五、所有人工设置的数据应能断电保存,人机界面友好、按键可靠;六、能通过串行口把当前的时间信息输出七、可以结合天色的亮暗,决定定时继电器是否输出;八、显示当前时间的同时显示当前温度;九、可以使用红外遥控器设置各种参数;十、可以使用串行口设置各种参数;备注:要求实现前面七项,后三点为扩展功能。芯片STC89C51RC与STC12C5A32S2芯片型号RAM(字节)ROM(字节)工作频率(Hz)两者比较STC89C52RC5128K0—40M最高可达48M相同点:都是低电平驱动;不同点:12C5A功能更强大,对驱动的要求更低。(详细参考资料)STC12C5A32S2128032K0—35M(相当于普通8051的0—420M)各模块使用注意事项简介基础操作模块要求花样灯能够结合按键灵活控制灯的亮灭形式液晶显示包含头文件<16c02.c>;P2.6、P2.7与液晶模块连接;使用时须初始化、清屏;注意显示时的覆盖技巧。定义与1602LCD的数据口的单片机口线P0口。数码管共阳接法;低电平点亮;掌握循环显示各种数值,通过多次扫描稳定显示。串行通信初始化,设置波特率。注意换行puts函数的使用技巧。多位数发送。24C02掌握read与write函数的使用格式。根据需要进行相应异常处理。包含头文件<24c02.c>.定义24C02的数据线与单片机的连接P2.2与P2.3。ADC采样P1口8路采样。第0路(P1.0)抽头可变电阻,第1路(P1.1)接光敏电阻。PWMP1.3、P1.4输出脉冲DS1302初始化合理的值。主要芯片简介:24C02与DS130224C02DS1302串行E2PROM是基于I2C-BUS的存储器件;数据掉电不丢失;擦写寿命:100万次数据保持时间:100年容量:2K,256字节高性能、低功耗、带RAM的实时时钟电路;可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能;DS1302存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。设计思想:模块化设计设计思路:NO.1显示模块年月日星期的显示时分秒的显示闹铃点的显示定时段的显示→NO.2调节模块年月日星期的调整时分的调整闹铃点的调整定时段的调整→NO.3定时模块在时间段内启动继电器,进行ADC采样(根据天色亮暗决定继电器是否工作)→NO.4串行输出块将时间通过串口发送,在串口助手显示当前的时间。NO.5按键扫描模块(最重要的模块)各种按键复用,状态变量的设置。临界条件的控制。24C02的及时保存数据。→NO.6主函数各种初始化;各种异常处理;主要程序。多功能数字时钟使用说明书k5键:功能选择键——不按k5键时(调节时钟)K1:时加1;K2:分加1;K3时减1;K4:分减1;——按k5(调节闹钟1,2,3)K1:时加1;K2:分加1;K3:分减1;K4:控制闹钟的开关——(调节定时设置)K1,k2调定时1的时分(只可加)K3,k4调定时2的时分——调节是否启动定时K1控制开关附加说明:关于定时在定时时间段内,启动继电器,进行ADC采样,当天色足够亮。部分功能展示:串口发送时间程序://多功能数字时钟#include<reg52.h>#include<1602lcd.c>#include<24C02.c>#include<DS1302.c>#include<STC-ADC.c>#include<stdio.h>sbitbeep=P2^0;sbitjdq=P2^1;//继电器sbitk1=P1^3;sbitk2=P1^4;sbitk3=P1^5;sbitk4=P1^6;sbitk5=P1^7;unsignedcharzt=0,zt1=1,zt2=1,zt3=1,channel,kg=1;unsignedcharhour_nao1=10, hour_nao2=12,hour_nao3=12;unsignedcharminute_nao1=58,minute_nao2=12,minute_nao3=12;unsignedcharhour_ding1=11,hour_ding2=11,minute_ding1=11,minute_ding2=30;unsignedcharh1,h2,m1,m2,s1,s2;voiddelay_ms(unsignedintxms);voiddi_di();voiddi();voiddisp();voidnao_do();voiddinshi_do();voidchuanxing_out();voidkey_do();voidmain(){hour_nao1=read_add_24c02(4);minute_nao1=read_add_24c02(5); //24C02读取 hour_nao2=read_add_24c02(6);minute_nao2=read_add_24c02(7); hour_nao3=read_add_24c02(8);minute_nao3=read_add_24c02(9); hour_ding1=read_add_24c02(13);minute_ding1=read_add_24c02(14); hour_ding2=read_add_24c02(15);minute_ding2=read_add_24c02(16); if(hour_nao1>23)hour_nao1=0;if(hour_nao2>23)hour_nao2=0;if(hour_nao3>23)hour_nao3=0; //异常处理24C02 if(minute_nao1>59)minute_nao1=0;if(minute_nao2>59)minute_nao2=0;if(minute_nao3>59)minute_nao3=0; if(hour_ding1>23)hour_ding1=0;if(hour_ding2>23)hour_ding2=0; if(minute_ding1>59)minute_ding1=0;if(minute_ding2>59)minute_ding2=0; //--------------------------------------------------lcd_int(); //16c02初始化lcd_write_com(0x01);//----------------------------------------------------- InitADC();//初始化ADC采样 //----------------------------------------------------- get_ds1302();//获取时间 if(year<11||year>15)//异常处理DS1302 {Init_DS1302(12,3,6,9,57,0,2); }//---------------------------------------------------- EX0=1; //打开外部中断0 IT0=1; //外部中断0,设置为下降沿触发//-----------------------------------------------------//串口输出初始化TMOD=0x20;//设置定时器1工作方式为:方式2、8位初始值自动重装TH1=0xfd;TL1=0xfd;//设置初始值,以设波特率为9600TR1=1;//启动定时器1SM0=0;SM1=1;//SCON寄存器设置串行口工作方式1:一帧10位、1起始位8数据位1停止位EA=1;//允许总中断ES=1;//串行中断允许REN=1;//允许串口接收//----------------------------------------------------------------- while(1) { get_ds1302();//获取时间 disp();//根据zt的值显示相应的信息 nao_do();//闹铃的判断处理 if(kg==0) dinshi_do();//定时判断处理(包含天色判断),嘎嘎,,把采样放别处进行吧。。 chuanxing_out();//串行输出信息 //key_do();按键判断处理---用外部中断完成 //保存数据---在数据改变后马上保存 }}voiddisp(){if(zt==0) //正常走时显示{lcd_locate(1,2);//1602LCD显示定位在第1行第4个字符处lcd_2_char(20);lcd_2_char(year);//显示年 lcd_write_data('.'); lcd_2_char(month); //显示月 lcd_write_data('.'); lcd_2_char(day);//显示日 lcd_locate(1,15); lcd_2_char(week);lcd_locate(2,1); lcd_string("");//1602LCD显示定位在第2行第5个字符处 lcd_2_char(hour); //显示小时 lcd_write_data(':'); lcd_2_char(minute); //显示分 lcd_write_data(':'); lcd_2_char(second);//显示秒 lcd_string(""); } //-----------闹铃点1显示-------------------------------if(zt==1) {lcd_locate(1,2);//1602LCD显示定位在第1行第2个字符处 lcd_2_char(hour); //显示小时 lcd_write_data(':'); lcd_2_char(minute); //显示分 lcd_write_data(':'); lcd_2_char(second);//显示秒 lcd_string(""); lcd_locate(2,1); lcd_string("nao1-"); if(zt1==0) { lcd_2_char(hour_nao1); //显示小时 lcd_write_data(':'); lcd_2_char(minute_nao1); //显示分 lcd_string("ON"); } if(zt1==1) { lcd_2_char(hour_nao1); //显示小时 lcd_write_data(':'); lcd_2_char(minute_nao1); //显示分 lcd_string("OFF"); }} //------------ 闹铃点2显示---------------------------------if(zt==2) { lcd_locate(1,2); lcd_2_char(hour); lcd_write_data(':'); lcd_2_char(minute); lcd_write_data(':'); lcd_2_char(second); lcd_string(""); if(zt2==0) {lcd_locate(2,1); lcd_string("nao2-"); lcd_2_char(hour_nao2); lcd_write_data(':'); lcd_2_char(minute_nao2); lcd_string("ON"); } if(zt2==1) {lcd_locate(2,1); lcd_string("nao2-"); lcd_2_char(hour_nao2); lcd_write_data(':'); lcd_2_char(minute_nao2); lcd_string("OFF"); }} //--------------闹铃点3显示---------------------------------------if(zt==3) { lcd_locate(1,2); lcd_2_char(hour); lcd_write_data(':'); lcd_2_char(minute); lcd_write_data(':'); lcd_2_char(second); lcd_string(""); if(zt3==0){lcd_locate(2,1); lcd_string("nao3-"); lcd_2_char(hour_nao3); lcd_write_data(':'); lcd_2_char(minute_nao3); lcd_string("ON"); } if(zt3==1){lcd_locate(2,1); lcd_string("nao3-"); lcd_2_char(hour_nao3); lcd_write_data(':'); lcd_2_char(minute_nao3); lcd_string("OFF"); }} //------------定时显示------------------------------------------if(zt==4) { lcd_locate(1,2); lcd_2_char(hour); lcd_write_data(':'); lcd_2_char(minute); lcd_write_data(':'); lcd_2_char(second); lcd_string(""); lcd_locate(2,1); lcd_string("ds-"); lcd_2_char(hour_ding1); lcd_write_data(':'); lcd_2_char(minute_ding1); lcd_write_data('-'); lcd_2_char(hour_ding2); lcd_write_data(':'); lcd_2_char(minute_ding2);} if(zt==5) { lcd_locate(1,2);lcd_2_char(20);lcd_2_char(year); lcd_write_data('.'); lcd_2_char(month); lcd_write_data('.'); lcd_2_char(day); lcd_string(""); lcd_locate(1,15); lcd_2_char(week);lcd_locate(2,1); lcd_string("GB"); lcd_2_char(hour); lcd_write_data(':'); lcd_2_char(minute); lcd_write_data(':'); lcd_2_char(second); lcd_string(""); } if(zt==6) { if(kg==0) {lcd_locate(1,2); lcd_2_char(hour); lcd_write_data(':'); lcd_2_char(minute); lcd_write_data(':'); lcd_2_char(second); lcd_string(""); lcd_locate(2,1); lcd_string("dingshiON"); lcd_string(""); } if(kg==1) { lcd_locate(1,2); lcd_2_char(hour); lcd_write_data(':'); lcd_2_char(minute); lcd_write_data(':'); lcd_2_char(second); lcd_string(""); lcd_locate(2,1); lcd_string("dingshiOFF"); lcd_string(""); } }}//==============================================================voidnao_do(){if(zt1==0){if(hour==hour_nao1&&minute==minute_nao1)//闹铃1工作di_di();}if(zt2==0){ if(hour==hour_nao2&&minute==minute_nao2)//闹铃2工作di_di();}if(zt3==0){ if(hour==hour_nao3&&minute==minute_nao3)//闹铃3工作di_di();}}//========================================================= voiddinshi_do(){/*channel=1;GetADCResult(channel); //进行某个通道的ADC采样if((ADC_RES*4+ADC_LOW2)>150) jdq=0; else jdq=1; */ doubles3,s4;s3=hour_ding1*60+minute_ding1;s4=hour_ding2*60+minute_ding2;if(s3<s4){if(((hour*60+minute)>s3)&&((hour*60+minute)<s4)){jdq=0; channel=1;GetADCResult(channel); //进行某个通道的ADC采样if((ADC_RES*4+ADC_LOW2)<150) //天色亮则继电器不工作 jdq=1; } elsejdq=1; } if(s3>s4) {if(((hour*60+minute)>s3)||((hour*60+minute)<s4)) {jdq=0; channel=1;GetADCResult(channel); //进行某个通道的ADC采样if((ADC_RES*4+ADC_LOW2)<150) jdq=1; } elsejdq=1; }}//=============================================================voidchuanxing_out(){ h1=hour/10+0x30; h2=hour%10+0x30; m1=minute/10+0x30; m2=minute%10+0x30; s1=second/10+0x30; s2=second%10+0x30;ES=0;//关串口中断TI=1; //串口发送完成标志 TI=0; //允许发送 SBUF=h1; while(!TI);TI=0; SBUF=h2; while(!TI);TI=0; SBUF=':'; while(!TI);TI=0; SBUF=m1; while(!TI);TI=0; SBUF=m2; while(!TI); TI=0; SBUF=':'; while(!TI);TI=0; SBUF=s1; while(!TI);TI=0; SBUF=s2; while(!TI); //TI=0;puts(""); while(!TI);TI=0; delay_ms(500);//延时}//===============================================================================//===========键盘扫描=============================================================voidkey_do()interrupt0{if(k5==0) {delay_ms(10); if(k5==0); zt++; if(zt>6) zt=0; while(!k5); }//---------调整时钟------------------------------------------------------if(zt==0){if(k1==0) //时的加1{delay_ms(10);if(k1==0){di(); hour++;if(hour>23)hour=0;while(!k1);}Init_DS1302(year,month,day,hour,minute,second,week);} //-------------------------------------------------if(k2==0) //分的加1{delay_ms(10);if(k2==0){di(); minute++; if(minute>59){ minute=0; hour++; if(hour>23)hour=0; }while(!k2);}}Init_DS1302(year,month,day,hour,minute,second,week);//--------------------------------------------------if(k3==0) //时的减1{delay_ms(10);if(k3==0){di(); hour--;if(hour>23)hour=23; while(!k3);}Init_DS1302(year,month,day,hour,minute,second,week);}//--------------------------------------------------if(k4==0) //分的减1{delay_ms(10);if(k4==0){di(); minute--;if(minute>59){ minute=59; hour--; if(hour>23)hour=23; }while(!k4);}}Init_DS1302(year,month,day,hour,minute,second,week);}//===========调节闹铃点1====================================================if(zt==1)//闹铃点1的设置{if(k1==0) //时的加1{delay_ms(10);if(k1==0){di(); hour_nao1++; write_add_24c02(4,hour_nao1); delay_ms(1);if(hour_nao1>23){hour_nao1=0; write_add_24c02(4,hour_nao1); delay_ms(1); }while(!k1);}}//---------------------------------------------------------------if(k2==0) //分的加1{delay_ms(10);if(k2==0){di(); minute_nao1++; write_add_24c02(5,minute_nao1); delay_ms(1);if(minute_nao1>59){ minute_nao1=0; write_add_24c02(5,minute_nao1); delay_ms(1); hour_nao1++; write_add_24c02(4,hour_nao1); delay_ms(1); if(hour_nao1>23){hour_nao1=0; write_add_24c02(4,hour_nao1); delay_ms(1); } } while(!k2);}}//-------------------------------------------------------------------- if(k3==0) //分的减1{delay_ms(10);if(k3==0){di(); minute_nao1--; write_add_24c02(5,minute_nao1); delay_ms(1); if(minute_nao1>59) { minute_nao1=59; write_add_24c02(5,minute_nao1); delay_ms(1); hour_nao1--; write_add_24c02(4,hour_nao1); delay_ms(1); if(hour_nao1>23) {hour_nao1=23; write_add_24c02(4,hour_nao1); delay_ms(1); } } while(!k3);} }//--------------------------------------------------if(k4==0) //闹铃点1是否工作{delay_ms(10);if(k4==0){di(); zt1++; if(zt1>1) zt1=0; } while(!k4); }}//============调整闹铃点2===================================================if(zt==2){if(k1==0) //时的加1{delay_ms(10);if(k1==0){di(); hour_nao2++; write_add_24c02(6,hour_nao2); delay_ms(1);if(hour_nao2>23){hour_nao2=0; write_add_24c02(6,hour_nao2); delay_ms(1); }while(!k1);}}//---------------------------------------------------------------if(k2==0) //分的加1{delay_ms(10);if(k2==0){di(); minute_nao2++; write_add_24c02(7,minute_nao2); delay_ms(1);if(minute_nao2>59){ minute_nao2=0; write_add_24c02(7,minute_nao2); delay_ms(1); hour_nao2++; write_add_24c02(6,hour_nao2); delay_ms(1); if(hour_nao2>23){hour_nao2=0; write_add_24c02(6,hour_nao2); delay_ms(1); } } while(!k2);}}//--------------------------------------------------if(k3==0) //分的减1{delay_ms(10);if(k3==0){di(); minute_nao2--; write_add_24c02(7,minute_nao2); delay_ms(1); if(minute_nao2>59) { minute_nao2=59; write_add_24c02(7,minute_nao2); delay_ms(1); hour_nao2--; write_add_24c02(6,hour_nao2); delay_ms(1); if(hour_nao2>23) {hour_nao2=23; write_add_24c02(6,hour_nao2); delay_ms(1); } }} while(!k3); }//--------------------------------------------------------- if(k4==0) //闹铃点2是否工作{delay_ms(10);if(k4==0){di(); zt2++; if(zt2>1) zt2=0; } while(!k4); }}//==========闹铃点3的调整================================================ if(zt==3){if(k1==0) //时的加1{delay_ms(10);if(k1==0){di(); hour_nao3++; write_add_24c02(8,hour_nao3); delay_ms(1);if(hour_nao3>23){hour_nao3=0; write_add_24c02(8,hour_nao3); delay_ms(1); }while(!k1);}}//---------------------------------------------------------------if(k2==0) //分的加1{delay_ms(10);if(k2==0){di(); minute_nao3++; write_add_24c02(9,minute_nao3); delay_ms(1);if(minute_nao3>59){ minute_nao3=0; write_add_24c02(9,minute_nao3); delay_ms(1); hour_nao3++; write_add_24c02(8,hour_nao3); delay_ms(1); if(hour_nao3>23){hour_nao3=0; write_add_24c02(8,hour_nao3); delay_ms(1); } } while(!k2);}} //----------------------------------------------------- if(k3==0) //分的减1{delay_ms(10);if(k3==0){di(); minute_nao3--; write_add_24c02(9,minute_nao3); delay_ms(1); if(minute_nao3>59) { minute_nao3=59; write_add_24c02(9,minute_nao3); delay_ms(1); hour_nao3--; write_add_24c02(8,hour_nao3); delay_ms(1); if(hour_nao3>23) {hour_nao3=23; write_add_24c02(8,hour_nao3); delay_ms(1); } }} while(!k3); }//--------------------------------------------------if(k4==0) //闹铃点3是否工作{delay_ms(10);if(k4==0){di(); zt3++; if(zt3>1) zt3=0; } while(!k4); }} //============调整定时时间================================================== if(zt==4) { if(k1==0) //hour_ding1加1{ delay_ms(10);if(k1==0) hour_ding1++; write_add_24c02(13,hour_ding1); delay_ms(1); if(hour_ding1>23) {hour_ding1=0; write_add_24c02(13,hour_ding1); delay_ms(1); } while(!k1); } if(k2==0) //minute_ding1加1{ di();delay_ms(10);if(k2==0) minute_ding1++; write_add_24c02(14,minute_ding1); delay_ms(1); if(minute_ding1>59) { minute_ding1=0; write_add_24c02(14,minute_ding1); delay_ms(1); hour_ding1++; write_add_24c02(13,hour_ding1); delay_ms(1); if(hour_ding1>23) {hour_ding1=0; write_add_24c02(13,hour_ding1); delay_ms(1); } } while(!k3); } if(k3==0) //hour_ding2加1 {delay_ms(10);if(k3==0) hour_ding2++; write_add_24c02(15,hour_ding2); delay_ms(1); if(hour_ding2>23) {hour_ding2=0; write_add_24c02(15,hour_ding2); delay_ms(1); } whi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论