单片机系统设计.docx
《单片机系统设计.docx》由会员分享,可在线阅读,更多相关《单片机系统设计.docx(28页珍藏版)》请在冰豆网上搜索。
单片机系统设计
《单片机系统设计》课程设计
总结报告
题目:
单片机电子时钟的设计与实现
设计人员:
学号:
系别:
班级:
同组人员姓名:
指导老师:
日期:
2012年1月13日
单片机电子时钟的设计与实现
摘要:
红外传感器是传感器中常见的一类,
由于红外传感器是检测红外辐射的一
类传感器,而自然界中任何物体只要其稳定高于绝对零度都将对外辐射红外能
量,
所以红外传感器称为非常实用的一类传感器,
利用红外传感器可以设计出很
多实用的传感器模块,如红外测温仪,红外成像仪,音频传输系统,自动
门控制系统等。
关键词:
红外传感器音频传输LM386
一、整体设计
图1时钟框图
1、电子时钟整体思想
原理:
该时钟利用单片机最小系统、DS1302寄存器、LCD液晶屏等构成电子时钟最基本的硬件电路。
在软件程序中的年、月、日直接调用DS1302,时、分、秒利用定时器T0定时,每隔50ms产生一次中断,中断20次(1s)后秒单元加1;秒满60后向分进1,分单元加1;当分单元满60后时单元向小时加1。
但由于每次执行程序时,定时器都要重新赋初值且实时将数据存入DS1302中,开机读取存放在存储器中的数据。
为保证时钟在外部供电电压不足或突然掉电等突发情况下仍能正常工作和掉电记时,芯片内部包含锂电池。
当突然掉电时,系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备下次开机读取正确的时间。
2、电子时钟结构
如图1所示,此时钟由STC89C51、LCD1602液晶屏、DS1302寄存器、4个按键、蜂鸣器等电路构成。
STC89C51作为整个系统的CPU,控制整个系统正常的运行。
LCD1602液晶屏第一行显示时钟的年、月、日,第二行显示时钟的时、分、秒。
单片机开机时,自动读取ds1302的时间初始化时分秒。
之后由单片机的定时器产生基准时间信号开始计时。
本设计具有时钟功能,在掉电情况下能完成时钟的正常运行。
四个按键用来完成时钟的设置,按键1为功能选择键,可分别进入调节1602的时钟的年、月、日、星期、小时和分钟。
按键2为数字加一键。
按键为预留键,按键4为硬件系统复位键。
蜂鸣器用来整点报时,报时30秒后,自动关闭。
二、硬件单元电路设计
1、单片机最小系统
单片机最小系统电路如图2所示,电路包括单片机、外部晶振、复位电路、外界上拉电阻等。
图2单片机最小系统
2、LCD1602显示电路
显示单元电路如图3所示,第一行显示日期,第二行显示时、分、秒以及星期。
1602的工作电压为4.5~5.5v工作电流为2.0mA(5.0v),所以采用2K的限流电阻
图3LCD1602显示电路
4、时钟按键电路
时钟按键电路如图4所示,电路中共有3个按键。
S3为功能键,调整年、月、日、时、分、秒以及星期。
第一次按下,光标在秒处闪烁,继续按下分别在秒、分、时、星期、月、日、年轮流闪烁。
闪烁处,便可以对其数据进行更改。
当按到年闪烁后,再按下一次时,便推出了调系统。
S4为加一键。
S5键为系统复位键,按下后系统将对时间设为初始化时间。
图4时钟按键电路
5、蜂鸣器电路
蜂鸣器电路电路如图5所示,蜂鸣器的正极接到vcc(+5V)的电源上面,蜂鸣器负极接到三极管的发射极E,三极管的基极B经过限流电阻R7后由单片机的P13引脚控制,当P13输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声。
当P13输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
不同的方波频率,使得蜂鸣器发出音调不同的声音。
本系统在时钟的分、秒都为0的时候,通过P13输出一个频率的方波信号,经过9013(NPN)的电流放大,驱动蜂鸣器发声,做整点报时的功能。
报时30秒后,自动关闭。
图5蜂鸣器电路
6、DS1302电路
DS1302电路如图6所示,该芯片外带32.768k的晶振,在外设纽扣电池(3v)的电压下独立工作,不受到CPU的影响。
因此具备cpu掉电能够保存数据的功能。
时钟引脚须上拉电阻。
DS1302的宽范围工作电压为2.0~5.5V,工作电流2.0V时,小于300nA,因此用4.7K的上拉电阻。
图6DS1302电路
三、程序设计
1、主程序流程图
主程序如图7所示,主程序包含:
单片机初始化、按键扫描程序、显示子程序、蜂鸣器程序。
单片机初始化主要功能是LCD的初始化、DS1302初始化、定时器初始化,读取DS1302寄存器,等待下一次中断请求。
按键扫描程序的功能是用来完成时钟的设置,通过外接键盘可分别进入调节1602的时钟的年、月、日、星期、小时和分钟。
数据写入DS1302寄存器。
显示子程序的功能是将数据显示于LCD液晶屏上。
蜂鸣器程序的功能是当整点时,蜂鸣器闹铃30秒并自动停止。
图7主程序
2、中断程序流程图
中断程序如图8所示,T0中断程序流程图定时器发送中断请求则程序进入中断服务子程序中。
定时器T0定时50ms,循环20次即1s秒钟加1,秒钟加满60则秒清零同时分钟加1;分钟加满60则分钟清零小时加1;小时加满24则小
时清零;程序返回主程序。
图8中断程序
3、按键扫描流程图
按键扫描如图9所示,程序运行时,先判断功能键sf是否已经按下,在确认按下后就将时钟停止并将功能键sfcount加1,根据键值的值不同而分别让对应的数字闪动。
然后判断是否按下增加调节键,若按下则让相应的数据增加1,当功能键sfcount等于8时则退出调节,将所有数据存入ds1302和time1表中,更新调节后的时间程序继续运行。
图9按键扫描
4、LCD显示子程序流程图
LCD显示如图10所示,程序进入LCD显示子程序流程图,。
LCD进行初始化,单片机在非忙时对LCD进行写命令、写数据,显示在LCD屏幕上。
图10LCD显示程序
5、整点闹铃流程图
闹铃流程如图11所示,当程序运行时就对当前时间进行判断,当整点且秒钟小于30秒时,就让闹铃响起来,否则就返回到主程序中,
图11整点闹铃
四、调试与结果
Ø在PCB电路图完成之际,进行烧写程序,发现程序没法烧进去。
我先检查电路原理图,没发现错误,再检测各芯片的电源线和地线是否接触良好,发现外部时钟电路一个30pF的电容接触不良,焊好后,就能成功的把程序烧进去了。
Ø在蜂鸣器整点报时的时候,蜂鸣器的声音很小。
通过分析其具体电路,对比其实际参数和理论参数时发现驱动电流太小了,即基极加的电阻太大了。
换了个较小的电阻,声音就变大了。
利用定时器中断产生1秒定时用于时钟计时,发现实际时间比理论定时时间慢,后面发现由于主程序中的子程序运行产生延迟时间不能一直处于等待中断状态,使得计时缓慢,最后通过软硬调试提高定时器初值使得实际能够更接近于1s定时。
实物图如图所示:
实物图1实物图2
最后整个实验圆满结束,达到最先课程设计功能要求,能够正常显示时间、按键调节时间、整点报时和掉电记忆功能。
心得体会:
在本次的课程设计中,我感觉最大的就是查阅了大时量的设计资料,了解了许多芯片的内部功能,及在设计过程中才发现自己原来还有好多不懂得的知识点,以前一知半解的学问用起来就真不管用了。
还有一个看似小小的程序,可能会让你调试上几百遍才能最终成功运行。
想要获得最终的成功,坚定的毅力和决心是必不可缺的。
参考文献
(1)兰吉昌.电子工程设计与应用百例系列--51单片机应用设计百例,化学工业出版社,2009.
(2)谢嘉奎.电子线路[M].高等教育出版社.2003.
(3)丁辉,姚庆文.实用单片机电子钟的设计.2003年合订本
(4)方怡冰.单片机课程的教学与实验改革[J]-电气电子教学学报2006.
(5)邢小杰.单片机电子时钟设计,【J】《中国科技博览》,2009年4期
(6)马庆勇,吴中明.基于单片机的多功能时钟控制电路,【J】《电子科技》,2009年3期
附录
1、系统电路原理图
系统电路原理图
2、整机PCB电路图
3、元器件清单:
名称
型号
数量
电阻
1K
1
2K
1
12k
1
4.7K
3
10K
1
电解电容
10u
1
晶振
12M
1
32.768K
1
瓷片电容
30P
2
液晶显示器
1602
1
STC89C
8051
1
蜂鸣器
BUZZER
1
插针
2排
底座
41p
1
时钟芯片
DS1302
1
三极管
9013
1
+5v开关电源
POWER
1
独立按键
SW-PB
4
纽扣电池
3V
1
应用程序清单:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDEC2BCD(X)((X/10)<<4|(X%10))//用于将十进制转成BCD码的宏
#defineBCD2DEC(X)(((X&0x70)>>4)*10+(X&0x0F))//用于将BCD码转成十进制的宏
voidwrite_com(ucharcom);
voidwrite_data(uchardat);
voidinit();
voidwrite_wCome();
voidwrite_time(ucharadd,uchardat);
voidwrite_xingqi(uchardat);
voidwrite_riqi(ucharadd,uchardat);
voidwrite_byte(uchardat);
ucharread_byte();
voids_write(ucharadd,uchardat);
voids_write(ucharadd,uchardat);
uchars_read(ucharadd);
voidset_ds1302(uchar*pClock);
voidrw_ds1302();
voidkeyscan();
uchardatatable[]="20--";
uchardatatable1[]=":
:
";
ucharcodewCome[]="SYS:
ClockBy:
DuFanChen";
ucharcodexingqi[]="MonTueWedThuFriSatSun";
ucharcodetime[]={0x00,0x00,0x00,0x00,0x00,0x2,0x10};
uchardatatime1[]={0x00,0x00,0x00,0x00,0x00,0x2,0x10};
ucharhour,min,sec,week,day,month,year;
ucharnum,sfcount,flag,flag1=0,flag2,s_stop=0,readtime=0;
ucharmstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1
sbitds1302_sclk=P2^5;
sbitds1302_io=P2^6;//ds1302端口
sbitds1302_ce=P2^7;
sbitacc0=ACC^0;
sbitacc7=ACC^7;
sbitlcdrs=P1^0;//端口定义
sbitlcdrw=P1^1;
sbitlcde=P1^2;
sbitle=P3^6;
sbit