实时时钟.docx
《实时时钟.docx》由会员分享,可在线阅读,更多相关《实时时钟.docx(12页珍藏版)》请在冰豆网上搜索。
实时时钟
《PIC单片机》
课程设计
学生姓名:
学号:
指导教师:
二○一二年十二月十日
目录
1、课程设计目的…………………………………………………3
2、课程设计题目描述和要求……………………………………3
3、课程设计报告内容……………………………………………3
4、心得体会与小结………………………………………………8
5、参考目录………………………………………………………9
1.课程设计目的
1:
在《PIC单片机》课程的基础上,通过硬件设计,软件编程与调试的实践,进一步掌握PIC单片机的应用方法,将所学的理论知识真正应用到实践中去,达到熟练PIC单片机的C程序的编写与调试。
2:
通过本次的课程设计,进一步熟悉PIC16F887单片机各个模块的编程与调试,最后综合各个模块,达到提高综合实践水平的能力。
3:
掌握仿真软件Proteus绘制原理图等的操作方法,进一步熟悉利用MPLABIDE软件进行软件的调试和HT—PICC编写程序。
4:
学会使用下载器PICkit3进行现场实物的程序调试,并掌握如何将写入到单片机的程序脱机运行。
5:
在单片机开发板上完成本次课程设计的内容。
2.课程设计题目描述和要求
1:
利用DS1307时钟芯片,TC74温度传感器,LM016做一个实时时钟,将时间和温度实时的显示在液晶上。
编写相应的程序,最终可以在仿真软件上正常运行,可以在单片机开发板实物上也正常的运行,并且能脱机运行。
2:
在时钟和温度实时显示的过程中,允许外部的按键中断,通过按键可以对时间进行修改,也可以更改温度报警的温度设定值。
3.课程设计报告内容
3.1硬件电路的设计
总电路图:
3.1.1单片机最小系统的设计
本次课程设计采用PIC16F887型号的单片机作为控制芯片。
注意:
编程的时候要特别关注887和877A二者间的区别,特别是在B端口作为输入时上拉电阻的设置,还有对A/D的操作,二者存在着一定的差别。
3.1.2液晶模块的设计
本课程设计因为单片机开发板上的硬件电路已经确定,实物上的LM016采用四位数据线接线方式,是为了节省单片机IO口。
要使用该LCD时,短路插P38P22的短路插(除RD7外)均用插上。
如用使用背光控制,可将P22的短路插8插短接。
注意:
四位数据线的读写操作和初始化都和8位数据线存在一定的差别,四位数据线写一个字节数据要分两次写入,第一次写高四位,第二次写入低四位,读操作也是。
3.1.3时钟和温度模块及温度报警模块的设计
时钟芯片DS1307:
DS1307是IIC器件,单片机通过寻找其地址来实现对该芯片的访问和操作。
DS1307是实时时钟芯片,它提供秒、分、时、日、月、、年和星期等数据,并能自动计算闰年至2100年。
通常时钟芯片是要接备用电池,当主电源掉电时,备用电源为DS1307提供维持电源,此电源只供DS1307使用,此时时钟仍正常运行,时钟晶振是典型的32.768kHz。
注意:
由于DS1307的方波输出脚为集电极开路,故要在外部加上上拉电阻。
温度模块:
TC74也是IIC器件,它一出厂就配有一个固定的地址,单片机通过寻址来实现对不同IIC器件的访问和操作。
单片机只要有一个IIC接口,就可以实现对外围不同地址的IIC器件进行操作。
TC74温度范围为-40℃~+125℃,在+25℃~+85℃范围的精度为±2℃(最大值),在0℃~+25℃的范围精度为±3℃(最大值)。
TC74的默认的7位地址为0b1001101。
TC74的读温度命令是0b00000000,在温度数据寄存器中,每单位值代表1℃,数据用二进制补码格式。
3.2软件设计及其说明
3.2.1软件设计执行的总体流程
第一步:
对各个端口的初始化;
第二步:
液晶开机界面,刚开始液晶显示停留10秒钟在此界面:
显示出欢迎词和自己定义字符数组的自己的中文名字(5个字符组成);
第三步:
判断DS1307是否运行,若为否,执行第四步,若为是,执行第五步;
第四步:
时钟初始化,对时钟芯片的时间初始化操作;
第五步:
读取温度和时钟寄存器值;
第六步:
判断读出来的温度值是否超过,若没有执行第七步,若有报警并继续执
行;
第七步:
判断是否有按键中断进入,若是有,跳到第九步,若没,执行第八步;
第八步:
将读出来的温度值和时钟寄存器值显示在液晶对应的位置上;之后返回
第五步重复执行;
第九步:
判断中断的类型,产生不同的中断标志位,根据标志位实现对时钟寄存
器值的修改等操作,中断程序结束后,返回第八步。
3.2.2液晶模块程序的操作
主要是要注意程序的移植性方面,还有在读和写操作过程中四位数据线所接的对应引脚的输入输出要依据情况作出相应的改变。
#defineLCD_RSRD4//命令/数据选择端
#defineLCD_RWRD5//读/写选择
#defineLCD_ERD6//数据使能
#defineLCD_PORTPORTD//所用到的端口
//单片机数据线用到D端口的低四位,与LCD的数据线高四位相对应
#defineLCD_DDRTRISD//可以增加程序的移植性(与老师的不同点)
#defineCOM0//在LCD_WRITE()中的第2参数为0表示写命令
#defineDAT1//在LCD_WRITE()中的第2参数为1表示写数据
子程序:
voidLCD_CSH(void);
voidLCD_BUSY(void);//检测LCD是否忙
uint8LCD_READ(void);//读LCD,忙检测用
voidLCD_WRITE_4(uint8R1,uint8FLAG);//LCD写半字节
voidLCD_WRITE(uint8R1,uint8FLAG);//LCD写1字节,命令或数据
voidDISPLAY_HANG(uint8line);//在指定行中显示字符,字符在数组DD中
voidMY_ZIKU();//自己定义的字符数组
3.2.3时钟芯片DS1307的程序操作
为了让读写操作更为方便,这样宏定义操作更为方便可移植:
#defineDS1307_ADD_WRITE0b11010000//ds1307的地址
#defineDS1307_ADD_READ0b11010001//ds1307的地址
写DS1307的步骤如下:
1)发送启始位;
2)发送DS1307的7位地址+0(写),即0b11010000;
3)发送要写入DS1307的地址,地址见图16,如要修改分,此值为1;
4)发送要写入DS1307的数,如要把分修改为十进制数37,则此数为0x37;
5)发送停止位;
读DS1307的步骤如下:
1)发送启始位;
2)发送DS1307的7位地址+0(写),即0b11010000;
3)发送要读的DS1307的起始地址,如要从秒读起,为0;
4)发送停止位;
5)发送重新开始位;
6)发送DS1307的7位地址+1(读),即0b11010001;
7)发送读使能位,接收一个数据,单片机发送应答位;
8)发送读使能,接收下一个数据(地址会自动+1),单片机发送应答位,直到读数完成,接收最后一个数时单片机不发送应答位;
9)发送停止位;
3.2.4温度传感器TC74及温度报警的程序操作
自己实现已将仿真软件中的温度传感器地址改成和实物地址一致,更为方便
//温度传感器模块宏定义
#defineRTR0b00000000//TC74的读温度命令
#defineTC74_ADD_READ0b10010001
//读实物地址;仿真也可以用,仿真图已修改过温度传感器的地址
#defineTC74_ADD_WRITE0b10010000//写
对TC74的读温度的步骤如下:
1)发送启始位;
2)发送TC74的7位地址+0(写);
3)发送TC74的写命令(RTR);
4)重新开始条件;
5)发送TC74的7位地址+1(读);
6)接收使能,接收TC74的温度;
7)发送停止条件;
4.2、IIC模块
//IIC的初始化子程序
voidIIC_CSH(void)
{
TRISC|=0b00011000;//SDA,SCL设置为输入!
SSPCON=0b00101000;//同步串口使能(SSPEN),主控方式
SMP=1;//传送率按标准模式,DS1307只能用100KHz的通信波特率
SSPADD=9;//主控模式为波特率值
}
//发送数据R并等待其发送完成,收到从机的应答信号
voidIIC_SEND(uint8a)
{
SSPBUF=a;//将要发送的数据写入发送寄存器
while(RW==1);//若发送结束,继续执行
while(SSPIF==0);//若产生IIC中断,继续执行
while(ACKSTAT==1);//若收到从动方的应答,继续执行
NOP();
}
3.3最后结果
刚开机十秒内的显示,第一行WBN是自己名字的缩写,第二行前五个字符是自己自定义的字符,显示自己的中文名字,将自己的名字拆成五部分来显示。
第一行前七个字符显示当前温度值,第一行后面的字符显示时间;第二行前面的字符显示日期,后面的字符显示星期几。
最后结果:
1:
单片机液晶显示屏可以实时的显示时间和温度(达到);
2:
当温度达到某个估计值时蜂鸣器响(达到);
3:
短按KEY1键可以进入修改当前时间的模式(达到);长按KEY1超过两秒则进入闹铃时间的设定(最终没成功);
4:
心得体会与小结:
心得体会:
通过本次课程设计,自己学到了很多,整个课程设计下来,LM016液晶显示模块,温度显示及温度报警模块,实时时钟显示模块,这些程序的编写都是自己写的,而不是从晚上下载程序下来修改修改,因此自己感觉收获还是蛮大的,自己通过这次的训练,懂得了对时钟芯片,温度传感器的操作方法及原理,综合能力的编程水平也有了一定的提高。
不足的地方,自己编写的闹铃程序没有成功,只能实时显示时间,闹铃暂不能设置。
整个课程设计自己是这样一步步完成的:
第一步:
利用Proteus仿真软件完成原理图的设计;
第二步:
编写液晶显示模块的程序,并且在仿真软件和实物上可以正常运行;
第三步:
编写温度显示及温度报警模块的程序,在仿真和实物上都能正常运行;
第四步:
编写实时时钟显示模块的程序,时间显示在液晶显示屏上,使其在仿真
软件和实物上都能正常运行;
第五步:
将上面几个模块的程序综合起来运行,使之在液晶屏上能实现实时时钟的显示和温度的显示,程序正常运行。
1:
液晶模块程序编写感受
没上PIC课程之前,自己有接触过51,也有用51单片机编写过完整的LCD程序模块(包括读写操作,初始化等),但当时自己操作的使用8位数据线来实现对液晶的操作,主要程序编写是看时序图来完成。
本次课程设计要求的使用4位数据线来实现液晶的显示,刚开始自己有些迷惑,对四位数据线的操作不是很理解,刚开始自己就上网打算查找芯片手册,看4位数据线操作的时序图和初始化操作,结果发现网上都是关于8位的操作,因此刚开始也耽搁了小段时间,后来在老师的指导下和书本上的帮助下得以解决,八位和四位数据线的时序图是一样的,初始化操作书本上有给出。
不同的是四位数据线的读写操作不一样,四位数据线读过程要先读高四位,再读低四位,分两次才能读一个完整的字节,写操作也是一样,同时要特别要注意的一点就是读操作和写操作对应的四位数据线所接引脚的输入输出的设置要重新进行配置。
还有就是在对液晶的读写操作时都必须先检测LCD是否处于忙状态。
还有通过这次对液晶的学习,自己对液晶显示的理解进一步加强,LM016L有8个用户可以定义的字符,自己就将自己的名字三个字分成五部分来显示,自己定义了一个数组到CGRAM,最后也成功显示了,虽然显示的效果不是很好(5*7的显示精度太低),但自己感到挺满足的。
自己对液晶的操作学习大概花了五天的时间(主要是利用在宿舍断断续续的时间),最终自己的液晶程序经受住了实践的考验。
2:
温度传感器及温度报警模块程序编写的感受
温度传感器TC74有IIC通讯接口,PIC单片机有自带IIC接口通讯,因此就不需要像51单片机那样自己用普通I/O口模拟IIC,程序的编写更为方便。
温度芯片编写的过程发现仿真软件的温度传感器默认地址是0b1001101,而实物中温度传感器的地址是0b1001000,这样在仿真和实物操作的程序就不一样,显得有点麻烦,后来自己查找了些资料,将仿真图温度传感器的地址修改成和实物的地址一样。
操作如下:
在仿真图中,右击TC74的属性,会弹出“OptionAddress”
通过这边的操作可以修改仿真图TC74的地址。
这样仿真和实物操作就统一了,避免了不必要的一些麻烦。
同时温度传感器读出来的温度值要将其转换成十进制数据再显示到液晶上。
3:
实时时钟模块程序编写的感受
时钟模块的编写是这次课设收获较大的,因为实时时钟很实用,学时钟芯片的操作也很有必要,在编程过程中主要要注意进制之间的转换,读出来的数据是十六进制的数据,而显示在液晶上的是要显示成十进制,因此要做好进制转换这一步。
还有仿真图中液晶显示的时间是电脑系统的时间,而不是根据我们程序设定的初使时间基础上开始走,切不可被其迷惑,自己设定的时间值正确与否,程序的正确与否,要通过实验验证。
小结:
1:
程序编写过程定时存档,按日期存放起来,不然一直在一个程序改来改去,最后要是程序崩溃了,自己就不好查找,以前的程序也相应没掉了;
2:
每编写完一个模块的程序要先确保该模块的正确性,在仿真软件上和实物上验证,一个一个模块的完成,最后再综合起来调试;
3:
不可以太相信仿真软件,仿真软件可以,实物不一定可以;
4:
IIC的上拉电阻在仿真时要改为数字的,默认为模拟的,否则仿真上IIC不能使用,在实物运行时无影响;
5:
编程和调试过程要有耐心,切不可太过于心急为了赶进度而慌了手脚。
6:
遇到问题除了独立思考分析外,有时多与他人进行沟通交流也会很有收获。
5:
参考书目:
[1]江和,《PIC16系列单片机C程序设计与PROTEUS仿真》,北京航空航天大学出版社,2010年6月