单片机定时计数器设计方案.docx
- 文档编号:29061743
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:36
- 大小:152KB
单片机定时计数器设计方案.docx
《单片机定时计数器设计方案.docx》由会员分享,可在线阅读,更多相关《单片机定时计数器设计方案.docx(36页珍藏版)》请在冰豆网上搜索。
单片机定时计数器设计方案
单片机定时计数器设计方案
1设计方案
1.1设计要求
用AT89S52单片机,在1602LCD上显示年月日、星期、时分秒设计数字钟,内有4组可设置的定时开/关,控制一路开关量输出。
定时开关的设置分为单次操作(2011年6月25日8:
00开2011年6月26日18:
00关),周期操作(如周三8:
00开,周四16:
00关)。
数码管显示时间(单位秒)与设置值(单位分钟),用发光二极管表示周期与单次操作。
1.2设计方案论证
本设计是纯粹的应用性设计,主要以实现计时、定时、温度显示等功能为最终目的。
设计以Atmel公司的AT89S52为核心,在最小系统的基础上扩展键盘,数字温度计,以及LCD显示模块,硬件设计简单节约,其功能的实现主要靠软件设计,所以软件在本设计中是最为重要的,在计时设计思路上有两种方案可以选取。
方案一:
选用外部时钟芯片,单片机只负责其数据的存取读写以及外部辅助电路的扩展,这种方案的优点是计时准确,软件编写相对简单,但其要求对其芯片必须要有比较深的了解
方案二:
利用单片机的内部时钟和定时器进行计数,这种方案电路简单,容易实现,但时间容易丢失,且长时间计数会有误差,而且软件编写也相对复杂。
考虑到本次设计的目的,采用方案二,并加入了年月日的扩展,由于时间和精力有限年月日只是进行简单的模拟,没有精确的进行计算。
只是进行适当的扩展。
本设计包括硬件设计和软件设计两部分。
主要硬件有AT89S52单片机、字符型液晶显示模块HY1602A和若干按键等。
软件大致思路为:
使用12MHz的晶振,单片机内部的定时器0工作在方式1,每计数50000个机器周期(即50ms)产生一次中断,中断20次就是一秒,这样就可以实现精确计时的目的。
在把实时数据显示在LCD1602上的同时,不断扫描按键,如果有按键按下,则对按键做出相应的响应。
2硬件设计
2.1器件选型
本设计选取主控MCU为Atmel公司的AT89S52,显示器件选择市面上常见的字符型液晶显示模块HY1602A。
2.2器件介绍
2.2.1单片机AT89C51
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
.主要特性:
与MCS-51兼容
4K字节可编程闪烁存储器
寿命:
1000写/擦循环
数据保留时间:
10年
全静态工作:
0Hz-24Hz
三级程序存储器锁定
128*8位内部RAM
32可编程I/O线
两个16位定时器/计数器
5个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
.管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端口保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3.振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
4.芯片擦除:
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。
在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
2.2.2LCD1602显示模块
工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行)
注:
为了表示的方便,后文皆以1表示高电平,0表示低电平。
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶屏。
管脚功能
1602采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VCC接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
3.3V或5V工作电压,对比度可调
内含复位电路
提供各种控制命令,如:
清屏、字符闪烁、光标闪烁、显示移位等多种功能
有80字节显示数据存储器DDRAM
内建有192个5X7点阵的字型的字符发生器CGROM
8个可由用户自定义的5X7的字符发生器CGRAM
3软件设计
3.1软件设计思路
3.1.1实现功能
用AT89S52单片机,在1602LCD上显示年月日、星期、时分秒。
内有4组可设置的定时开/关,控制一路开关量输出。
定时开关的设置分为单次操作(2011年6月25日8:
00开2011年6月26日18:
00关),周期操作(如周三8:
00开,周四16:
00关)。
具备闹钟和时间段的设定功能,闹铃方式为蜂鸣器持续响10秒钟,或者用按键手动关闭响铃。
可以用键盘调整时间、设定开关时间和方式。
复位时间是2011年1月1日00:
00:
00。
3.1.2编程思路
1.给以下变量赋初值:
年(Year)、月(Month)、日(Day)、时(Hour)、分(Min)、秒(Sec)。
2.因为晶振频率为12MHz,所以计数频率为12MHz/12=1MHz,这就需要计数器0计数1000000次才可以达到一秒钟。
我们用定时器0工作在方式1状态,每次计数50000次,如此进行20次,即可凑够一秒钟。
这样可以得到初始化定时器的控制字:
TMOD=0x01,计数初值65536-50000=15536即0x3cb0,这样就可以设计一个计数一秒的函数。
3.读相应变量的值,送入LCD显示时间等信息。
4.不断的扫描按键,并且响应按键输入。
在进入设定模式后,所有时间变量被过渡变量代替,如果确认设置,则过渡变量赋给时间变量,如果取消设置,则还使用原时间变量。
3.1.3操作及功能介绍
定时器能显示年月日、星期、时分秒。
内有4组可设置的定时开/关,控制一路开关量输出。
定时开关的设置分为单次操作(2011年6月25日8:
00开2011年6月26日18:
00关),周期操作(如周三8:
00开,周四16:
00关)。
下面具体具体介绍按键和LED的功能:
1、K1为时间的小时设定键,按下后将进入时间的设定,按K1是对时间小时的设定。
2、K2为时间的分钟设定键,当处于时间的调整时,按它可以对时间的分钟进行调整,当未处于时间调整时,按下第一次为开关量的开启时间,按下第二次为开关量的关闭时间。
3、K3为设定时间完成的退出键和进入开关量时间的设定键,但时间设置完成以后,按下K3键将进入正常的计时状态;当要进入定时任务时间设定时,按下此键将进入定时任务开始时间的设定,设定完成后退出进入正常计时,然后再按下此键进入定时任务关闭时间的设定。
4、K4为定时任务是否开启的设定键,若LED的黄灯是亮的说明任务是开启的,若没有亮则是关闭的。
5、K5为定时任务运行的方式:
周期与单次的切换,若绿灯亮则为周期,没亮则为单次。
6、K6、K7、K8依次为年月日的设定键。
3.2主程序流程图
NY
Y
N
图3-1主程序流程图
4仿真图
5设计体会及小结
本设计在Proteus仿真软件测试成功,但是,此电子钟有自身的先天缺陷。
首先,由于采用单片机内部定时器产生时间信号,所以如果时钟意外掉电,则会丢失当前的时间和闹钟等数据,需要重新设定。
由于本人能力和时间有限,只能暂时实现本既定方案。
课设也大大锻炼了我们的自学能力。
比如我们要用到的很多芯片,不可能样样都在课本上学习过的,学过的毕竟是少数,在以后的学习实践和工作中,要用的东西五花八门,怎么可能四年都学遍呢?
而且像我们学的这门迅速发展中的学科,知识更新一日千里,要准备好学习一辈子的,在大学里课堂上所学的只是方法,至于其中的内容,还要靠自己去挖掘,所谓“师傅领进门,修行在个人”就是这个道理,这才是成年人的学习生活,因此,通过课设,我们掌握了一项很基本但对于我们来讲很重要且具有十分深刻意义的技能,就是学会自学,这是前所未有的。
参考文献
[1]王质朴,吕运鹏.MCS-51单片机原理接口与应用,北京理工大学出版社,2009.
[2]郑学坚;周斌.微型计算机原理及应用[M].北京:
清华大学出版社,2001
[3]谭浩强.C程序设计(第三版).北京清华大学出版社,2007.
[4]康光华.电子技术基础(模拟部分).北京:
高等教育出版社,2004.
[5]康光华.电子技术基础[M].北京:
高等教育出版社,2006:
124-135.
[6]谭浩强.C程序设计[M].北京:
清华大学出版社,2005:
82-135.
附录1硬件电路设计图
附录2主程序
#include
#defineuintunsignedint
#defineucharunsignedchar
uintmiao,fen,fen1,shi,shi1,flag1,flag2,flag3,aa,K1num,K2num,K3num,K4num,N,i,dan1,k,fen2,shi2,a,m,Month=1,Year=2011,Day=1,K6num,num,Year1,Year2,Day1,Day2,Month1,Month2;//K1num-K1按键被按下的标记变量,K2num-K2按键被按下的标记变量,K3num=0-K3按键被按下的标记变量
sbitK1=P1^0;//四个按键
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitK5=P1^4;
sbitK6=P1^5;
sbitK7=P1^6;
sbitK8=P1^7;
sbitdan=P2^6;
sbitdan2=P2^7;
sbitrs=P2^0;
sbitlcden=P2^2;
sbitled=P2^3;//发光二极管控制端
sbitbeep=P2^4;//蜂鸣器控制端
sbitrelay=P2^5;//继电器控制端
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//液晶写命令函数
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)//液晶写数据函数
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_sfm(ucharadd,uchardate)//液晶写时分秒函数
{
ucharshi,ge;
shi=date%100/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_sfm1(ucharadd,uchardate)//液晶写时分秒函数
{
ucharshi,ge;
shi=date%100/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_sfm2(ucharadd,uchardate)//液晶写时分秒函数
{
ucharqian,bai,ge,shi;
qian=date/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidinit()//初始化函数
{
aa=0;//中断次数标志
K1num=0;//K1按键被按下的标记变量
K2num=0;//K2按键被按下的标记变量
K3num=0;//K3按键被按下的标记变量
K4num=0;
flag1=1;//控制lcd屏刷新的变量
flag2=1;//控制闹钟响闹和继电器开启关闭的标记
flag3=1;//控制闹钟响起时,按下K4停止闹钟响闹的标记
led=1;//发光二极管初始化
relay=0;//继电器初始化
N=100;//系统启动时,闹钟时间到发出的声音为连续三次发出“哗”的一声
miao=0;//系统初始化时间
fen=0;
shi=0;
fen1=1;//初始化闹钟的时间
shi1=0;
beep=0;//蜂鸣器初始化
lcden=0;//液晶使能端初始化
write_com(0x38);//1602液晶初始化,设置16*2显示。
5*7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针自动加1
write_com(0x01);//显示清0,数据指针清0
write_com(0x80);//将数据指针定位到第一行,第一个字处
//for(num=0;num<15;num++)//显示闹钟标示:
TIMINGCLOCK
//{
//write_date(table[num]);
//delay(10);
//}
write_com(0x80+0x40+7);//写出时间显示部分的两个冒号
write_date(':
');
write_com(0x80+0x40+10);//写出时间显示部分的两个冒号
write_date(':
');
write_com(0x80+8);//写出时间显示部分的两个冒号
write_date('-');
write_com(0x80+11);//写出时间显示部分的两个冒号
write_date('-');
write_sfm(8,fen);//送去液晶显示秒,分,时
write_sfm(5,shi);
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;//定时器装初值
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
voidkeyscan()//键盘扫描函数
{
if(K1==0&&K3num==0)//判断K1按下,按下前没有按下K3键,则开始修改时间
{
delay(5);
if(K1==0&&K1num==0)
{
K1num=1;
while(!
K1)//判断是否松开按键,后同
if(K1num==1)
{
TR0=0;//关闭计数器0
write_com(0x80+0x40+9);//第一次按下光标定位到分钟位置
write_com(0x0f);//光标开始闪烁
}
}
}
if(K3==0&&K3num==0&&K1num==0)//判断K3首次被按下,则设置闹钟
{
delay(5);//延时消抖,后同
if(K3==0)
{
flag1=0;
write_com(0x80+0x40+9);//第一次按下光标定位到分钟位置
while(!
K3);
K3num=1;
write_sfm(8,fen1);//送去液晶显示定时的分,时
write_sfm(5,shi1);
write_com(0x0f);//光标开始闪烁
write_com(0x80+0x40+9);//显示位置回到调节处
}
}
if(K3==0&&K3num==1&&K1num==0)//判断K3首次被按下,则设置闹钟
{
delay(5);//延时消抖,后同
if(K3==0)
{
flag1=0;
write_com(0x80+0x40+9);//第一次按下光标定位到分钟位置
while(!
K3);
K3num=2;
write_sfm(8,fen2);//送去液晶显示定时的分,时
write_sfm(5,shi2);
write_com(0x0f);//光标开始闪烁
write_com(0x80+0x40+9);//显示位置回到调节处
}
}
if(K1==0&&K1num==1)//判断K1按下,修改系统时间的小时
{
delay(5);
if(K1==0)
{
write_com(0x80+0x40+6);//光标定位到小时位置
K1num=1;//置K1num=1
while(!
K1);
shi++;//则调整时加1
if(shi==24)shi=0;//若满24后将清零
write_sfm(5,shi);//每调节一次送液晶显示一下
write_com(0x80+0x40+6);//显示位置重新回到调节处
}
}
if(K2==0&&K1num==1)//判K2按下,修改系统时间的分钟
{
delay(5);
if(K2==0)
{
write_com(0x80+0x40+9);//光标定位到分钟位置
K1num=1;
while(!
K2);
fen++;//则调整分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 定时 计数器 设计方案