单片机定时闹钟设计.docx
- 文档编号:30728809
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:16
- 大小:37.52KB
单片机定时闹钟设计.docx
《单片机定时闹钟设计.docx》由会员分享,可在线阅读,更多相关《单片机定时闹钟设计.docx(16页珍藏版)》请在冰豆网上搜索。
单片机定时闹钟设计
Proteus课程
定时闹钟的设计
专业:
电子信息科学与技术
学号:
**********
XX:
陈宇
摘要
本次课程设计是在单片机授课结束的情况下,通过老师的指导和小组同学的协助,独立自主的完成项目设计,我们小组选定的是定时闹钟的设计,下面简单阐述一下该项目的设计思路。
利用动态数码管作为显示器,K20-K27作为输入按键,蜂鸣器作为声音输出制作一个定时闹钟。
最后结果要求做到:
1、正确显示时分。
2、可以利用按钮调整时间和设定闹钟时间。
3、当时间到达设定的闹钟时间时,蜂鸣器发出嘀、嘀、嘀的报警声。
4、通过串口在PC上设定时间和闹钟。
关键字:
定时闹钟
1.设计思想
2.STC89C52RC单片机简要介绍
3.内部定时器计数器中断系统简介
4.键盘和LED数码管显示器简介
5.程序流程图及设计相关事宜
6.课程设计感悟总结
附录:
7.参考文献
8.Proteus软件仿真图
9.基于C语言的程序设计
STC89C52RC单片机简要介绍
单片机应用系统由硬件系统和软件系统两部分组成。
硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。
软件系统包括监控程序和各种应用程序。
在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。
与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。
在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。
在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。
配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。
在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。
显示器可以是LED指示灯,也可以是LED数码管,也可以是LCD显示器,还可以使用CRT显示器。
单片机应用系统中键盘一般用的比较多
是矩阵键盘,显示器用的比较多的是LED数码管还LCD显示器。
内部定时器计数器中断系统
1、MCS-51系列中51子系列有两个16位的可编程定时\计数器可:
定时\计数器T0和定时\计数器T1。
它由加法计数器、方式寄存器TMOD、控制寄存器TCON等组成。
方式寄存器用于设定定时计数器T0和T1的工作方式,控制寄存器用于对定时计数器启动、停止进行控制。
2、每个定时计数器既可以对系统时钟计数实现定时,也可以外部信号计数实现计数功能通过编程设定来实现。
3、每个定时计数器都有多种工作方式,其中T0有四种工作方式,T1有三种工作方式,T2有三种工作方式。
通过编程可设定工作于某种方式。
四种工作方式为:
13位定时\计数器、16位定时\计数器、8位自动重置定时\计数器、两个8位定时\计数器(只有T0有)
4、每一个定时计数器定时计数时间到时产生溢出,使相应的溢出位置位,溢出可通过查询或中断方式处理。
中断系统:
1、MCS-51单片机提供5个硬件中断源,2个外部中断源,2个定时计数器T0和T1的溢出中断TF0和TF1,1个串行口发送TI和接收RI中断。
2、MCS-51单片机中没有专门的开中断和关中断指令,对各个中断源的允许和屏蔽是由内部的中断允许寄存器IE的各位来控制的。
中断允许寄存器IE的字节地址为A8H,可以进行位寻址。
系统复位时,中断允许寄存器IE的内容为00H,如果要开放某个中断源,则必须使IE中的总控置位和对应的中断允许位置“1”。
3、MCS-51单片机有5个中断源,为了处理方便,每个中断源有两级控制,高优先级和低优先级。
通过由内部的中断优先级寄存器IP来设置,中断优先级寄存器IP的字节地址为B8H,可以进行位寻址。
如果某位被置“1”,则对应的中断源被设为高优先级;如果某位被清零,则对应的中断源被设为低优先级。
对于同级中断源,系统有默认的优先权顺序,从高到低优先权顺序为外部中断0、定时计数器T0中断、外部中断1、定时计数器T1中断、串行口中断。
通过设置中断优先级寄存器IP能够改变系统默认的优先级顺序。
4、MCS-51单片机响应中断的条件为:
中断源有请求且中断允许。
键盘和LED数码管显示器简介
键盘是单片机应用系统中最常用的输入设备,在单片机应用系统中,操作人员一般都是通过键盘向单片机系统输入指令、地址和数据,实现简单的人机通信。
键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合。
键盘的结构形式一般有两种:
独立式键盘和矩阵式键盘。
矩阵式键盘的工作方式有3种:
查询工作方式、定时扫描工作方式和中断工作方式。
LED数码管显示器在单片机应用系统中,经常用到LED数码管作为显示输出设备,LED数码管显示器虽然显示信息简单,但它具有显示清晰、亮度高、使用电压低、寿命长、与单片机接口方便等特点,基本上能够满足单片机应用系统的需要,所以在单片机应用系统中经常用到。
LED数码管显示器是由发光二极管按一定的结构组合起来的显示器件。
在单片机应用系统中通常使用的是8段式LED数码管显示器,它有共阴极和共阳极两种。
所谓译码方式是指由显示字符转换得到对应的字段码的方式。
对于LED数码管显示器,通常的译码方式有两种:
硬件译码方式和软件译码方式。
LED数码管在显示时,通常有两种显示方式:
静态显示方式和动态显示方式。
在使用时可以把它们组合起来。
在实际应用时,如果数码管个数较少,通常用硬件译码静态显示,在数码管个数较多时,则通常用软件译码动态显示。
主程序流程图
定时器/计数器T0用于时间计时。
选择方式1,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加1,秒单元加到60则对分单元加1,同时秒单元清0;分单元加到60则对时单元加1,同时分单元清0;时单元加到24则对时单元清0,标志一天时间计满。
在对各单元计数的同时,把它们的值放到存储单元的指定位置。
定时器/计数器T0中断服务程序流程图,如图,见下页
设计思想及操作
用定时/计数器T0,工作于定时,采用方式1,对12MHZ的系统时钟进行定时计数,设初值。
形成定时时间为50ms。
用片内RAM的7BH单元对50ms计数,计20次产生秒计数器78H单元加1,秒计数器加到60则分计数器79H单元加1,。
然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。
显示格式为分十位、分个位---秒十位、秒个位。
在处理过程中加上了按键判断程序,能对按键处理。
按键处理设置为:
如没有按键,则时钟正常走时。
当按下K0按键时,进入调分状态,时钟停止走动;按K1可K2按键可进行加1或减1操作;继续按K0键可分别进行分的调整;最后按K0键将退出调整状态,时钟开始计时运行。
1、在PROTEUS中设计硬件
PROTEUS软件使用过程如下:
1)选择元器件
2)放置元器件
3)连线
4)添加程序
5)运行仿真
2、在KEIL51中编写程序,编译、连接形成HEX文件。
3、在PROTEUS中把HEX文件加载到单片机芯片上。
4、运行仿真看结果。
参考程序
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodesegcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9
ucharcodesegcode2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点0~9
ucharbuffer[]={0,0,0,0};
ucharbuffer2[]={0,0,0,0};//闹钟
uinthou,min,sec;
uinthou2,min2=0;//闹钟
uinti,status,num;
bitflag,flag1,keyrelease;
sbitalarm=P3^7;
ucharbuf,keyinput;
voiddisplay();
voidkeyscan();
voidkeyprocess(unsignedcharkey);
voiddelayMS(uintt)
{
uinti;
while(t--)
for(i=0;i<125;i++);
}
voidinit()//初始
{
keyrelease=1;
buf=0x0f;
min2=2;//避免打开就鸣叫,设闹钟分=2
flag=0;
TMOD=0x21;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
TR1=1;
IP=0x10;
TR0=0;
IE=0x92;//开总、定时器0,串口中断
}
voidmain()
{
init();
while
(1)
{
keyscan();
display();
if(hou==hou2&&min==min2&&sec<5)//仿真使用
{
alarm=~alarm;
}
//if(hou==hou2&&min==min2&&sec<5)//实际硬件使用
//{
//alarm=0;
//}
//else
//alarm=1;
}
}
voidkeyscan()//键盘扫描
{
keyinput=P2&0x0f;
if(keyinput!
=0x0f)
{
delayMS(5);
if(keyinput!
=0x0f)
{
if(keyrelease==1)//不可缺
{
keyrelease=0;//按住不放
buf=keyinput;//buf用来暂时存放键值
}
}
}
else//没按下
{
while(keyinput!
=0x0f);//如果不松手就停在此处
keyrelease=1;
keyprocess(buf);
buf=0x0f;
}
}
//按键处理函数
voidkeyprocess(unsignedcharkey)//键值处理,正常计时,设置时分秒
{switch(key)
{
case0x0e:
num++;//按一下K1,开始计时;再按,停止计时
if(num==1){TR0=1;flag1=0;}//stop
if(num==2){TR0=0;flag1=0;}//continue
if(num==3){num=0;flag1=1;}//按3下,令flag1=1,进入闹钟
break;//这个break不加,会导致只有在暂停的情况下才能加减
时分
case0x0d:
status++;//按下K2设置键,按一下,选分,再按选时
if(status>=3)status=0;
break;
case0x0b:
switch(status)//按下K3加1键,2种模式下加1
{
case1:
if(flag1==0)
{if(min<59)min++;
elsemin=0;
}
if(flag1==1)
{
if(min2<59)min2++;
elsemin2=0;break;
}
break;
case2:
if(flag1==0)
{if(hou<23)hou++;
elsehou=0;
}
if(flag1==1)
{
if(hou2<23)hou2++;
elsehou2=0;
}
break;
default:
break;//case0
}
break;
case0x07:
switch(status)//按下K4减1键
{
case1:
if(flag1==0)
{if(min>0)min--;
elsemin=59;
}
if(flag1==1)
{
if(min2>0)min2--;
elsemin2=59;
}
break;
case2:
if(flag1==0)
{if(hou>0)hou--;
elsehou=23;
}
if(flag1==1)
{
if(hou2>0)hou2--;
elsehou2=23;
}
break;
default:
break;//case0
}
break;
default:
break;
}
}
voiddisplay()
{
if(flag1==0)
{
buffer[0]=hou/10;//显示时的十位
buffer[1]=hou%10;//显示时的个位
buffer[2]=min/10;//显示分的十位
buffer[3]=min%10;//显示分的个位
P2=0xef;//位选第1个管
P0=segcode[buffer[0]];
delayMS
(1);
P2=0xdf;//位选第2个管
if(flag==1)
P0=segcode[buffer[1]];
else
P0=segcode2[buffer[1]];
delayMS
(1);
P2=0xbf;//位选第3个管
P0=segcode[buffer[2]];
delayMS
(1);
P2=0x7f;//位选第4个管
P0=segcode[buffer[3]];
delayMS
(1);
}
if(flag1==1)
{
buffer2[0]=hou2/10;//显示时的十位
buffer2[1]=hou2%10;//显示时的个位
buffer2[2]=min2/10;//显示分的十位
buffer2[3]=min2%10;//显示分的个位
P2=0xef;//位选第1个管
P0=segcode[buffer2[0]];
delayMS
(1);
P2=0xdf;//位选第2个管
P0=segcode2[buffer2[1]];//便于区别,闹钟时间都带有小数点
delayMS
(1);
P2=0xbf;//位选第3个管
P0=segcode[buffer2[2]];
delayMS
(1);
P2=0x7f;//位选第4个管
P0=segcode[buffer2[3]];
delayMS
(1);
}
}
voidtimer0()interrupt1
{
staticuintcount;
TH0=(65536-5000)/256;//定时器0设置初始值1ms中断初始值
TL0=(65536-5000)%256;
TR0=1;
count++;//正常计时
if(count>=100)//定时1S到,以下为时钟的正常走钟逻辑
{
flag=1;
if(count>=200)
{
flag=0;
count=0;
sec++;
if(sec>=60)
{
sec=0;min++;
if(min>=60)
{
min=0;hou++;
if(hou>=24)
{
hou=0;
}
}
}
}
}
}
voidsint()interrupt4
{
i=++i%4;
if(RI&&i==1)
{
RI=0;
hou=SBUF;
}
if(RI&&i==2)
{
RI=0;
min=SBUF;
}
if(RI&&i==3)
{
RI=0;
hou2=SBUF;
}
if(RI&&i==0)
{
RI=0;
min2=SBUF;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 定时 闹钟 设计