单片机实训课题电子时钟班级11电气本1班学号********** 姓名陈后亥指导教师叶文通日期2013.12.30~2014.1.3摘要随着时代的进步,越来越多的电子厂品趋向于低成本,高性能,耐用性好的方向发展。
特别是趋向于自动化控制的方向走。
89c51作为控制芯片是最好不过的选择啦。
它具有强大的功能,并且简单易于操作,安全性与稳定性较高,价格便宜,适合中小型电子厂品开发中的控制器。
就像我们的课程设计,基于89c51单片机的电子时钟的课程设计。
这款课程设计用到的主要材料有89c51单片机,1602液晶显示屏,矩阵键盘,以及一些电容电阻元件等等。
使用89c51作为电子时钟的控制器很简单,就是由于其经济型与稳定性和易操作性。
显示电路上,选择使用1602液晶显示屏上。
1602不仅操作上臂数码管简单许多,而且使用1602能在很大程度上是电路图尽量简化,便于操作与错误的检修。
并且1602价格也比较便宜。
基于89c51电子时钟的设计,利用了单片机内部的一个自带定时/计数器来实现定时功能,并通过内部程序,实现对时分秒,年月日这几个输出数值的自增,并且通过编写程序,实现通过键盘控制时分秒,年月日大小的调整,这是必要的功能。
最后通过1602液晶显示电路将时间显示在其上。
这样的电子时钟比较精准,其主要误差来源与晶振的误差,即使是这样,他的误差也只是微妙级别,对于日常生活中的时间计数是足够的。
关键词:89c51单片机;1602液晶显示屏;矩阵键盘;keil软件目录摘要1单片机简介1.1 单片机概述1.2 单片机基本结构21602液晶显示屏简介1.11602显示原理1.21602指令集合3 电子时钟硬件设计3.1 功能框图3.2 单片机复位与晶振电路3.3 1602显示电路3.4 总体电路设计4 电子时钟软件设计4.1 程序流程框图4.2 程序源代码参考文献致谢1 单片机简介1.1单片机概述单品微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit), 常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
单片机作为应用最广泛的控制系统之一,具有体积小,易于控制,价格便宜,安全可靠等等优良的性能而被广泛的关注。
无论是小到儿童玩具,到工业控制系统,大到航天航空系统的设计与操作之中,随处可见单片机的踪影。
大学电子专业,电气专业,通信等专业开设单片机课程,对人才的培养无疑是有着重大的意义的。
单片机的学习,主要是注重于对单片机内部存储结构,引脚的结构与功能,以及各引脚之间的区别,用法上面的不同。
同样,单片机是一门技术,需要大量的动手实践才能真正的掌握其基本原理,才能真正的控制单片机并设计其程序,使其运行在指定的程序之下。
由于单片机在工业控制领域的广泛应用,单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的Z80是最早按照这种思想设计出的处理器,当时的单片机都是8位或4位的。
其中最成功的是INTEL的8031,此后在8031上发展出了MCS51系列单片机系统。
因为简单可靠而性能不错获得了很大的好评。
尽管2000年以后ARM已经发展出了32位的主频超过300M的高端单片机,直到目前基于8031的单片机还在广泛的使用。
在很多方面单片机比专用处理器更适合应用于嵌入式系统,因此它得到了广泛的应用。
事实上单片机是世界上数量最多处理器,随着单片机家族的发展壮大,单片机和专用处理器的发展便分道扬镳。
现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
1.2单片机基本结构单片机由运算器、控制器、存储器、定时/计数器、I/O输入输出通信接口等等。
2 1602液晶显示简介2.1 1602显示原理图2.1 1602显示屏如图2.1所示为1602显示屏的实物图,共有16各管脚,其管脚功能如下所示:1号管脚为GND,是电源接地端。
2号管脚为VCC,是电源端,接到5v电源。
3号管脚为VCOM端,为屏幕显示亮度调节段,通过一个电位器来实现亮度调节。
4号管脚为RS端,为数据/指令输入控制端。
5号管脚R/W端,为读/写控制端。
6号管脚为LCDEN端,显示屏使能端。
7号至14号管脚为数据/指令输入端口。
15号与16号管脚为电压偏置端。
1602显示屏的控制是通过4、5、7号管脚来实现控制它数据指令的写入也数据的显示功能,他的一半电路接线法是:1号与16号管脚接地;2号与15号管脚姐5V直流电源;3号管脚接一滑动变阻器并串联一电阻实现电流的调节实现显示亮度的调节;4号、5号、6号分别为控制端,接在单片机的任意三个管脚上,实现控制功能;7号至14号管脚为数据输入端;接在单片机的一组I/O口上,实现数据的传输与通信。
器电路的一般电路接法如图2.2所示。
图2.2 1602的一般接线方法1602显示屏的工作原理是根据它的时序图来实现的,如图2.3所示,为1602的时序图。
由于本课程设计只需要将数据写于1602显示屏上,所以可以将R/W端一直拉低,始终处于向1602写数据/指令的状态;在向1602写指令的时候,给RS一个高电平,进入写指令的初始段,之后再给E端口高电平,随之将数据通过一组I/O口送至1602的数据/指令输入端,即实现指令的输入;对于数据的输入,与指令的输入相似,唯一不同之处在于,指令的输入,RS位高电位,而数据的输入时,RS为低电位。
对于时序图上面的标注的时间,都是以毫秒来计数的,而单片机的机器周期或是说指令周期是以微妙来计数的,所以在此就不过多的讨论时间的准确性问题。
但对于一些其他的对时间要求很严格的芯片,就不能将时间差不考虑,不如说温度检测传感芯片18B20等等;1602可以显示两行数据,每行16个字符,不能显示汉字。
在进行操作的时候需要注意的是每行显示数据地址的选择。
1602的第一行可见地址为输入指令0X80;第二行的地址为输入指令0X80+0X40来实现的。
图2.3 1602时序图2.2 1602指令集合1602的指令如下所列:显示模式设置指令:一般使用0X38;显示开/关光标设置:00001DCB: D=1 开显示; D=0 关显示;C=1 显示光标; C=0 不显示光标;B=1 光标闪烁; B=0 光标不闪烁;000001NS: N=1 写后指针加一;N=0 写后指针减一;S=1 写后屏幕移动;S=0 写后屏幕不移动;指针设置:0X80+地址;清屏指令:0X01;1602的指令并不是很多,但是他最重要的是一定的顺序,他的指令从左一般的顺序是:第一步清屏,将指令0X01输入到1602中,实现平平功能。
第二步选择显示方式,我们的电子时钟并不需要光标的闪烁与显示,所以我们选择0X38。
第三步选择是否需要移屏,不需要的话则输入0X06;最后设置显示的地址,输入0X80+地址码(地址码为要在1602显示上的第几位)。
若需要输入到第二行,则输入0X80+0X40+地址码。
3 电子计时器硬件设计3.1 功能框图功能框图3.1所示,可由3个部分组成。
如下:图3.1 电子计时器功能3.2 单片机复位与晶振电路单片机的工作需要外部固定提供的频率,才能使单片机正常的工作,复位电路是为了方便单片机调试的时候便于恢复。
该电路使用的晶振时11.0592MHZ。
其基本的机器周期时1微妙。
复位电路是通过电容的充放电来实现的。
具体来说,在单片机上电时,电容进行充电,充满后电容支路断开。
在这整个过程中产生了一个脉冲信号并且连接到复位脚上实现复位。
对于案件复位的原理也是通过电容的放电来实现的,只不过这次是利用电容的放电性质,在两个电阻分压的基电压在加一个放电时的脉冲电压,,产生脉冲信号实现复位的。
其复位与晶振电路如图 3.2所示。
图3.2 复位电路3.3 1602显示电路本实验使用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集子库,只有并行接口,无串行接口。
1602的具体电路接法见上一章。
其事物图如图3.3所示。
图 3.3 1602液晶显示实物图3.4 总体电路设计总体电路是实现电路设计功能的一个重要部分,它是整个设计思路的载体,所以,设计一个合理,简单的电路无论是对程序的编写还是事物的制造都是非常有好处的,我们的课程设计整体电路如下图3.4所示。
它主要由:复位电路;晶振电路;单片机控制电路;键盘扫描电路;1062液晶显示电路组成。
同时,在P0口上接了一个排阻,用作上拉电阻。
这是由于P0口内部没有上拉电阻,所以输出的电流很小,无法驱动液晶显示,所以增加一个上拉电阻来驱动液晶显示。
对于整体电路图中,所用到的元器件主要有:电解电容:C1,C2; 大小为30PF。
电阻:R5,R7; 大小分别为:10KΩ,220Ω。
排阻:RP1; 大小为:4.7KΩ。
单片机:U1 型号为:AT89C51。
液晶显示屏:LCD1 型号为:1602LCD.蜂鸣器:1个按钮:4个。
4 电子计时器软件设计4.1 程序流程框图程序流程图是程序编写的原始理论依据,具有较强的综合体概括性和综合理论性。
好的程序流程图不仅能使得程序的编写变得简单,减少程序员的负担,同时还有利于编程效率的提高,有益于错误的查找,这样可以大大的增加工作效率,减少成本,提高竞争力。
如图4.1为本电路的程序流程图。
由于比较复杂,所以一些细节在图上有所省略,省略部分在程序流程图的右边有详细的注解。
部分注解:初值的装入只要指电子时钟刚上电时定时 所定义好的时间进行, 是2020年12月21号 时间为00:00:00;按键判断是指首先 判断功能键是否按下,若 按下了,则进行时间调节 如果没有按下,则进入下层。
时间的判断与清零是指:秒到六十则自动 清零且分加一,分到了六 十自动清零,时加一,时 到二十四,则时清零,月 一.年月日的调节相同每判完一次时间需 重新判断是否有键按下。
Y图4.1 电子计时器流程框图4.2 程序源代码#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit key1=P2^0; //S4 用作功能键 sbit key2=P2^1; //S13 用作增加键 sbit key3=P2^2;//s17 用作减小键sbit dula=P2^6; sbit wela=P2^7;sbit led=P0^1;sbit beep=P2^4;sbit lcden=P3^4; //液晶使能端sbit lcdrs=P3^5; //液晶数据命令选择端uchar t0; //分别是定时器0和定时器1的自加数uchar miao,fen,shi; //分别代表时间的秒,分,时uchar num;uchar key1num;uchar flag1,flag,flag_ri; //传说中的标识符uchar afen,ashi,amiao,miao1,fen1,shi1;void write_sfm(uchar add,uchar date);uchar code table[]=" chen hou hai "; ///////////////第一行是自己的名字///////////////// void delay(uint xms) //延时函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}/**********************lcd1602设置**********************************/ void write_com(uchar com){lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init_lcd(){dula=0;wela=0;lcden=0;write_com(0x38);//显示模式设置write_com(0x0c);//0x0f 开显示显示光标光标闪烁write_com(0x06);//0x06 读或写字符后地址指针加一,且光标加一write_com(0x01);//清屏所有显示清零write_com(0x80);//使光标指向外部0x80是第一位指针}void led1(){beep=0;delay(100);beep=1;}/***********************键盘检测程序*************************/ void keyscan(){if(flag1==1){if(key1==0||key2==0||key3==0){delay(5);if(key1==0||key2==0||key3==0){while(!key1||!key2||!key3);}beep=1;flag1=0;}}if(key1==0){delay(5);if(key1==0){key1num++;//记录key1被按下的次数while(!key1);led1();if(key1num==1){flag=0;TR0=0;//在设置时间是关闭定时器write_com(0x80+0x40+10);write_com(0x0f);//同时打开显示光标}if(key1num==2){flag=0;write_com(0x80+0x40+7);}if(key1num==3){write_com(0x80+0x40+4);}if(key1num==4){flag=1;TR0=1;write_com(0x80+0x40);write_com(0x0c);write_date('R');write_date('i');write_com(0x80+0x40+3);write_sfm(4,ashi); //用来显示设置闹钟时候的情景write_sfm(7,afen);write_sfm(10,amiao);}if(key1num==5){flag=1;write_com(0x80+0x40+10);write_com(0x0f);//同时打开显示光标}if(key1num==6){write_com(0x80+0x40+7);}if(key1num==7){write_com(0x80+0x40+4);}if(key1num==8){flag=0;key1num=0;write_com(0x80+0x40);write_date(' ');write_date(' ');write_sfm(4,shi);write_sfm(7,fen);write_sfm(10,miao);write_com(0x0c);}}}if(key1num!=0){if(key2==0){delay(5);if(key2==0){while(!key2);led1();if(key1num==1||key1num==5){if(flag==0) //判断条件,判断是不是为0,为0就处于非闹钟设置状态,为1就是闹钟设置状态{miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);}if(flag==1){amiao++;if(amiao==60)amiao=0;write_sfm(10,amiao);write_com(0x80+0x40+10);}}if(key1num==2||key1num==6){if(flag==0){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);}if(flag==1){afen++;if(afen==60)afen=0;write_sfm(7,afen);write_com(0x80+0x40+7);}}if(key1num==3||key1num==7){if(flag==0){shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);}if(flag==1){ashi++;if(ashi==24)ashi=0;write_sfm(4,ashi);write_com(0x80+0x40+4);}}}}}if(key3==0){delay(5);if(key3==0){while(!key3);led1();if(key1num==1||key1num==5){if(flag==0){miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);}if(flag==1){amiao--;if(amiao==-1)amiao=59;write_sfm(10,amiao);write_com(0x80+0x40+10);}}if(key1num==2||key1num==6){if(flag==0){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);}if(flag==1){afen--;if(afen==-1)afen=59;write_sfm(7,afen);write_com(0x80+0x40+7);}}if(key1num==3||key1num==7){if(flag==0){shi--;if(shi==-1)shi=24;write_sfm(4,shi);write_com(0x80+0x40+4);}if(flag==1){ashi--;if(ashi==-1)ashi=24;write_sfm(4,ashi);write_com(0x80+0x40+4);}}}}}/************************定时器设置函数***************************/void init_timer() //定时器初始化设置{TMOD=0x11;TH0=(65536-45872)/256; //定时器0高位和低位赋上初值TL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //打开定时器0的中断TR0=1; //启动定时器0}void init(){uchar num;fen=0;miao=0;shi=0;t0=0;key1num=0;init_lcd();for(num=0;num<15;num++) //输出LCD端的第一行{write_date(table[num]);delay(5);}write_com(0x80+0x40+6);write_date(':'); //冒号delay(5);write_com(0x80+0x40+9);write_date(':');delay(5);write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);init_timer();}void write_sfm(uchar add,uchar date) //显示函数把数字分离再显示{uchar shiwe,gewe;shiwe=date/10;gewe=date%10;write_com(0x80+0x40+add);write_date(0x30+shiwe);write_date(0x30+gewe);}void main(){init();while(1){keyscan(); //不断扫描键盘}}void timer0() interrupt 1 //定时器0的中断{TH0=(65536-45872)/256;TL0=(65536-45872)%256;t0++;if(t0==20){t0=0;if(miao==59){miao=-1;if(fen==59){fen=0;if(shi==24){shi=-1;}shi++;if(flag==0){write_sfm(4,shi);}}fen++;if(flag==0){write_sfm(7,fen);}}miao++;if(flag==0){write_sfm(10,miao);}if(miao==amiao){if(afen==fen){if(ashi==shi){flag1=1;beep=0;}}}if(flag1==1){if(afen!=fen){beep=1;}}}}参考资料【1】李华.MCS-51系列单片机实用接口技术(第2版) 北京航空航天大学出版社 2001.【2】单片机实验与实践教程北京航空航天大学出版社何立民等2004年7月.【3】求是科技.单片机典型模块设计实例导航(第2版)人民邮电出版社,2008.【4】THKSCM-1型单片机实验系统实验指导书.【5】数字控制与PLC实验室”THKSCM-1型单片机实验系统”.致谢首先要感谢我的指导老师,朱群峰老师,在指导老师细心的指导下,从选定课题,到资料收集,再到电路的设计与程序的仿真,直到最后论文的编写,朱群峰老师都给了我很多的帮助很多有建设性的意见。