2022年单片机程序 .pdf

上传人:C****o 文档编号:33679107 上传时间:2022-08-12 格式:PDF 页数:12 大小:91.64KB
返回 下载 相关 举报
2022年单片机程序 .pdf_第1页
第1页 / 共12页
2022年单片机程序 .pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《2022年单片机程序 .pdf》由会员分享,可在线阅读,更多相关《2022年单片机程序 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、/=日历时钟/=/日历时钟/按 K1,进入设置状态/按 k2,停止闹钟声音/按 k3,依次进入闹钟功能是否启用,闹钟时 ,分秒 ,年,月,日及时间时 ,分,秒的设置 ,直到退出设置状态/按 k4,调整是否起用闹钟和调节闹钟时,分,秒,年,月 ,日,时间的时 ,分,秒的数字/LCD 第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能(可在调整状态进行设置)/正常状态 ,LCD 上排最前面显示自定义字符,LCD 下排最前面闪动willar/设置状态 ,LCD 上排最前面显示P,下排最前面在设置闹钟时间时显示alarm:, 其它状态显示time/年代变化2000-2099,星期自动转换/程序中

2、有自定义字符写入#include #include unsigned char code dis_week=SUN,MON,TUE,WED,THU,FRI,SAT;unsigned char code para_month13=0,0,3,3,6,1,4,6,2,5,0,3,5;/星期月参变数unsigned char datadis_buf116;/lcd 上排显示缓冲区unsigned char datadis_buf216;/lcd 下排显示缓冲区unsigned char datayear,month,date,week;/年、月、日、星期unsigned char dataarmho

3、ur,armmin,armsec;/ 闹钟时、分、秒unsigned char datahour,min,sec,sec100;/时、分、秒、百分之一秒unsigned char dataflag,vkey,skey;/ 设置状态计数标志、按键先前值、按键当前值bitalarm;/标识是否启用闹钟,1-启用, 0-关闭sbitrs = P20;/LCD 数据 /命令选择端 (H/L)sbitrw = P21;/LCD 读/写选择端 (H/L)sbitep = P22;/LCD 使能控制sbit PRE = P16;/调整键 (k3)sbit SET = P17;/调整键 (k4)sbit SP

4、K = P37;void delayms(unsigned char ms); /延时程序bitlcd_busy();/测试 LCD 忙碌状态程序void lcd_wcmd(char cmd);/写入指令到LCD 程序void lcd_wdat(char dat);/写入数据到LCD 程序void lcd_pos(char pos);/LCD 数据指针位置程序void lcd_init();/LCD 初始化设定程序void pro_timedate();/时间日期处理程序void pro_display();/显示处理程序void pro_key();/按键处理程序名师资料总结 - - -精品

5、资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - void time_alarm();/定时报警功能 (闹钟 )unsigned char scan_key();/按键扫描程序unsigned char week_proc();/星期自动计算与显示函数bit leap_year();/判断是否为闰年void lcd_sef_chr();/LCD 自定义字符程序voidupdate_disbuf(unsignedchar t1,unsignedchar t2

6、,unsignedchar dis_h,unsignedchardis_m,unsigned char dis_s);/更新显示缓冲区函数/ 延时程序void delay(unsigned char ms)while(ms-)unsigned char i;for(i = 0; i 250; i+)_nop_();/执行一条 _nop_()指令为一个机器周期_nop_();_nop_();_nop_();/测试 LCD 忙碌状态bit lcd_busy()bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result

7、 =(bit)(P0&0 x80);/LCD 的 D0-D7 中,D7=1 为忙碌 ,D7=0 为空闲ep = 0;return result;/写入指令到LCDvoid lcd_wcmd(char cmd)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - while(lcd_busy();/当 lcd_busy 为 1 时,再次检测LCD 忙碌状态 ,lcd-busy 为 0 时,开始写指令rs = 0;rw = 0;ep =

8、 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;/写入数据到LCDvoid lcd_wdat(char dat)while(lcd_busy();/当 lcd_busy 为 1 时,再次检测LCD 忙碌状态 ,lcd-busy 为 0 时,开始写数据rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();

9、_nop_();ep = 0;/LCD 数据指针位置程序void lcd_pos(char pos)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - lcd_wcmd(pos|0 x80);/数据指针 =80+地址码 (00H27H,40H67H)/设定二个自定义字符,(注意: LCD1602 中自定义字符的地址为0 x00-0 x07, 即可定义8 个字符)/这里我们设定把一个自定义字符放在0 x00 位置( 000),另一个

10、放在0 x01 位子( 001)void lcd_sef_chr()/第一个自定义字符lcd_wcmd(0 x40);/01 000 000第 1 行地址(D7D6 为地址设定命令形式D5D4D3为字符存放位置(0-7),D2D1D0 为字符行地址 (0-7) )lcd_wdat(0 x1f);/XXX11111第 1 行数据( D7D6D5 为 XXX ,表示为任意数(一般用 000) ,D4D3D2D1D0为字符行数据 (1-点亮, 0-熄灭)lcd_wcmd(0 x41);/01 000 001第 2 行地址lcd_wdat(0 x11);/XXX10001第 2 行数据lcd_wcmd

11、(0 x42);/01 000 010第 3 行地址lcd_wdat(0 x15);/XXX10101第 3 行数据lcd_wcmd(0 x43);/01 000 011第 4 行地址lcd_wdat(0 x11);/XXX10001第 4 行数据lcd_wcmd(0 x44);/01 000 100第 5 行地址lcd_wdat(0 x1f);/XXX11111第 5 行数据lcd_wcmd(0 x45);/01 000 101第 6 行地址lcd_wdat(0 x0a);/XXX01010第 6 行数据lcd_wcmd(0 x46);/01 000 110第 7 行地址lcd_wdat(0

12、 x1f);/XXX11111第 7 行数据lcd_wcmd(0 x47);/01 000 111第 8 行地址lcd_wdat(0 x00);/XXX00000第 8 行数据/第二个自定义字符lcd_wcmd(0 x48);/01 001 000第 1 行地址lcd_wdat(0 x01);/XXX00001第 1 行数据lcd_wcmd(0 x49);/01 001 001第 2 行地址lcd_wdat(0 x1b);/XXX11011第 2 行数据lcd_wcmd(0 x4a);/01 001 010第 3 行地址lcd_wdat(0 x1d);/XXX11101第 3 行数据lcd_w

13、cmd(0 x4b);/01 001 011第 4 行地址lcd_wdat(0 x19);/XXX11001第 4 行数据lcd_wcmd(0 x4c);/01 001 100第 5 行地址lcd_wdat(0 x1d);/XXX11101第 5 行数据lcd_wcmd(0 x4d);/01 001 101第 6 行地址lcd_wdat(0 x1b);/XXX11011第 6 行数据lcd_wcmd(0 x4e);/01 001 110第 7 行地址lcd_wdat(0 x01);/XXX00001第 7 行数据lcd_wcmd(0 x4f);/01 001 111第 8 行地址lcd_wda

14、t(0 x00);/XXX00000第 8 行数据名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - /LCD 初始化设定void lcd_init()lcd_wcmd(0 x38);/设置 LCD 为 16X2 显示 ,5X7 点阵 ,八位数据借口delay(1);lcd_wcmd(0 x0c);/LCD 开显示及光标设置(光标不闪烁 ,不显示 -)delay(1);lcd_wcmd(0 x06);/LCD 显示光标移动设置(光

15、标地址指针加1,整屏显示不移动)delay(1);lcd_wcmd(0 x01);/清除 LCD 的显示内容delay(1);/闰年的计算bit leap_year()bit leap;if(year%4=0&year%100!=0)|year%400=0)/闰年的条件leap=1;elseleap=0;return leap;/星期的自动运算和处理unsigned char week_proc()unsigned char num_leap;unsigned char c;num_leap=year/4-year/100+year/400;/ 自 00 年起到 year 所经历的闰年数if(

16、 leap_year()& month 59)sec = 0;min+;if(min59)min=0;hour+;if(hour23)hour=0;date+;if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)if (date31) date=1;month+;/大月 31 天if (month=4|month=6|month=9|month=11)if (date30) date=1;month+;/小月 30 天if (month=2)if( leap_year()/闰年的条件if (date29) date=1;mo

17、nth+;/闰年 2 月为 29 天elseif (date28) date=1;month+;/ 平 年 2 月 为 28 天if (month12) month=1;year+;if (year99) year=0;week_proc();if (sec=armsec& min=armmin & hour=armhour)if (alarm)TR1=1;/闹钟启用时,报警时间到,启动 Timer1/显示处理程序void pro_display()unsigned char i;lcd_pos(0 x00);for (i=0;i=15;i+)lcd_wdat(dis_buf1i);lcd_p

18、os(0 x40);for (i=0;i= 100)/1 秒时间(100*10ms=1000ms=1s)sec100 = 0;pro_timedate();/ 调用时间和日期处理程序if (sec&0 x01)/willar 闪一秒,停一秒update_disbuf(0 x00,hour,min,sec);/0 x00 表示显示 00 位置的自定义字符elseupdate_disbuf(0 x00,willar,hour,min,sec);pro_display();/调用显示处理函数/按键扫描程序unsigned charscan_key()skey=0 x00;/给变量 vkey 置初值s

19、key|=PRE;/读取 PRE 键的状态skey=skey23) armhour=0;update_disbuf(0 x50,alarm:,armhour,armmin,armsec);/更新显示数据pro_display();/调用显示处理lcd_pos(0 x49);break;/ 光 标 回 到 原 调整位置case2:armmin+;if (armmin59) armmin=0;update_disbuf(0 x50,alarm:,armhour,armmin,armsec);pro_display();lcd_pos(0 x4c);break;case3:armsec+;if (a

20、rmsec59) armsec=0;update_disbuf(0 x50,alarm:,armhour,armmin,armsec);pro_display();lcd_pos(0 x4f);break;case4:year+;if(year 99) year= 0;week_proc();/星期自动运算update_disbuf(0 x50,time: ,hour,min,sec);pro_display();lcd_pos(0 x05);break;case5:month+;if (month12) month=1;week_proc();/星期自动运算update_disbuf(0 x

21、50,time: ,hour,min,sec);pro_display();lcd_pos(0 x08);break;case6:date+;if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)if (date31) date=1;/大月 31 天if (month=4|month=6|month=9|month=11)if (date30) date=1;/小月 30 天if (month=2)if(leap_year()/闰年的条件if (date29) date=1;/闰年 2 月为 29 天名师资料总结 - - -精

22、品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - elseif (date28) date=1;/平年 2 月为 28 天week_proc();/星期自动运算update_disbuf(0 x50,time: ,hour,min,sec);pro_display();lcd_pos(0 x0b);break;case7:hour+;if (hour23) hour=0;update_disbuf(0 x50,time: ,hour,min,sec);

23、pro_display();lcd_pos(0 x49);break;case8:min+;if (min59) min=0;update_disbuf(0 x50,time: ,hour,min,sec);pro_display();lcd_pos(0 x4c);break;case9:sec+;if (sec59) sec=0;update_disbuf(0 x50,time: ,hour,min,sec);pro_display();lcd_pos(0 x4f);break;default: break;/Timer1 中断处理程序 ,产生报警的声音void timer1() interrupt 3TH1=0 xff;TL1=0 x00;SPK=SPK;/外部中断INT1 中断处理程序 ,停止报警声音void int1() interrupt 2if(TR1)TR1=0;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁