电子钟pic16f887单片机课设报告+完整程序.doc
- 文档编号:8779920
- 上传时间:2023-05-14
- 格式:DOC
- 页数:34
- 大小:314KB
电子钟pic16f887单片机课设报告+完整程序.doc
《电子钟pic16f887单片机课设报告+完整程序.doc》由会员分享,可在线阅读,更多相关《电子钟pic16f887单片机课设报告+完整程序.doc(34页珍藏版)》请在冰点文库上搜索。
==
《PIC单片机》
课程设计
学生姓名:
学号:
专业班级:
2011级电气
指导教师:
江和
二○一四年六月五日
目录
1.课程设计题目和要求……………………………………………3
2.设计方案…………………………………………………………3
3.硬件设计及说明…………………………………………………3
4.软件设计及说明…………………………………………………8
5.实验验证…………………………………………………………11
6.实验小结及感想…………………………………………………13
1.课程设计题目和要求
1.1课程设计的性质和目的
《PIC单片机课程设计》是电气工程及其自动化专业及相近专业的一门重要的专业实践课,本课程在《PIC单片机》课程的基础上,通过硬件设计与软件编程与调试的实践,进一步掌握PIC单片机的应用方法,熟练PIC单片机的C程序的编写与调试,是毕业设计前的一次重要的实践,为今后走上工作岗位打下坚实的单片机应用基础。
对于电力电子方向学生以后制作电源有很重要应用.
1.2课程设计内容和要求
设计一个具有完整功能、有一定工作量与一定难度的单片机应用线路,并绘制能用于仿真的proteus线路图,编制相应的单片机c语言,分别在proteus仿真界面和实物板上调试运行正确。
最后用实物进行运行演示,并写出符合规范的课程设计报告。
2.设计方案
利用PIC16F887单片机设计一个电子时钟,通过IIC通信将DS1307时钟芯片的时间和TC74温度传感器的温度值用1602LCD液晶屏显示。
同时,可以完成修改时间和整点报时等等附加功能.同时能够进行电子钟和密码锁的功能切换,使得该电子钟能够得到更多的实际应用.
3.硬件设计及说明
3.1硬件设计思路
根据所要实现的预期功能,硬件必须要有最小系统模块、LCD显示模块、时钟模块、蜂鸣器模块、温度模块、按键模块等。
根据所提供的实验板资料,设计了如下电路(proteus图):
3.2最小系统
最小系统包括16F887单片机、复位模块、4M外部晶振、等部件组成如下最基本电路,其中芯片供电的引脚略去。
本课设板所用的单片机为PIC16F887,是877A的升级,其主要参数与887A类似,但使用更为灵活、有的参数更为细化(如异步通信的波特率为双字节),功能更多,而价格比887A更低,887引脚与877A兼容.
3.3LCD显示模块
本设计采用字符型LCD:
LM016L,和书上的LM041L使用方法基本一致,为了节省I/O口,采用4位接线法
实验开发板上使用的是LCDYB1602A,有关编程,主要要点为:
(1)数据使能端E的控制,高电平变为低电平时写入;
(2)4位数据线的写入方式,要分别将高4位和低4位写入;
(3)注意检测LCD忙状态和刷新频率.
3.4时钟和温度模块
选用始终芯片DS1307、温度芯片TC74,皆通过IIC和单片机通信,时钟芯片带备用3V电池,电阻RA4和RA5设置为数字电阻。
DS1307是实时时钟芯片,它提供秒、分、时、日、月、、年和星期等数据,并能自动计算闰年至2100年。
通常时钟芯片是要接备用电池,当主电源掉电时,备用电源为DS1307提供维持电源,此电源只供DS1307使用,此时时钟仍正常运行,时钟晶振是典型的32.768kHz。
主要注意点为IIC通讯地址不要错误.
3.6按键模块
采用4*4矩阵按键实现实现时间的设定,修改切换和修改加减等功能,实际上仅使用了第一列的按键,由于本人希望能够进行密码锁和电子钟的切换,所以保留了4*4按键.编程中主要注意按键消抖时间的设置和RB0口弱上拉功能.
3.7其他模块
本设计还能够实现整点报时和密码控制门开关功能,故加上了蜂鸣器模块和电机模块.
4.软件设计及说明
4.1程序设计思路
初始化程序成功后,循环从时钟芯片、TC74里面读出数值并显示,判断时间是否为闹钟时间,同时通过查询的方式判断按键是否按下并进行相应的操作。
可以通过查询的方式修改时间和闹钟,并且把闹钟的设定值显示在LCD屏幕上。
4.2主函数流程图和程序
初始化I/O、IIC、LCD、DS1307
LCD显示开机时间温度值
按键按下?
进入修改模式修改时间
整点?
整点响铃
主函数流程图
4.3显示模块
初始化模块后,通过指令:
LCD_WRITE(LINEX+Y,COM);
LCD_WRITE(STR,DAT);
实现LCD的写和显示,LINEX表示X行,Y表示X行的第Y个字符,STR代表字符的对应码值,COM表示写指令,DAT表示写数据。
主要注意点为每次读取和输入需要检查LCD是否忙:
voidLCD_BUSY(void);
4.4 时钟和温度模块
始终和温度模块的实现首先要进行正确的IIC初始化:
voidIIC_CSH()
时钟程序要通过编写和调用始终读写子程序实现:
voidDS1307(void);
从时钟芯片读出的是BCD码,需要进行转换才可以送入LCD显示。
由于只有十位数所以BCD程序十分简单。
voidBCD_2(char,char); //DS1307初始化
voidWRITE_DS1307(char,char); //写DS1307程序
voidREAD_DS1307(char,char); //读DS1307程序
显示温度需要注意当其值为负数时候需要进行取补码再显示,同时显示负号。
voidDISP_TC74(signedchar);
4.4时间修改模块
时钟修改模块为比较难的部分,但是一步一步编写下来就可以完成指定功能。
以下为日期修改部分,为时钟修改函数中最复杂的一部分。
修改年、月、时、分、秒原理相同。
voidCHG_DAY(void)
{if(RA4==0)
{
LCD_WRITE(DAY+1,COM);//修改年,显示空
LCD_WRITE('',DAT);
LCD_BUSY(); //LCD忙检测
LCD_WRITE(0b00001110,COM); //D(d2)=1:
打开显示,C(d1)=1:
光标打开,B(d0)=1:
光标闪烁
DELAY(100);
}
if(RB2==0)
{DELAY(50);
DD[4]++;
if((DD[5]==1)||(DD[5]==3)||(DD[5]==5)||(DD[5]==7)||(DD[5]==8)||(DD[5]==0x10)||(DD[5]==0x12))//大月
{
if((DD[4]&0x0F)>9) //低位大于9,进十位
DD[4]=DD[4]+6;
if(DD[4]>0x31)
DD[4]=0x01; //大于31号,复位1号
}
if(DD[5]==2) //月份2
{if((DD[4]&0x0F)>9) //低位大于9,进十位
DD[4]=DD[4]+6;
if(DD[6]%4==0||(DD[6]==0x12)||(DD[6]==0x16)||(DD[6]==0x32)||(DD[6]==0x36)||(DD[5]==0x52)||(DD[5]==0x56))
{if(DD[4]>0x29)
DD[4]=0x01; //大于29号,复位1号
}
else
{if(DD[4]>0x28)
DD[4]=0x01; //大于28号,复位1号
}
}
if((DD[5]==4)||(DD[5]==6)||(DD[5]==9)||(DD[5]==0x11))//小月
{
if((DD[4]&0x0F)>9) //低位大于9,进十位
DD[4]=DD[4]+6;
if(DD[4]>0x30)
DD[4]=0x01; //大于30号,复位1号
}
BCD_2(DAY,DD[4]);//显示修改后的值
}
BCD_2(DAY,DD[4]);//显示修改后的值
}
5.实验验证
5.1proteus仿真验证
把写好的程序进行仿真,并不断修改程序,最终程序基本实现了预期的功能。
仿真结果如下:
5.2实验室调试
用PIC16F887实验板,通过PIC3连接,进行在线调试和脱机运行,调试中发现很多问题,除了一些最基本的符号、变量定义缺少等错误,还有以下问题。
问题一:
无法显示时间和温度,IIC通信的led不闪烁。
解决办法:
TC74仿真和实物的地址不一样,只需把地址1001101改为1001000
问题二:
按键调整时光标没有和仿真一样闪动
解决办法:
由于程序刷新太快,人眼无法分辨,所以只需在按键后面加50ms的延时即可。
问题三:
不能掉电保护,每次脱机或者复位都会进行时钟初始化
解决办法:
DS1307初始化前先进行判断秒的最高位是否为1,为1则进行初始化
问题四:
温度不能显示负温度
解决方法:
要进行正负的判断并且进行反码转换后再进行显示。
6.实验小结及收获
PIC单片机课程上完之后我便想要用其真正完成一项作品,本次课设正好实现了我的愿望。
经过老师的讲解,首先我把数字钟分为几个模块,按照课设板的原理图画出了仿真图,一个一个模块开始编程、仿真、调试,在一个一个模块的编程中,感觉自己学习到了不少编程技巧。
通过这两周的学习,让我明白了数字钟的工作原理,字符型LCD显示、IIC通信的编程等等功能的使用,没一步错误的显示都是我们编程能力的进步的显示。
通过本次课程设计,加深了我对单片机的理解,提高了编程能力、动手能力、分析问题和解决问题的能力,同时也多学了很多知识,补充了课内没有涉及的很多知识。
数字时钟的成功设计也激发了我对单片机的浓厚兴趣,积累了一定的设计经验。
认真编写程序和做好注释与备份就是在节省时间,模块换编程才比较简单可靠,同时最终的结果要以实物的实际情况为准。
在编程和调试过程中遇到的很多问题,培养了我细心、耐心、严谨的精神。
同时我感受到了单片机的伟大之处,可以依据人的思维进行各种运算和工作,学好单片机对我们以后的工作以及日常应用都有很大的作用。
我也希望在后来加上我原本设想的密码锁功能,使得电子钟不只是电子钟,能够更加实用。
最后十分感谢江和老师的悉心指导,感谢同学们的帮助。
正是在您们的帮助下我才成功能完成课设。
参考书目:
[1]《PIC16系列单片机C程序设计与PROTEUS仿真》江和,北京航空航天大学出版社,2010
[2]《福州大学PIC单片机课程设计指导书》江和,鲍光海,2012年3月
[3]《2.A题-光伏并网发电模拟装置》全国电子设计大赛程序,
版本:
V1.0
*/
#include
__CONFIG(0x20F1); //配置位
__CONFIG(0x3FFF);
#defineLCD_RS RD4 //LCD寄存器选择 数据H/指令L
#defineLCD_RW RD5 //LCD读H/L写控制线
#defineLCD_E RD6 //LCDE时钟
//定义常数
#defineTC74_ADD0b1001000 //TC74的7位地址
#defineRTR 0b00000000 //TC74的读温度命令
#defineCOM 0 //在LCD_WRITE()中的第2参数为0表示写命令
#defineDAT 1 //在LCD_WRITE()中的第2参数为1表示写数据
bank1charDD[16]; //一行LCD显示数据暂存
charSET=0,CK=0; //功能键判断,选着键
#defineYEARLINE1+3//年的显示位置(4位)
#defineMONTHLINE1+6//月的显示位置(2位)
#defineDAYLINE1+9//日的显示位置(2位)
#defineWEEKLINE1+15//星期的显示位置(1位)
#defineHOURLINE2+3//时的显示位置(2位)
#defineMINUTELINE2+6//分的显示位置(2位)
#defineSECONDLINE2+9//秒的显示位置(2位)
#defineTEMPLINE2+12//温度的显示位置(4位)
#defineADDR0b11010000 //DS1307地址固定为0b11010000
//宏定义,清屏
#defineCLR_LCD() \
LCD_WRITE(0b00000001,COM); \
DELAY
(2)
voidCSH(void); //初始化
voidLCD_CSH(void); //LCD初始化
voidLCD_BUSY(void); //检测LCD是否忙
charLCD_READ(void); //读LCD,忙检测用
voidLCD_WRITE(char,char); //LCD写1字节,命令或数据
voidDS1307(void); //DS1307显示程序
voidLCD_WRITE_4(char,char); //LCD写半字节
voidDISP_C(char); //在指定行中显示字符,字符在数组DD中
voidWRITE_DS1307(char,char); //写DS1307程序
voidREAD_DS1307(char,char); //读DS1307程序
voidIIC_CSH(void);
voidIIC_SEND(char);
signedcharREAD_TC74(void);
voidDISP_TC74(signedchar);
voidDISP_MENU(constchar*); //由常数数组显示整屏字符
voidBCD(unsignedint);
voidDELAY_US(char);
voidDELAY(unsignedint);
voidDELAY_I(unsignedint);
voidBCD_2(char,char); //2位BCD数转换成10进制
voidinterruptISR(void);//修改中断
voidCHG_YEAR(void);//修改年
voidCHG_MONTH(void);//修改月
voidCHG_DAY(void);//修改日
voidCHG_WEEK(void);//修改星期
voidCHG_HOUR(void);//修改时
voidCHG_MINUTE(void);//修改分
voidCHG_SECOND(void);//修改秒
//整屏界面,每行16个字符,最后加一个结束符
constcharMENU0[2][17]={
{"------SMART-----"},
{"--CODED---LOCK--"}};
charSW,GW;
#defineLINE1 0b10000000
#defineLINE2 0b11000000
constcharLINE[2]={LINE1,LINE2};
//-----------------------------------主程序-----------------------------------
voidmain(void)
{ signedcharR1;
CSH();
DISP_MENU(*MENU0); //显示整屏
DELAY(2000);
CLR_LCD();
DS1307();
while
(1)
{R1=READ_TC74(); //读温度传感器的温度值
DISP_TC74(R1); //显示温度值
WRITE_DS1307(0x07,0b00010000);//OUT口输出方波,频率为1Hz
READ_DS1307(0x00,7);
BCD_2(SECOND,DD[0]); //显示时,分,秒
BCD_2(MINUTE,DD[1]);
BCD_2(HOUR,DD[2]);
LCD_WRITE(WEEK,COM);
LCD_WRITE(DD[3]+0x30,DAT);//WEEK就一位,可直接转换为ASCII码
BCD_2(DAY,DD[4]); //显示年,月,日
BCD_2(MONTH,DD[5]);
BCD_2(YEAR,DD[6]);
if((DD[1]==0)&&DD[0]==0) //当整点时蜂鸣器响
{ RC1=1;DELAY(200);}
else
RC1=0;
while(SET>=1)//功能键按下
{READ_DS1307(0x00,7);
BCD_2(SECOND,DD[0]); //显示时,分,秒
BCD_2(MINUTE,DD[1]);
BCD_2(HOUR,DD[2]);
LCD_WRITE(WEEK,COM);
LCD_WRITE(DD[3]+0x30,DAT);//WEEK就一位,可直接转换为ASCII码
BCD_2(DAY,DD[4]); //显示年,月,日
BCD_2(MONTH,DD[5]);
BCD_2(YEAR,DD[6]);
if(RB1==0)
{
DELAY(150);
CK++;
if(CK>6)//总共7个数据,年...秒
CK=0;
}
if(CK==0)
CHG_YEAR();//修改年
if(CK==1)
CHG_MONTH();//修改月
if(CK==2)
CHG_DAY();//修改日
if(CK==3)
CHG_WEEK();//修改星期
if(CK==4)
CHG_HOUR();//修改时
if(CK==5)
CHG_MINUTE();//修改分
if(CK==6)
CHG_SECOND();//修改秒
if(DD[0]&0x80==0x80) //判断CH=0?
(且设定了初始值)
{LCD_BUSY(); //LCD忙检测
LCD_WRITE(0b00001100,COM); //D(d2)=1:
打开显示,C(d1)=1:
光标打开,B(d0)=1:
光标闪烁
WRITE_DS1307(0x00,DD[0]); //秒
WRITE_DS1307(0x01,DD[1]); //分
WRITE_DS1307(0x02,DD[2]); //时
WRITE_DS1307(0x03,DD[3]); //星期
WRITE_DS1307(0x04,DD[4]); //号
WRITE_DS1307(0x05,DD[5]); //月
WRITE_DS1307(0x06,DD[6]); //年
DELAY(100);
}
}
}
}
//-------------------------------配置初始化---------------------------------
voidCSH()
{ INTCON=0b10011000;
TRISD=0b00000000; //控制LCD1604,全为输出
TRISB=0b00000111;//键盘输入
TRISC=0b00011000; //RC3,RC4为IIC接口,必须设置为输入,RC1为输出
TRISA=0b00010000; //A4为输入口
ANSEL=0b00000000; //A、E口为口做I/O口
ANSELH=0b00000000; //B口为口做I/O口
OPTION_REG=0b00000000; //B口若上拉
WPUB=0b11111111; //弱上拉使能
LCD_CSH(); //LCD初始化
IIC_CSH();//IIC初始化
//PWM设置
/* RC1=0;
PR2=124; //周期为1ms
CCPR2L=0x32;
CCP2C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子钟 pic16f887 单片机 报告 完整 程序
![提示](https://static.bingdoc.com/images/bang_tan.gif)