4 测试与结果分析
4.1 硬件测试
电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造成短路现象。
在本成电子万年历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:
(1)LCD液晶显示屏显示部分已经连在最小系统上,节省了不少时间和精力。 (2)对万年历修改时间或日期时,有时LCD液晶显示屏被屏蔽掉,造成不亮现象。 解决:根据仪器的测试,发现电路的驱动能力不足,最后在DS1302时钟芯片的/CS、SCLK、RET端接入5.1K的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。
4.2 软件测试
电子成年历是多功能的数字型,可以看当前日期,时间。电子成年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中遇到的主要问题是:
烧入程序后,LCD液晶显示屏显示亮度不好。
解决:一遍旋转10K欧的滑动变阻器,一遍观看LCD显示屏,知道看到合适的亮度为止。
4.3 测试结果分析与结论
4.3.1 测试结果分析
1.在测试中遇到LCD液晶显示屏为不显示时,首先使用试测仪对电路进行测试,观察是
否存在漏焊,虚焊,或者元件损坏,滑动变阻器器没有调好:查看烧写的程序是否正确无误,对程序进行认真修改。 4.3.2 测试结论
经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。同时在软件的编程方面得到更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。
5 Proteus软件仿真
5.1Proteus 仿真电路图
LCD1LGM12641BS1RC6x11nFP17P16P15P14P13P12P11P101817161514131211109E8RW7DI6543CS22CS11-VoutRSTDB7DB6DB5DB4DB3DB2DB1DB0ER/WDIV0VCCGNDCS2CS1+5VX2CRYSTALx2U1X119X218XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617erwdiP27+5VU3321VCCDQGNDDS18B2012.0C71nFXTAL2rstBU1+5VrstR110kRST9RSTU281VCC1X1VCC22BUTTONC822uF293031PSENALEEA576P26p27CS1CS2P32P33P34X1RSTSCLKI/ODS130232768HzX23+5VP10P11P12P13P14P15P16P1712345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51D4LED-YELLOWD2BU2P26BUTTONBU3LED-GREEND3p32BUTTONLED-REDBU4p33BUTTONBU5p34BUTTON 图7 Proteus仿真电路图
5.2仿真结果
运行后LED显示:
LCD1LGM12641BS1R-VoutRSTDB7DB6DB5DB4DB3DB2DB1DB0ER/WDIV0VCCGNDCS2CS1
6课程设计总结与体会
制作这次课程设计一切都是从零开始,从最简单的画流程图起步,这次课程设计可以圆满完成,跟单片机课程里面的课外作业是离不开的。这次课程设计从开始到制作成功前后超过了一个星期。当电子万年历可以成功实现时,那种激动和喜悦只有自己可以体会。
P17P16P15P14P13P12P11P101817161514131211109E8RW7DI6543CS22CS11
在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了设计,达到了预期的目的,完了最初的设想。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同学讨论,理清了思路,反而得心应手。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我的耐心,做什么事都在有耐心。此次课程设计中学到了很多很多东西,这是最重要的。总之,此次课设使我的能力得到了全方位的提高,使得我的操作能力和专业技能都有了很大的提高。
在做课程设计的日子里得到了张宏伟老师的悉心指导和同学的帮助,在此向他们致以诚挚的谢意。感谢提供相关技术帮助的老师和同学,你们的支持和鼓励使我对这次的设计完成有了信心和动力,我在此深表谢意。
参考文献
[1]刘勇 编 数字电路 电子工业出版社 2004
[2]陈正振 编 电子电路设计与制作 广西交通职业技术学院信息工程系 2007 [3]杨子文 编 单片机原理及应用 西安电子科技大学出版社 2006 [4]王法能 编 单片机原理及应用 科学出版社 2004
附录
系统程序
#include
sbit KEY=P2^6; //定义日期和时间转换按键 sbit KEY1=P3^2; sbit KEY2=P3^3; sbit KEY3=P3^4; sbit KEY4=P3^5; void delay10(void) { unsigned char i,j; for(i=0;i<255;i++) for(j=0;j<200;j++); }
unsigned char conver(unsigned char a,unsigned char b,unsigned char c)
{ if((a&0x0f)==0x0a) a=a+6; if(a==b) a=c; return a; }
main() { bit flag_1=1; bit flag_2=1; bit flag_3=1; bit flag_4=1; char a; unsigned char j[8],choose=0x01; init_serialcomm();//初始化串行口 LCD_initial(); //初始化LCD LCD_prints(\ C\ //显示\ C\ while(1) {
send_char_com(0x31); a=Read_Temperature(); //读取DS18B20的温度 LCD_set_position(0xc); //定位LCD到指定位置 if(a<0) //处理温度正负 { a = (-1)*a; // 取补 LCD_printc(0x2D); } else { LCD_printc(0x2B); } LCD_printc(a/10+0x30); //显示温度高位 LCD_printc(a+0x30); //显示温度低位 LCD_set_position(0x40); if(KEY==0) //按键--处理时间和日期的轮换 { delay10(); if(KEY==1) delay10(); flag_1=~flag_1; } if(KEY1==0) //按键1--处理设定时间和返回 { delay10(); if(KEY1==1)
delay10(); flag_2=~flag_2; }
if(KEY2==0) //按键2--处理选择设定时间 { delay10(); if(KEY2==1) delay10(); choose++; if(choose==8) choose=0x01; }
if(KEY3==0) //按键3--处理设定时间和返回 { delay10(); if(KEY3==1) delay10(); switch(choose) { case 1: j[6]++; j[6]=conver(j[6],0xa0,0x00);break;//年 case 2: j[5]++; j[5]=conver(j[5],0x07,0x00);break;//周 case 3: j[4]++; j[4]=conver(j[4],0x13,0x01);break;//月 case 4: j[3]++; j[3]=conver(j[3],0x32,0x01);break;//日 case 5: j[2]++; j[2]=conver(j[2],0x24,0x00);break;//时 case 6: j[1]++; j[1]=conver(j[1],0x60,0x00);break;//分 case 7: j[0]++; j[0]=conver(j[0],0x60,0x00);break;//秒 } }
if(flag_2==1) read_serial(j); //读取DS1302的时间 else
write_date_time(j); if(flag_1==1) { LCD_prints(\ LCD_printc((j[2]>>4&0x07)+0x30); //时 LCD_printc((j[2]&0x0f)+0x30); LCD_printc(0x3A); //\号 LCD_printc((j[1]>>4&0x07)+0x30); //分 LCD_printc((j[1]&0x0f)+0x30); LCD_printc(0x3A); //\号 LCD_printc((j[0]>>4&0x07)+0x30); //秒 LCD_printc((j[0]&0x0f)+0x30); LCD_printc(0x20); //空格 LCD_printc(0x20); //空格