1、单片机数字时钟课程设计报告XXXX大学课程设计报告课程设计名称:多功能数字时钟 学院:信息科学与工程学院姓名: 班级:09通1班 学号:指导老师: 时间:2012.2.203.11“多功能数字时钟”设计要求一、基于DS1302二、能调时间(日期、星期、时、分)三、有三个以上闹铃点,并可以分别设置是否起作用;四、有一个定时开关,在一个可以设定的时间段内能保持驱动继电器控制输出;五、所有人工设置的数据应能断电保存,人机界面友好、按键可靠;六、能通过串行口把当前的时间信息输出七、可以结合天色的亮暗,决定定时继电器是否输出;八、显示当前时间的同时显示当前温度;九、可以使用红外遥控器设置各种参数;十、可
2、以使用串行口设置各种参数;备注:要求实现前面七项,后三点为扩展功能。芯片STC89C51RC与STC12C5A32S2芯片型号RAM(字节)ROM(字节)工作频率(Hz)两者比较STC89C52RC5128K040M最高可达48M相同点:都是低电平驱动;不同点:12C5A功能更强大,对驱动的要求更低。(详细参考资料)STC12C5A32S2128032K035M(相当于普通8051的0420M)各模块使用注意事项简介基础操作模块 要求花样灯能够结合按键灵活控制灯的亮灭形式液晶显示包含头文件;P2.6、P2.7与液晶模块连接;使用时须初始化、清屏;注意显示时的覆盖技巧。定义与1602LCD的数据
3、口的单片机口线P0口。数码管共阳接法;低电平点亮;掌握循环显示各种数值,通过多次扫描稳定显示。串行通信初始化,设置波特率。注意换行puts函数的使用技巧。多位数发送。24C02掌握read 与write函数的使用格式。根据需要进行相应异常处理。包含头文件.定义24C02的数据线与单片机的连接P2.2与P2.3。ADC采样P1口8路采样。第0路(P1.0)抽头可变电阻,第1路(P1.1)接光敏电阻。PWMP1.3、P1.4输出脉冲DS1302初始化合理的值。主要芯片简介:24C02与DS130224C02DS1302串行E2PROM是基于I2C-BUS 的存储器件;数据掉电不丢失;擦写寿命:10
4、0万次 数据保持时间:100年容量:2K,256字节高性能、低功耗、带RAM的实时时钟电路;可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能;DS1302 存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。设计思想:模块化设计设计思路:NO.1显示模块年月日星期的显示时分秒的显示闹铃点的显示定时段的显示NO.2调节模块年月日星期的调整时分的调整闹铃点的调整定时段的调整NO.3定时模块在时间段内启动继电器,进行ADC采样(根据天色亮暗决定继电器是否工作)NO.4串行输出块将时间通过串口发送,在串口助手显示当前的时间。NO.5按键扫描模块(最重要的模块)各种按键复用,状态变
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#include#inclu
6、de#include#include#include sbit beep=P20;sbit jdq=P21; /继电器sbit k1=P13;sbit k2=P14;sbit k3=P15;sbit k4=P16;sbit k5=P17;unsigned char zt=0,zt1=1,zt2=1,zt3=1,channel,kg=1; unsigned char hour_nao1=10, hour_nao2=12,hour_nao3=12;unsigned char minute_nao1=58,minute_nao2=12,minute_nao3=12;unsigned char hou
7、r_ding1=11,hour_ding2=11,minute_ding1=11,minute_ding2=30;unsigned char h1,h2,m1,m2,s1,s2;void delay_ms(unsigned int xms);void di_di();void di();void disp();void nao_do();void dinshi_do();void chuanxing_out();void key_do(); void main() hour_nao1=read_add_24c02(4);minute_nao1=read_add_24c02(5); /24C02
8、读取 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_nao123)hour_nao1=0;if(hour_nao223)hour_nao2=0
9、;if(hour_nao323)hour_nao3=0; /异常处理 24C02 if(minute_nao159)minute_nao1=0; if(minute_nao259)minute_nao2=0;if(minute_nao359)minute_nao3=0; if(hour_ding123)hour_ding1=0;if(hour_ding223)hour_ding2=0; if(minute_ding159)minute_ding1=0;if(minute_ding259)minute_ding2=0; /- lcd_int(); /16c02初始化 lcd_write_com(
10、0x01); /- InitADC(); /初始化ADC采样 /- get_ds1302();/获取时间 if (year15) / 异常处理 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; /设置初始值,以设波特率为9600 TR1=1; /启动定时器1 SM0=0;SM1=1; /SCON寄存器设置串行口工作方式1:一帧10位、1起始位8数据位1
11、停止位 EA=1; /允许总中断 ES=1; /串行中断允许 REN=1; /允许串口接收 /- while(1) get_ds1302();/获取时间 disp(); /根据zt的值显示相应的信息 nao_do(); /闹铃的判断处理 if(kg=0) dinshi_do(); /定时判断处理(包含天色判断),嘎嘎,把采样放别处进行吧。 chuanxing_out();/串行输出信息 /key_do();按键判断处理-用外部中断完成 /保存数据-在数据改变后马上保存 void disp() if (zt=0) /正常走时显示 lcd_locate(1,2); /1602LCD显示定位在第1行
12、第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_da
13、ta(:); 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
14、); /显示小时 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
15、_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 ); /-闹铃点
16、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);
17、 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(hou
18、r_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_locat
19、e(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
20、); lcd_string( ); lcd_locate(2,1); lcd_string(dingshi ON ); 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(dingshi OFF ); lcd_string( ); /=void nao_do() if(zt1=0) if(h
21、our=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(); /= void dinshi_do() /*channel=1; GetADCResult(channel); /进行某个通道的ADC采样 if(ADC_RES*4+ADC_LOW2)150) jdq=0; else jdq=1; */
22、double s3,s4; s3=hour_ding1*60+minute_ding1; s4=hour_ding2*60+minute_ding2; if(s3s3)&(hour*60+minute)s4 ) jdq=0; channel=1; GetADCResult(channel); /进行某个通道的ADC采样 if(ADC_RES*4+ADC_LOW2)s4) if(hour*60+minute)s3)|(hour*60+minute)s4 ) jdq=0; channel=1; GetADCResult(channel); /进行某个通道的ADC采样 if(ADC_RES*4+AD
23、C_LOW2)150) jdq=1; else jdq=1; /=void chuanxing_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);/延时 /=/=键盘扫描=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1