




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于PIC16F877的智能电子钟设计1 引言随着电子技术产业结构调整,生产工艺的飞速发展,人们生活水平的不断提高,家用电器逐渐普及,而随着人们对周围环境便利程度的要求,市场对于智能时钟控制系统的需求也越来越大。智能钟应实现的主要功能为:能实现二十四小时制的时分秒显示,具有快速手动校时电路,具有整点报时功能,具有闹钟表功能(可设置时分),具有倒计时功能。2 设计原理及方案 2.1 设计原理单片机是一门技术性、应用性很强的学科,实践教学是它的一个极为重要的环节。不论是硬件扩展、接口应用还是编程方法、程序调试,都离不开实践。本次设计的目的是通过完成一个涉及单片机都种资源应用并具有综合功能的小系统目标板的设计与编程应用,能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件 编程、排版调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。 该电子时钟不但具有显示时、分、秒的作用,而且用按键还可以实现时间的调整和闹铃的设定。本次综合实践完成了在单片机数据采集与定时系统的硬件电路设计后的基础上,焊接制作电路板,完成该系统的软件设计与调试。待仿真成功后,再将程序烧写入单片机中。 2.2 设计方案系统结构整个电子时钟系统电路可分为五大部分:中央处理单元(CPU)、电源电路部分、显示部分、键盘输入部分。系统由PIC16F877、LED 数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。系统的功能选择由SB0、SB1、SB2、SB3、SB4 完成。其中SB0 为时间校对,定时器调整功能键,按SB 0 进入调整状态。SB1 为功能切换键。第一轮按动 SB1 依次进入一路、二路、三路定时时间设置提示程序,按SB3 进入各路定时调整状态。定时时间到,二极管发亮。到了关断时间后灭掉。如果不进入继续按SB1 键,依次进入时间年位校对、月位校对、日位校对、时位校对、分位校对、秒位校对状态。不管是进入那种状态,按动SB2 皆可以使被调整位进行不进位增量加1 变化。各预置量设置完成后,系统将所有的设置存入RAM 中,按SB1 退出调整状态。上电后,系统自动进入计时状态,起始于00 时 00 分。SB4 为年月日显示转换键,可使原来显示时分秒转换显示年月日。3 硬件设计3.1 原理图设计智能钟原理图如图3.1所示图3.1 智能钟原理图3.2 元器件选择3.2.1 中央处理单元 CPU选用PIC16F877对整个系统进行控制:1)它将定时数据输出到LED,实现时间的显示; 2)根据键盘输入调用相应键处理子程序,实现时间的调整和闹铃的设定; 3.2.2 电源电路部分在各种电子设备中,直流稳压电源是必不可少的组成部分,它是电子设备唯一能量来源,它的设计思路是根据我们以前学过的模电电子技术,要想得到我们所要的+6V输出电压,就需将交流220V的电压经过变压器、整流电路、滤波电路和稳压电路四个部分。 3.2.3 显示部分 显示部分是整个电子时钟最为重要的部分,共需要位LED显示器。采用动态显示方式,所谓动态显示方式是时 间(或温度)数字在LED上一个一个逐个显示,它是通过位选端控制在哪个LED上显示数字,由于这些LED数字显示之间的时间非常的短,使的人眼看来它们是一起显示时间数字的,并且动态显示方式所用的接口少,节省了CPU的管脚。由于端口的问题以及动态显示方式的优越性,在此设计的连接方式上采用共阴极接法。显示器LED有段选和位选两个端口,首先说段选端,它由LED八个端口构成,通过对这八个端口输入的不同的二进制数据使得它的时间显示也不同,从而可以得到我们所要的时间显示3.2.4 位选电阻与段选电阻位选电阻=(VCC-0.7-0.3)/IB=(5-0.7-0.3)/(48/80) =6.66千欧,取6.8千欧。段选电阻=(VCC-VCEO-VD-0.3)/IB=(5-0.3-2-0.3)/6=400欧,取390欧。其中,单片机I/O口为CMOS电路,均通过一个FET(场效应管)接地,因此在计算时均应减去0.3V。3.2.5 蜂鸣器电阻蜂鸣器选用ZC17040,额定电压3V,额定电流小于1毫安。限流电阻R=(5V-3V-0.3V)/1mA=1.7(千欧)取电阻为2千欧。 3.3 PCB图设计智能钟PCB图如图3.2所示图3.2 智能钟PCB图4 软件设计4.1 流程图4.1.1 主程序流程图如图4.1.14.1.2 时钟计时子程序流程图如图4.1.2 图4.1.1 智能钟主程序流程图 图4.1.2 时钟计时子程序流程图4.1.3 键盘扫描子程序流程图4.1.4 R0中断服务子程序流图图4.1.3 键盘扫描流程图 图4.1.4 中断服务子程序流程图4.2 源程序见附录总 结 嵌入式测控系统设计及实践是一门实践性比较强的课程,也是我在大学期间学得最认真的一门课程。通过这门课,使我受益匪浅,主要表现在以下几个方面: (1) 通过这对这门课的学习,我基本掌握了单片机原理,学会了用Protel 99 SE画原理图并生成相应的PCB,学会了嵌入式系统的开发流程,并能够利用51或PIC系列单片机去设计一个小型的嵌入式系统。而且我也充分认识到了单片机的重要性,对单片机开发产生了浓厚的兴趣。 (2) 我们这一组是用PIC16F877去做,但做的过程中我们发现了很多问题,比如电子元器件的选择与购买,以及电路的焊接。由此我认为,在单片机开发中,经验往往是很重要的,而多去做实践有利于经验的积累,这应该是我们这门课程与设计的意义所在。 (3)上完这门课后,我对单片机的总体感觉是:单片机比较适合做产品研发或系统设计,而我们以前学的PLC则比较适合于工程控制,它比用单片机控制要简单一些。相比PLC,用单片机做系统设计要难很多,而且网上的相关资料显示,PLC比较适合于环境比较恶劣的工业现场。因此,学会用PLC做控制也是很重要的。但我发现,PLC与单片机也有某些类似的地方,而且,学完单片机后,我发现PLC变得容易了。由此我发现,其实任何学科都是相通的。 (4)我们以前学的是51系列单片机,而这次我们用PIC系列。通过对比我们发现,51与PIC的在原理与编程方面有着类似的地方,尽管它的的指令系统不同,但它们基本思想是相同的,因此我们没有花很长时间就从51过渡到了PIC。由此我发现,其实51也好,PIC也好,只要学会并精通其中的一种,对其它类型的8位单片机也能触类旁通,以不变应万变了。8位单片机我学会了51和PIC,我下一步的计划是学习32位的ARM,因为我认为,32位单片机相比8位单片机有着更强大的功能和更好的发展前景。致 谢在做学习嵌入式系统设计的这段时间里,我们曾经遇到过很多的难题,也产生了很多的疑问。但在老师和同学们的帮助以及自己的不断努力下,终于成功地完成了这门课的学习。在这里,我们要首先感谢*老师,他给了我们很大的支持、鼓励和帮助。在我们遇到问题的时候,他们总是很及时地给我们指点迷津,提出建议,使我们不致于在盲区内停留太久。在学习过程中,老师以其严谨求实的治学态度,高度的敬业精神,孜孜以求的工作作风和大胆创新的进取精神对我们影响很大。他们渊博的知识,开阔的视野和敏锐的思维让我们敬佩不已。当然,在此期间我同组的同学们也是纷纷帮我们出谋划策,提出很真诚的建议,使我们受益匪浅,请我们表达对你们深深地谢意。参 考 文 献1 赵佩华.单片机接口技术及应用.北京:机械工业出版社,2003.12 谢宜仁,谢伟,谢东辰.单片机使用技术问答.北京:人民邮电出版社,2003.23 薛宗祥,鹿树理,朱惠英. 8位单片机原理与应用. 北京:北京航空航天大学出版社,1999.94 何立民.MCS-51系列单片机应用系统设计. 北京:北京航空航天大学出版社, 2002.75 李荣正.PIC单片机原理与应用(第2版). 北京:北京航空航天大学出版社,2005.121附录源程序:/shizhong.h,头文件。/*功能:利用PIC16F877做的电子时钟程序*/shizhong.h文件,主要实现预编译、函数的申明以及全局变量的定义。#define uchar unsigned char/在程序中用uchar代替无符号字符型数据#define uint unsigned int/在程序中用uint代替无符号整型数据#define DELAY_VALUE 1/定义数码管显示延时值#define KEY_DELAY_VALUE 3/定义按键去抖动延时值#define speaker RD6/蜂鸣器#define LED RD7/LED#define sw1 RB1/按键1#define sw2 RB2/按键2#define sw3 RB4/按键3#define sw4 RB5/按键4#define smg1RD0/数码管1的位选#define smg2RD1/数码管2的位选#define smg3RD2/数码管3的位选#define smg4RD3/数码管4的位选#define smg5RD4/数码管5的位选#define smg6RD5/数码管6的位选void interrupt tmr0(void);/申明定时器中断函数void PORT_INIT(void);/申明端口初始化函数void TMR0_INIT(void);/申明定时器初始化函数void Time_Tran(void);/申明时间数值个时位分离函数void Time_Dis(void);/申明时间显示函数void Display(uchar i,uchar num);/申明数码管显示函数void Delay(uint k);/申明延时函数void Time_init(void);/申明时间初始化函数void Speaking(uint speak_value,uint stop_value);/申明蜂鸣器函数uchar Keyscan(void);/申明按键函数void Sw1_Press(void);/申明按键1计数函数void Set_Clock(void);/申明时间设置函数uchar Sw4_Press(void);/申明按键4计数函数void Set_Alarm(void);/申明闹钟设置函数void Alarm(void);/申明闹钟函数void Alarm_Speaking(void);/申明闹钟报警函数void Speaking_Delay(uint k);/申明蜂鸣器函数void StopWatch(void);/申明秒表函数void SW_Time(void);/申明秒表计时函数void Sw2_Press(void);/申明按键2计数函数void Daojishi(void);/申明倒计时函数void Djs_Time(void);/申明倒计时计时函数/声明程序中用到的相关全局变量extern int year;extern signed char month,day,hour,minu,sec,week;extern uchar count; extern uchar miao_ge,miao_shi,fei_ge,fei_shi,shi_ge,shi_shi;extern uchar day_ge,day_shi,month_ge,month_shi,year_ge,year_shi,year_bai,year_qian;extern uchar keyword,sw1_press_num,sw4_press_num;extern uchar hour_alarm,minu_alarm;extern uchar alarm_hour_shi,alarm_hour_ge,alarm_minu_shi,alarm_minu_ge;extern uchar alarm_stop;extern uchar sw_minu,sw_sec,sw_count;extern uchar sw_minu_shi,sw_minu_ge,sw_sec_shi,sw_sec_ge,sw_count_shi,sw_count_ge;extern uchar sw2_press_num;extern uchar watch_stop;extern signed char djs_hour,djs_minu,djs_sec,djs_count;extern uchar djs_hour_shi,djs_hour_ge,djs_minu_shi,djs_minu_ge,djs_sec_shi,djs_sec_ge;extern uchar djs_start;/clock.c文件,时钟计时程序。#include #include #include shizhong.h/TMR0中断程序void interrupt tmr0(void) if(T0IE&T0IF) TMR0=100; T0IF=0; /清除中断标志位 count+; /中断产生秒信号 if(watch_stop=1) sw_count+; if(djs_start=1) djs_count+; if(count=150) count=0;sec+;if(sec=60) sec=0; minu+; if(minu=60) minu=0; hour+;/Speaking(100,0); if(hour=24) hour=0; day+; if(week=31) day=1; month+; if(month=13) month=1; year+; /时间转换函数,将时间的个位与十位分离出来以便显示void Time_Tran(void) miao_ge=sec%10; miao_shi=sec/10; fei_ge=minu%10; fei_shi=minu/10; shi_ge=hour%10; shi_shi=hour/10; day_ge=day%10; day_shi=day/10; month_ge=month%10; month_shi=month/10; year_qian=year/1000; year_bai=(year/100)%10; year_shi=(year%100)/10; year_ge=year%10; alarm_hour_shi=hour_alarm/10; alarm_hour_ge=hour_alarm%10; alarm_minu_shi=minu_alarm/10; alarm_minu_ge=minu_alarm%10; sw_minu_shi=sw_minu/10; sw_minu_ge=sw_minu%10; sw_sec_shi=sw_sec/10; sw_sec_ge=sw_sec%10; sw_count_shi=sw_count/10; sw_count_ge=sw_count%10; djs_hour_shi=djs_hour/10; djs_hour_ge=djs_hour%10; djs_minu_shi=djs_minu/10; djs_minu_ge=djs_minu%10; djs_sec_shi=djs_sec/10; djs_sec_ge=djs_sec%10;/时间显示子程序,按位显示时间void Time_Dis(void)switch(sw1_press_num) case 0:case 1:case 2:case 3:Display(1,shi_shi);Display(2,shi_ge);Display(3,fei_shi);Display(4,fei_ge);Display(5,miao_shi);Display(6,miao_ge);break;case 4:case 5:case 6:Display(1,year_shi);Display(2,year_ge);Display(3,month_shi);Display(4,month_ge);Display(5,day_shi);Display(6,day_ge);break;case 7:Display(6,week);break;case 8:Display(3,alarm_hour_shi);Display(4,alarm_hour_ge);Display(5,alarm_minu_shi);Display(6,alarm_minu_ge);break;case 9:Display(1,sw_minu_shi);Display(2,sw_minu_ge);Display(3,sw_sec_shi);Display(4,sw_sec_ge);Display(5,sw_count_shi);Display(6,sw_count_ge);break;case 10:case 11:case 12:case 13:Display(1,djs_hour_shi);Display(2,djs_hour_ge);Display(3,djs_minu_shi);Display(4,djs_minu_ge);Display(5,djs_sec_shi);Display(6,djs_sec_ge);break;default:break;/main.c文件,主程序。#include /标准输入输出库#include /PIC单片机自带的库#include shizhong.h/自己定义的头文件/定义程序中用到的相关全局变量int year;signed char month,day,hour,minu,sec,week;uchar count; uchar miao_ge,miao_shi,fei_ge,fei_shi,shi_ge,shi_shi;uchar day_ge,day_shi,month_ge,month_shi,year_ge,year_shi,year_bai,year_qian;uchar keyword,sw1_press_num,sw4_press_num;uchar hour_alarm,minu_alarm;uchar alarm_hour_shi,alarm_hour_ge,alarm_minu_shi,alarm_minu_ge;uchar alarm_stop;uchar sw_minu,sw_sec,sw_count;uchar sw_minu_shi,sw_minu_ge,sw_sec_shi,sw_sec_ge,sw_count_shi,sw_count_ge;uchar sw2_press_num;uchar watch_stop;signed char djs_hour,djs_minu,djs_sec,djs_count;uchar djs_hour_shi,djs_hour_ge,djs_minu_shi,djs_minu_ge,djs_sec_shi,djs_sec_ge;uchar djs_start;/主程序void main(void)TMR0=100; /开启TMR0中断并赋初值 TMR0_INIT(); /定时器0初始化Time_init(); /时间初始化PORT_INIT(); /端口初始化 while(1) Time_Tran(); /调用个十位分离函数Time_Dis(); /调用时间显示函数keyword=Keyscan();/调用键盘扫描函数Sw1_Press(); /调用按键1计数函数Set_Clock(); /调用时间设计函数Sw4_Press(); /调用按键4计数函数Alarm(); /调用闹钟函数Alarm_Speaking(); /调用闹钟报警函数StopWatch(); /调用秒表函数Daojishi(); /调用倒计时函数/Set_Clock.c,时钟设置程序。#include #include #include shizhong.h/时间设置函数void Set_Clock(void)switch(sw1_press_num) case 0:break; case 1:if(keyword=2) hour+; if(hour=24) hour=0;if(keyword=3) hour-;if(hour=-1) hour=23;break; case 2:if(keyword=2) minu+; if(minu=60) minu=0;if(keyword=3) minu-;if(minu=-1) minu=59;break; case 3:if(keyword=2) sec+; if(sec=60) sec=0;if(keyword=3) sec-;if(sec=-1) sec=59;break; case 4:while(sw1_press_num=4) keyword=Keyscan();Sw1_Press();Time_Tran();Time_Dis();if(keyword=2) year+; if(keyword=3&year=0) year-; break; case 5:while(sw1_press_num=5) keyword=Keyscan();Sw1_Press();Time_Tran();Time_Dis();if(keyword=2) month+; if(month=13) month=1;if(keyword=3) month-;if(month=0) month=12; break; case 6:while(sw1_press_num=6) keyword=Keyscan();Sw1_Press();Time_Tran();Time_Dis();if(keyword=2) day+; if(day=31) day=1;if(keyword=3) day-;if(day=0) day=30; break; case 7:while(sw1_press_num=7) keyword=Keyscan();Sw1_Press();Time_Tran();Time_Dis();if(keyword=2) week+; if(week=8) week=1;if(keyword=3) week-;if(week=0) week=7; break; default:break;/Daojishi.c,倒计时程序。#include #include #include shizhong.h/倒计时设置函数void Daojishi(void)switch(sw1_press_num)case 10:while(sw1_press_num=10) keyword=Keyscan();Sw1_Press();Time_Tran();Time_Dis();if(keyword=2) djs_hour+;if(djs_hour=99) djs_hour=0; if(keyword=3) djs_hour-;if(djs_hour=-1) djs_hour=99; break;case 11:while(sw1_press_num=11) keyword=Keyscan();Sw1_Press();Time_Tran();Time_Dis();if(keyword=2) djs_minu+; if(djs_minu=60) djs_minu=0;if(keyword=3) djs_minu-;if(djs_minu=-1) djs_minu=59; break;case 12:while(sw1_press_num=12) keyword=Keyscan();Sw1_Press();Time_Tran();Time_Dis();if(keyword=2) djs_sec+; if(djs_sec=60) djs_sec=0;if(keyword=3) djs_sec-;if(djs_sec=-1) djs_sec=59; break;case 13:while(sw1_press_num=13) keyword=Keyscan();if(keyword=2) djs_start=1;else if(keyword=3) djs_start=0;else if(keyword=4) sw1_press_num=10;djs_start=0;Sw1_Press();Djs_Time();Time_Tran();Time_Dis();if(djs_hour=0)&(djs_minu=0)&(djs_sec=0)&(djs_start=1)Speaking(15,15); Speaking(15,40); break;default:break;/倒计时计时函数void Djs_Time(void)if(djs_count=100) djs_count=0;djs_sec-;if(djs_sec0) djs_sec=59; djs_minu-; if(djs_minu0) djs_minu=59; djs_hour-; if(djs_hour=0) djs_hour=0; /Alarm.c,闹钟程序。#include #include #include shizhong.h/闹钟设置函数void Set_Alarm(void)if(keyword=2) hour_alarm+;if(hour_alarm=24) hour_alarm=0;if(keyword=3) minu_alarm+;if( minu_alarm=60) minu_alarm=0;/闹钟函数void Alarm(void)while(sw1_press_num=8) keyword=Keyscan();Sw1_Press();Time_Tran();Time_Dis();Set_Alarm(); /闹钟响铃函数void Alarm_Speaking(void)if(hour_alarm=hour)&(minu_alarm=minu) if(keyword=2) alarm_stop=0;if(keyword=3) minu_alarm+=5;alarm_stop=0;if(alarm_stop=1) Speaking(15,15); Speaking(15,40);Time_Tran();Time_Dis(); if(!(hour_alarm=hour)&(minu_alarm=minu)&(!(alarm_stop) alarm_stop=1;/蜂鸣子程序,蜂鸣时间参数为speak_value,暂停时间参数为stop_valuevoid Speaking(uint speak_value,uint stop_value)speaker=0;LED=0;Speaking_Delay(speak_value);speaker=1;LED=1;Speaking_Delay(stop_value);/延时子程序,蜂鸣报警延时专用void Speaking_Delay(uint k) uint i,j; for(i=k;i0;i-) for(j=110;j0;j-); keyword=Keyscan(); Sw1_Press(); Time_Tran(); Time_Dis(); /StopWatch.c,秒表程序。#include #include #include shizhong.h/秒表函数void StopWatch(void)while(sw1_press_num=9) keyword=Keyscan();Sw1_Press();Sw2_Press();if(sw2_press_num%2=1) watch_stop=1;else watch_stop=0;if(keyword=3) sw_minu=0;sw_sec=0;sw_count=0;SW_Time();Time_Tran();Time_Dis();/秒表计时函数void SW_Time(void)if(sw_count=100) sw_count=0;sw_sec+;if(sw_sec=60) sw_sec=0; sw_minu+; if(sw_minu=60) sw_minu=0;sw_sec=0; /display.c,显示程序#include #include #include shizhong.hconst uchar duanma=0xAF,0x24,0x9D,0xB5,0x36,0xB3,0xBB,0x25, 0xBF,0xB7,0x3F,0xBA,0x8B,0xBC,0x9B,0x1B; /0-F/显示子程序,在第i个数码管上显示序号为num的字符void Display(uchar i,uchar num) switch(i) case 1:smg1=1; smg2=0; smg3=0; smg4=0; smg5=0; smg6=0; PORTC=duanmanum; Delay(DELAY_VALUE); break; case 2:smg1=0; smg2=1; smg3=0; smg4=0; smg5=0; smg6=0; PORTC=duanmanum; Delay(DELAY_VALUE); break; case 3:smg1=0; smg2=0; smg3=1; smg4=0; smg5=0; smg6=0; PORTC=duanmanum; Delay(DELAY_VALUE); break; case 4:smg1=0; smg2=0; smg3=0; smg4=1; smg5=0; smg6=0; PORTC=duanmanum; Delay(DELAY_VALUE); break; case 5:smg1=0; smg2=0; smg3=0; smg4=0; smg5=1; smg6=0; PORTC=duanmanum; Delay(DELAY_VALUE); break; case 6:smg1=0; smg2=0; smg3=0; smg4=0; smg5=0; smg6=1; PORTC=d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 艺术绘画技法与创作实践试卷
- 行政管理专科公共关系学考试技巧与答案
- 食品卫生与安全法规试题及答案集合
- 环境工程环境影响评价题库
- 行政管理中的危机公关策略试题及答案
- 韩语学习与交流作业指导书
- 2025年工程经济创新点详解试题及答案
- 真诚相待班会课件
- 真诚的课件背景
- 保安工作计划科技业生物科学部门
- 叉车加油管理规范
- 阳光心态快乐职场
- 麻醉药品专用账册
- 初、中、高级工程师申报培训课件
- 医疗器械表格-个人健康档案表-
- GB/T 16180-2014劳动能力鉴定职工工伤与职业病致残等级
- 底盘系统及空气悬挂
- 代理授权书模板
- 《妊娠期糖尿病患者个案护理体会(论文)3500字》
- 成都地铁介绍课件
- 幼儿园绘本故事:《十二生肖》 课件
评论
0/150
提交评论