电路、显示电路、时钟电路、晶振电路、复位电路及电源指示电路。
仿真正确显示了时间,在LCD1602中正确显示了当前日期、时间,通过按按键K1,就可以开始设置时间,依次按K1依次在年、月、日、时、分之间切换,,按K2键用于加1操作,K3键用于减1操作,K4是确定按钮。仿真正确显示了时间和日期,符合设计的要求。
图(13) 电子万年历硬件电路图
结论与心得:
在这学期的课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在课程序设计里,我们学会了很多学习的方法,知道了理论和实践的巨大差别。而这是以后最实用的,真的是受益匪浅。要面 对
11 / 23
社会的挑战,只有不断的学习、实践,再学习、再实践。同时在与老师和同学的交流过程中,互动学习,将知识融会贯通。通过自己的努力,做出了一个万年历,对以后的学习是一个莫大的鼓舞,激起了我的学习兴趣和开发创新思维。
参考文献
图书类:[1] 张毅坤 陈善久, 单片微型计算机原理及应用 西安电子科技大学出版社
[2] 张毅刚,,彭喜元,单片机原理与应用设计 电子工业出版社 [3] 赵建领 薛园园 ,零基础学单片机C语言程序设计 机械工业出版社 [4] 周向红 51单片机课程设计 华中科技大学出版社,
[5] 郭天祥 51单片机C语言教程-入门,提高,开发,拓展全攻略, 电子工业出版社 [6] 赵亮 侯国锐. 单片机C语言编程与实例 人民邮电出版社
附实验源程序: #include
sbit IO= P1^0; //DS1302数据线 sbit SCLK = P1^1; sbit RST = P1^2;
sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2;
//DS130时钟线 //DS1302复位线
//LCD数据/命令选择端 //LCD读/写控制 //LCD使能端
12 / 23
sbit K1=P3^4; sbit K2=P3^5; sbit K3=P3^6;
//选择 //加 //减
sbit K4=P3^7; //确定
uchar tCount=0;
uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; uchar *WEEK[]={%uchar LCD_DSY_BUFFER1[]={\显示格式 uchar LCD_DSY_BUFFER2[]={%uchar DateTime[7]; //所读取的日期时间
char Adjust_Index=-1; //当前调节的时间对象:,,分,是,日,月,年
(1,2,3,4,6)
uchar Change_Flag[]= \ //(分,时,日,月,年)(不调节秒
与周)
/*---------延时程序------------------*/ void DelayMS(uint ms) {
uchar i;
while(ms--){for(i=0;i<120;i++);} }
//-----------向DS1302写入一字节------------------// void Write_A_Byte_TO_DS1302(uchar x) { uchar i;
for(i=0;i<8;i++){
IO=x&0x01; //每一位与1与存入IO中
13 / 23
} }
SCLK=1;SCLK=0; x>>=1;
//一个高脉冲将数据送入液晶控制器
// 右移
//-----------从DS1302读取一字节------------------// uchar Get_A_Byte_FROM_DS1302() { uchar i,b=0x00; for(i=0;i<8;i++){ }
return b/16*10+b; //返回BCD码 }
//-----------从DS1302指定位置读数据------------------// uchar Read_Data(uchar addr) {
uchar dat;
RST = 0;SCLK=0;RST=1;
//RST高电平时读/写
b |= _crol_((uchar)IO,i); SCLK=1;SCLK=0;
//每一个高脉冲读取一位数据
Write_A_Byte_TO_DS1302(addr); //先写入地址
dat = Get_A_Byte_FROM_DS1302();
SCLK=1;RST=0;
return dat; }
//---------向DS1302某地址写入数据--------------------// void Write_DS1302(uchar addr,uchar dat) { SCLK=0;RST=1;
14 / 23
Write_A_Byte_TO_DS1302(addr); Write_A_Byte_TO_DS1302(dat); SCLK=0;RST=0; }
//--------------设置时间----------------// void SET_DS1302() { uchar i;
//写控制字,取消写保护 Write_DS1302(0x8E,0x00); //分时日月年依次写入 for(i=1;i<7;i++)
{ //分的起始地址10000010(0x82),后面依次是时,日,月,周,年,写
入地址每次递增2
}
Write_DS1302(0x8E,0x80); //加保护 }
//----------读取当前日期时间------------// void GetTime() {uchar i;
for(i=0;i<7;i++){ DateTime[i]=Read_Data(0X81+2*i);} }
//-----------读LCD状态------------------// uchar Read_LCD_State() { uchar state; RS=0;RW=1;EN=1;
//高脉冲写入数据
Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]));
//输出:D0~D7=状态字
15 / 23