PIC16F887时钟课设

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《PIC单片机》课程设计
学生姓名:
学生学号:
指导教师:鲍光海
二○一三年5月16 日
目录
1. 课程设计目的 (2)
2. 课程设计题目和要求 (2)
3. 课程设计报告内容 (3)
3.1 硬件原理图 (3)
3.2 软件原理框图 (6)
3.3 功能实现 (7)
4. 课设中存在的问题以及解决方法 (8)
5 设计体会 ........................................................................................ 错误!未定义书签。

6 参考文献 (8)
7 附录 (9)
7.1 仿真原理图 (9)
7.2 部分程序 (9)
7.2.1 秒表程序 (9)
7.2.2 闹钟程序 (12)
1.课程设计目的
《PIC单片机课程设计》是电气工程及其自动化专业及相近专业的一门重要的专业实践课,本课程设计是在《PIC 单片机》课程的基础上,通过硬件设计与软件编程与调试的实践,进一步掌握PIC单片机的应用方法,熟练PIC单片机的C程序的编写与调试,是毕业设计前的一次重要实践,为今后走上工作岗位打下坚实的单片机应用基础。

通过本次课程设计:
熟悉PCB板的焊接流程,熟练运用Proteus进行原理图设计与仿真,熟练运用MPLAB和ICD2进行软件编程与调试熟练掌握PIC16F887 TC74模块(IIC接口的温度传感器)、实时时钟芯片DS1307、定时器、中断的编程方法;熟练掌握LCD YB1602A、按键模块的应用与编程设计掌握单片机应用的一般设计方法,熟悉开发一单片机应用系统的全过程,为今后从事相应的工作打下基础。

学会用C语言编写一个完整的程序,掌握程序的设计方法,拓展编程思维。

2. 课程设计题目和要求
本次课程设计我的设计题目为《多功能数字钟》,通过在PROTEUS仿真及在开发板上调试,功能实现。

设计内容:采用DS1307芯片和单片机进行IIC通信,将时钟芯片中的数据读出来,然后送到LCD1602中去显示,然后设置秒表功能,闹钟功能,还有温度显示功能,通过按键的切换来实现各个功能。

设计要求:
1)完成PROTEUS软件仿真,烧写到开发板上,基本实现上述功能。

2)通过按键对日期、时钟和闹钟进行修改,并正确显示运行。

3. 课程设计报告内容
3.1 硬件原理图
这次课设所用到的硬件模块有PIC16F887单片机芯片,LCD1602液晶显示芯
片,DS1307时钟芯片,TC74温度传感器,闹钟响铃的蜂鸣器模块和按键模块。

单片机系统:
本次课设所用的单片机为16F887是16F877的升级版,主要参数与877A 类似,但使用更为灵活、有的参数更加细化(如RB 口的使用),较877A 功能更多。

单片机模块包括16F887单片机、复位模块、4MHz 晶振和排针等部件。

PIC16F887单片机是本次课设的核心模块,是实现与LCD1602液晶显示模块、TC74温度传感器模块、DS1307时钟模块和蜂鸣器模块等硬件连接部分进行通信的中心。

硬件原理框图 DS1307 时钟芯片
TC74温度 传感器
蜂鸣器闹钟
PIC16F887单片机
LCD1602液晶显示器
LCD 模块:
LCD1602是字符型LCD,作为显示模块,实现显示时间、温度和秒表的功能。

按键模块:
硬件图上为4*4矩阵键盘,通过行反转扫描法读取按键,但是本次课设中只
用到S1、S5、S9和S13,因此只需将端口接地。

温度和时钟模块:
TC74是IIC接口的数字式温度传感器,通过IIC与单片机数据传送,在仿真时应该注意TC74的地址为0b1001101(硬件时为0b1001000),否则液晶屏不能正常显示。

DS1307时钟芯片(IIC通信),可以提供年、月、日、时、分、秒和星期数据,并能自动计算闰年至2100年。

时钟芯片接外接电源,主电源掉电时,备用电源供电,时钟芯片继续运行。

注意IIC上拉电阻要设置位数字电阻。

蜂鸣器模块:
本次课设中蜂鸣器作为闹钟模块,当闹钟设置时间与时钟时间相等时,RC1=1,蜂鸣器响。

3.2 软件原理框图
N
N
秒表暂停
设置时间
KEY.choose=2
N
Y
KEY.choose=1 时间、闹钟
模式选择
设置闹钟
N N
Y
Y
Y
Y
N
判断RB1
是否为0
闹钟标志
是否为2
秒表计时开始
判断RB1
是否为0
判断RB3
是否为0
开启蜂鸣器
判断RB3
是否为0
关闭蜂鸣器
外部中断
是否为0
N
Y
Y
开机初始化
判断时钟
是否运行
时间初始化
显示时间温度
3.3
功能实现
开机显示时间温度
秒表模式:
正常模式下按下INC
进入秒表计时,再按
下INC暂停,第三次
按INC,重新开始,按
下DEC退出秒表模式
设置时间:
按下SET,光标闪烁,通
过按SET次数选择设
置位,按MODE一次
设置时间(两次设置
闹钟)设置好后,按SET退出设置
设置闹钟:
按下SET,光标闪烁,通
过按SET次数选择设
置位,按MODE两次
设置闹钟时间设置好后,按SET退出设置
闹钟设置时间到时,蜂鸣器开始响,预设响一分钟,需要中间关掉蜂鸣器,按MODE。

4 课设中存在的问题以及解决方法
1、在仿真时能正常显示时间温度,但是在实物上LCD屏幕只亮但是不显示时间温度。

解决方法:在程序中把TC74的地址由0b1001101改为0b1001000
2、按键虽然设置防抖延时,但是仍会有按下乱跳的现象。

解决方法:增大延时时间。

3、进入设置后,光标循环闪烁。

原程序:switch(KEY.SET)
{ case 1:LCD_WRITE(YEAR_P+3,COM);
case 2:LCD_WRITE(MONTH_P+1,COM);…}
LCD_WRITE(0b00001111,COM);//字符闪烁
解决方法:在每个case后面加break语句。

4、闹钟设置完退出后,时间卡住不动。

解决方法:屏蔽闹钟程序后,恢复正常。

判断出是闹钟程序有问题,原程序中要年月日时分星期都相等时,蜂鸣器才会响,可能是if嵌套过多导致的问题。

经修改后只比较时分,闹钟设置恢复正常。

6 参考文献
[1] 江和. PIC16系列单片机C程序设计与PROTEUS仿真[M]. 北京:北京航空
航天大学出版社,2010
[2] 闫广明.PIC单片机常用模块与典型实例[M]. 北京:机械工业出版社,2011 7 附录
7.1 仿真原理图
7.2 部分程序
7.2.1 秒表程序
void Seconds(void) //秒表子程序
{ LCD_WRITE(0b00000001,COM); //清屏;
DELAY(2); //延时2ms
LCD_WRITE(LINE1+1,COM); //以下程序初始化显示样式
LCD_WRITE('S',DATA);
LCD_WRITE('E',DATA);
LCD_WRITE('C',DATA);
LCD_WRITE('O',DATA);
LCD_WRITE('N',DATA);
LCD_WRITE('D',DATA);
LCD_WRITE('S',DATA);
LCD_WRITE(':',DATA);
LCD_WRITE(LINE2+4,COM);
LCD_WRITE('0',DATA);
LCD_WRITE('0',DATA);
LCD_WRITE('0',DATA); //初始化显示样式完成while(h==1)
{ while(g==1) //进入秒表计时{ Sec++; //毫秒位+1
if (Sec==10) //秒位+1,毫秒位置0
{ M++;
Sec=0;
}
if(M==60) //分位+1,秒位置0
{ X++;
M=0;
}
Shi=Sec/10;
Ge=Sec%10;
BCD(M);
LCD_WRITE(LINE2+4,COM);
LCD_WRITE(X+0x30,DATA);
LCD_WRITE(':',DATA);
LCD_WRITE(SW+0x30,DATA);
LCD_WRITE(GW+0x30,DATA);
LCD_WRITE(':',DATA);
LCD_WRITE(Shi+0x30,DATA);
LCD_WRITE(Ge+0x30,DATA);
DELAY(2);
if(RB1==0)
{ DELAY(30); g++;
}
}
while(g==2) //秒表暂停{
Shi=Sec/10;
Ge=Sec%10;
BCD(M);
LCD_WRITE(LINE2+4,COM);
LCD_WRITE(X+0x30,DATA);
LCD_WRITE(':',DATA);
LCD_WRITE(SW+0x30,DATA);
LCD_WRITE(GW+0x30,DATA);
LCD_WRITE(':',DATA);
LCD_WRITE(Shi+0x30,DATA);
LCD_WRITE(Ge+0x30,DATA);
DELAY_US(50);
if(RB2==0)
{h++;g=0;}
if(RB1==0)
{ g--;
Sec=0;M=0;X=0;
}}
if(h==2) //退出秒表模式
{ LCD_WRITE(0b00000001,COM); //清屏;
DELAY(2);
h=0;
}
}
}
7.2.2 闹钟程序
void clock(void) //闹钟子程序
{ if(CLOC[1]==TIME[1]) //比较分位
{if(CLOC[2]==TIME[2]) //比较小时位
FMQ=1;DELAY(300);
}
FMQ=0;
if(RB3==0) //停止
{f=0;
LCD_WRITE(0b00000001,COM);
}
}。

相关文档
最新文档