(1)、修改显示缓冲区内容,屏蔽拆字程序,调试动态扫描显示功能。例如将DISP0~DISP5单元置为“012345”,应能在LCD上从左到右显示“012345”。若显示不正确,可在中断子程序相应位置设置断点调试检查。然后修改计时缓冲区内容,调用拆字程序,调试显示模块。
(2)、运行主程序调试模块,不按下任何键,检查是否能开始正确显示。若不能正确显示,则应在定时器中断服务子程序中设置断点,检查HOUR、MIN、SEC单元是否随断点运行而变化。然后屏蔽缓冲区初始化部分,用仿真器修改万年历显示缓冲区内容为2013年5月27日09时52分00秒,运行主程序(调进位键),检验能否正确进位,以及试调时间看能否正确的进位,以及温度显示。
(3)、调试键盘扫描模块,先用延时5ms子程序代替显示子程序延时消抖,在求取键号后设置断点,中断后观察A累加器中的键号是否正确;然后恢复用显示子程序延时消抖,检验与显示模块能否正确连接。
(4)、调试时间设置模块。首先屏蔽COMB子程序,单独调试键盘设置模块,观察显示缓冲区DISP0~DISP5单元的内容是否随键入的键号改变,以及键号能否在LCD上显示。然后屏蔽子程序,单独调试合字模块。
(5)、运行主程序联调,检查能否用键盘修改当前万年历,时间,以及温度能否正确显示。
5.1 PCB板
5.2 样机调试
设计原理图→定义元件封装→PCB基本图纸设置→生成网络表和加载网络表→元件布局→布线规则设置→手动或自动布线→编译
5.3 样机功能
通过LCD1602显示出日历、年、月、日、时、分、秒,且时间不停的在运行,还显示出温度,通过按键的按键不同LCD显示也不同。
5.4 发挥部分测试结果
5.5 小结
通过本次画板PCB让我了解基本的pcb画法的步骤、不仅仅要提前阅读相关设计所需要的元件资料,还要非常的了解,因为在编写程序是要用到芯片的资料。在PCB时也要知道他的外围的体型、边框的长度和宽、高。设计时要要考虑的他的可行性、以及他的美观。他的大小。要尽量的小。布线的宽度要适宜。
6. 结论
这次的实验对从我们来说很兴庆,从这次的实验中,让我们更加了解和掌握单片机结构以及液晶内部的结构,提高我们编程的能力,理解软件对硬件的控制以及硬件对软件的制约。本次设计的重点在于定时中断的合理使用,各相互独立的程序通过有机的组合,来完成所需功能则是本次设计的精妙之所在,也正是因为此,深刻领悟到“实践出真知”这句俗语。其实有好多的知识需要在一步一步的实际动手当中慢慢地体会,慢慢地学习。不能只是想当然怎样就会怎样,还要靠自己亲手去验证它才行在设计的过程中还是会学到不少东西,但是经过这次实验使我对它们有了一定的了解。经过这一次实验我们认识到实验是一门能够提高个人动手能力的一门课程,同时也帮助了我们,怎么样把书本上理论的知识应用到实践中去。
通过这次的锻炼,我们不仅动手能力得到了加强,更重要的是学到了很多新的专业技能知识,经验也更加丰富了。我觉得我还有很多不足的地方,如:基本知识掌握不牢固、动手能力不强、知识面不够宽。我争取在以后的学习当中弥补它,不断的完善自己。虽然期间我们遇到了不少的难题,但是经过努力,再大的困难也被我们给一一的解决了。
本实验还有很多做的不够好的地方,还望老师批评指正。
参考文献
中文书:
[1]郭天祥 新概念51单片机C语言教程.入门、提高、开发, 电子工业出版社 2012
中文文献
[2]百度文库中:DS1302中文数据手册 DS18B20中文数据手册 LCD1602中文数据手册
附录
DS1302的部分程序
/***************************************************** 函数功能:向1302写一个字节数据 入口参数:x
***************************************************/ void Write1302(unsigned char dat) {
unsigned char i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续写8个二进制位数据 { }
/***************************************************** 函数功能:根据命令字,向1302写一个字节数据 入口参数:Cmd,储存命令字;dat,储存待写的数据 ***************************************************/ void WriteSet1302(unsigned char Cmd,unsigned char dat)
DATA=dat&0x01; //取出dat的第0位数据写入1302 }
delaynus(2); //稍微等待,使硬件做好准备 SCLK=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备 SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
{
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低 }
/***************************************************** 函数功能:从1302读一个字节数据 入口参数:x
***************************************************/ unsigned char Read1302(void) {
unsigned char i,dat; }
/***************************************************** 函数功能:根据命令字,从1302读取一个字节数据 入口参数:Cmd
***************************************************/ unsigned char ReadSet1302(unsigned char Cmd) {
unsigned char dat;
RST=0; //拉低RST
delaynus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续读8个二进制位数据 {
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位 }
if(DATA==1) //如果读出的数据是1 dat|=0x80; //将1取出,写在dat的最高位 SCLK=1; //将SCLK置于高电平,为下降沿读出 delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿 delaynus(2); //稍微等待
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备 Write1302(Cmd); //写入命令字 Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递
return dat; //将读出的数据返回