ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:76.91KB ,
资源ID:19292953      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19292953.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机万年历实训Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机万年历实训Word格式文档下载.docx

1、 0; code char string_year= Setting year ? code char string_month= Setting month ? code char string_mday= Setting day ? code char string_week= Setting week ? code char string_hour= Setting hour ? code char string_minute=Setting minute? code char string_second=Setting second?/年月日时分秒的定义struct DATA_TIME

2、 short year; /待选 char month; char mday ; char week ; char hour ; char minute; char second;time;struct time_char /time的字符型 char ch_year4; char ch_month2; char ch_mday2; char ch_week1; char ch_hour2; char ch_minute2; char ch_second2;time_ch;/*子函数*/LCD的延时程序void LCD_delay(void) char i,j; for(i=100;i=0;i

3、-)for(j=0;j20;j+);/向LCD写指令函数void wcmd(char cmd ) RS=0; RW=0; E=1; LCD_delay(); PORT=cmd; E=0;/向LCD写数据函数void wdata(char DATA) RS=1; PORT=DATA;/写字符串void wstring(char *pt,char i)/ i为字符的个数,不带0 char j; for(j=0;i;j+) wdata(ptj); /时间数据的格式转换void tran_2_ch(char *pt,char DATA) pt0=DATA/10+0x30; pt1=DATA-pt0*1

4、0+0x10;void tran_4_ch(char *pt,int DATA) pt0=DATA/1000; pt1=DATA/100-pt0*10; pt2=DATA/10-pt0*100-pt1*10; pt3=DATA-pt0*1000-pt1*100-pt2*10; pt0+=0x30; pt1+=0x30; pt2+=0x30; pt3+=0x30;/格式转换的实现void tran_ch(void) tran_4_ch(time_ch.ch_year ,time.year ); tran_2_ch(time_ch.ch_month,time.month); tran_2_ch(t

5、ime_ch.ch_mday ,time.mday ); /tran_2_ch(time_ch.ch_week ,time.week*10+1); time_ch.ch_week0=time.week+0x30; tran_2_ch(time_ch.ch_hour ,time.hour ); tran_2_ch(time_ch.ch_minute,time.minute); tran_2_ch(time_ch.ch_second,time.second);/是否是闰年char leep_year(int year)/如果是闰年则flag_year_leep=1,否则=0 if(year%400

6、=0)|year%4=0&year%100!=0)return 1; else return 0;/星期的判断void de_week(void) int i,j,day=0; char mweek; for(i=2000;i=30) if(time.month=1|time.month=3|time.month=5|time.month=7 |time.month=8|time.month=10|time.month=12) /天数为31天的月,1、3、5、7、8、10、12 if(time.mday=32) time.mday=1;time.month+; if(time.month=4|

7、time.month=6|time.month=9|time.month=11) if(time.month=31) tran_ch(); if(time.month=2&time.mday=28)(time.mday=30) time.mday=1;(time.mday=29) if(time.month=13) time.month=1;time.year+;tran_ch();/年的进位/时间的进位void time_carry(void) if(time.second=60) time.minute+;time.second=0; if(time.minute=60) time.hou

8、r+ ;time.minute=0; if(time.hour =24) time.mday+ ;time.hour=0 ;time_carry_mon_year();de_week();/屏幕的显示函数void dsp(void) if(flag_en_key=0)/非设置模式下的显示 wcmd(0x02);/return cursor wstring(time_ch.ch_hour,2); wdata(:); wstring(time_ch.ch_minute,2); wstring(time_ch.ch_second,2); wstring( ,3); wcmd(0x80+0x40);

9、wstring(time_ch.ch_year,4);- wstring(time_ch.ch_month,2); wstring(time_ch.ch_mday,2); W,2); wdata(time_ch.ch_week0); if(flag_en_key=1)/设置模式下的显示 if(flag_set2)/显示字符串string_ void dsp_string(char *pt) char i=0;/将光标调整至第二行 while(pti) wdata(pti); i+;/退出按键模式void exit_key(void) char i; flag_en_key=0; flag_en

10、_ok=0; flag_ok=0; flag_mean=0; flag_set=0; /清除所有标记 for(i=0;=16;0/按键的处理子函数(由外中断调用)int solve_key(void) /if(key_mean=0); if(key_ok=0)/确定或退出 if(flag_ok) exit_key(); time_carry_mon_year(); de_week(); return 0; else flag_ok=1; if(key_set =0) if(flag_ok=0)/时分秒的选择 flag_set+; if(flag_set=6)flag_set=0; switch

11、(flag_set)dsp_string(string_year);dsp_string(string_month);dsp_string(string_mday);dsp_string(string_hour);dsp_string(string_minute);dsp_string(string_second); if(flag_ok=1)/时分秒的设置time.year+ ;if(time.year=10000)time.year=2000;time.month+ ;time.mday+ ;time.hour+ ;if(time.hour=24)time.hour=0;time.minu

12、te+;if(time.minute=60)time.minute=0;time.second+;if(time.second=60)time.second=0; if(flag_ok=1)/是否更改数据 是显示 OK 否显示 ? wcmd(0x80+0x4e);OK else? return 0;/MCU的秒中断函数与显示函数的执行void INT_sec() interrupt 1 using 0 if(flag_sec=20)/flag_sec=20代表1s flag_sec=0; TH0=0x3c; TL0=0xb0+10;/定时器再次进入0.05s的中断 /加10是为了抵消中断与前两

13、个指令消耗的时间(不精确) time.second+;/去掉key_ok的特殊优先权 time_carry(); dsp(); flag_sec+; TH0=0X3C; TL0=0XB0+10;/定时器再次进入0.05s的中断/外中断0,键盘中断 INT_X0(void) interrupt 0 using 0 /去抖 TR0=0;/关闭定时计数器0 if(key_mean=0) flag_en_ok=1; dsp_string(string_year); if(flag_en_ok&key_ok=0) flag_en_key=1;flag_en_ok=0; if(flag_en_key=1)

14、 solve_key(); TR0=1;/启动定时计数器0/LCD 的初始化void init(void)/确定E在初始化时为0 wcmd(0x01); wcmd(0x06); wcmd(0x0c); wcmd(0x38);/*main函数*/int main() /单片机的初始化 EA=1; ET0=1;/定时计数器0的使能 EX0=1;/外中断0的使能 IT0=1;/下降沿触发中断 IP=0x02;/定时计数器0的中断优先级最高 TMOD=0x01;/定时计数器0为工作模式1 TL0=0xb0;/定时计数器参数为0x3cb0,0xffff-0x3cb0=50000,一个中断中期为0.05s/MCU初始化后直接启动定时计数器0 time.year=2000;/数据的初始化 time.month=1; time.mday=1; time.week=6; time.hour=0; time.minute=0; time.second=0; init(); /LCD 初始化 while(1);/单片机等待中断

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1