可编程倒计时装置单片机课程设计Word格式文档下载.docx
- 文档编号:3145397
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:26
- 大小:640.68KB
可编程倒计时装置单片机课程设计Word格式文档下载.docx
《可编程倒计时装置单片机课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《可编程倒计时装置单片机课程设计Word格式文档下载.docx(26页珍藏版)》请在冰点文库上搜索。
D5
D4
D3
D2
D1
D0
∣
定时器T1
︱
|定时器T0
︱
其各位功能是:
位7GATE---T1的门控位,当GATA=0时,只要控制位TR1,即可启动定时器开始工作;
当GATE=1时,除需要将TR1置1外,还要使INTI引脚为高电平,才能启动相应的定时器开始工作。
位6C/T---T1的功能选择位:
当C/T=0时,T1为定时器方式;
当C/T=1时,T1为计数器方式。
位5和位4M1和M0---T1的方式选择位:
由这2位的组合可以定义T1的3种工作方式。
位3GATE---T0的门控制:
当GATE=0时,只要控制TR0置1,即可启动定时器T0开始工作;
当GATE=1时,除需要将TR0置1外,还要使INTO引脚为高电平,才能启动相应的定时器开始工作。
位2C/T---T0的功能选择位:
TMOD不能进行位寻址,只能用字节传送指令设置定时器工作方式,低半字节定义定时器1。
复位时,TMOD所有位均为0,定时器处于停止工作状态。
中断部分的介绍:
CPU正在执行主程序时,单片机外部或内部发生的某一事件(如外部设备产生的一个电平的变化,一个脉冲沿的发生或内部计数器的计数溢出等)请求CPU迅速去处理,于是,CPU暂时中止当前的工作,转到中断服务处理程序处理所发生的事件。
中断服务处理程序处理完该事件后,再回到原来被中止的地方,继续原来的工作(例如,继续执行被中断的主程序),这称为中断。
CPU处理事件的过程,称为CPU的中断响应过程。
能够实现中断处理功能的部件称为中断系统;
产生中断的请求源称为中断请求源。
中断源向CPU提出的处理请求,称为中断请求(或中断申请)。
中断的工作:
保护现场、恢复现场、中断返回。
中断方式的优点是大大地提高了CPU的工作效率。
MCS-51的中断优先级结构。
中断系统有两个不可寻址的“优先级激活触发器”。
其中一个指示某高优先级的中断正在执行,所有后来的中断均被阻止。
另一个触发器指示某低优先级的中断正在执行,所有同级的中断都被阻止,但不阻断高优先级的中断请求。
在同时收到几个同一优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的查询顺序。
这相当于在同一个优先级内,还同时存在另一个辅助优先级结构,其查询顺序如下:
中断源
中断级别
外部中断0
最高
T0溢出中断
外部中断1
T1溢出中断
串行口中断
最低
一个中断请求被响应,需满足以下必要条件:
(1)CPU开中断,即IE寄存器中的中断总允许位EA=1。
(2)该中断源发出中断请求,即该中断源对应的中断请求标志为“1”。
(3)该中断源的中断允许位=1,即该中断没有被屏蔽。
(4)无同级或更高级中断正在被服务。
2.2.电路设计
总体设计硬件电路图
其中包括输入部分、显示部分和控制部分,这正好是设计思想的体现
输入部分的电路图:
该系统的输入由4X4的矩阵键盘提供。
其中P1.4~P1.7为扫描输出线,P1.0~P1.3为扫描输入线。
具体扫描时,先确定列号,再确定行号,人工给按键一个编码,然后根据其编码值进行相关操作。
输入选择时:
通过K13~K15选择时,分,秒输入。
软件上对这个操作进行状态开关改变。
以备下一步输入数字选择存放单元。
数字输入时:
除了K4无功能键,其他10个位0~9的数字输入。
在软件上定义为先输入一位存放在个位,再输入一位为先前输入值*10+本次输入值。
针对输入过大,如秒,分超过60则改变为最大值59。
显示部分的电路图:
输出方面有3个部分,6个七端数码管构成了倒计时显示部分,蜂鸣器接受方波发出声音,是倒计时到的一个声音标志。
LED为倒计时状态指示灯。
数码管采用动态扫描方式,对输出数组中的数字进行依次输出,选通线为与输出数字相匹配的输出选通数组中。
控制部分的电路图:
AT89S52对输入和输出进行对应的控制,同时蜂鸣器可以根据方波的频率发出声音信号,由此根据它对计时到与否进行判断。
该设计中蜂鸣器在计时时间到后会一直响。
LED与启动/停止键按下相关,除了开机自检LED只受启动/停止键状态控制,若成功启动,LED亮,计时时间到停止时,LED灭。
3.程序设计框图
3.1.主程序
3.2.数码管显示部分
3.3键盘输入部分
4.资源分配表
本设计的资源分配表如下表所示:
1.XTAL1,XTAL2
构成内部自激振荡器,产生时钟脉冲信号
2.RST
单片机的复位
3.P0.0—P0.7
控制7段数码管显示倒计时
4.P1.0---P1.7
由键盘输入预置倒计时分秒
5.P2.0---P2.3
数码管管脚控制选通
6.P3.0---P3.3
控制音频输出
7.P3.6
指示灯显示
5.源程序代码
#include<
reg52.h>
absacc.h>
#defineTIME1H0x40
#defineTIME1L0x98//定时器1溢出时间:
49ms,用于计时模式的计数增加。
#defineLEDCHARP0//LED字符I/O口,P1.0~7对应A~DP
#defineLEDSELECTP2//LED选择I/O口.P0.0~5对应LED的1~6
#defineSCANPORTP1//键盘扫描端口
//*********************************全局变量
unsignedcharcodeuca_LEDCode[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//仿真用
//{0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};
//0,1,2,3,4,5,6,7,8,9
unsignedcharuca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};
//LINE1234//键盘扫描线
unsignedcharcodeuca_LEDSelect[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//分别点亮第6,5,4,3,2,1号灯.
unsignedcharuca_LedNum[6];
//存放数字的各个位
unsignedcharuc_DisCount=1;
//定时器0定时刷新LED计数。
unsignedcharuc_TimeCount=0;
//定时器1定时计数。
unsignedlongul_Number=0;
//LED显示数字。
unsignedcharKeyValue;
bitsethour=0;
bitsetminute=0;
bitsetsecond=0;
bitsettime=0;
bittimesup=0;
unsignedcharhour;
unsignedcharminute;
unsignedcharsecond;
unsignedlongtemp;
sbitbuzz=P3^0;
sbitledstate=P3^6;
//********************************显示函数
unsignedchar*pucLedNum(unsignedlongulNumber)
{
if(ulNumber>
999999)
ulNumber=999999;
if(ulNumber<
0)
ulNumber=0;
uca_LedNum[0]=ulNumber/100000;
//最高位
uca_LedNum[1]=(ulNumber-100000*(long)uca_LedNum[0])/10000;
uca_LedNum[2]=(ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1])/1000;
uca_LedNum[3]=(ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]-1000*(long)uca_LedNum[2])/100;
uca_LedNum[4]=(ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]-1000*(long)uca_LedNum[2]-100*(long)uca_LedNum[3])/10;
uca_LedNum[5]=(ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]-1000*(long)uca_LedNum[2]-100*(long)uca_LedNum[3]-10*(long)uca_LedNum[4]);
returnuca_LedNum;
}
voidvShowOneNum(unsignedcharucOneNum,unsignedcharucOrder)
LEDSELECT=uca_LEDSelect[ucOrder];
//ucOrder:
0~5(代表从左到右1~6)
LEDCHAR=uca_LEDCode[ucOneNum];
//********************************键盘扫描函数
unsignedcharucKeyScan()
unsignedcharucTemp=0;
//扫描状态暂存。
unsignedcharucRow=0,ucLine=0;
//行号,列号。
unsignedcharl;
for(ucLine=0;
ucLine<
4;
ucLine++)//列扫描
{
SCANPORT=uca_LineScan[ucLine];
//输出扫描电位。
for(l=0;
l<
50;
l++);
//延时20毫秒
ucTemp=SCANPORT&
0x0F;
//输入扫描电位,并屏蔽高4位。
if(ucTemp!
=0x0F)//判断该列是否有按键按下,有则判断出行号。
{
switch(ucTemp)
{
case0x0E:
ucRow=10;
break;
case0x0D:
ucRow=20;
case0x0B:
ucRow=30;
case0x07:
ucRow=40;
default:
ucRow=50;
}
break;
}
}
for(l=0;
//延时20毫秒
SCANPORT=0x0F;
//恢复P2口。
returnucRow+ucLine+1;
//返回按键编码。
格式为2位数,高位为行号,低位为列号。
voidvKeyProcess(unsignedcharucKeyCode)
if(sethour==1)
{
switch(ucKeyCode)
case11:
hour=hour*10+7;
//'
7'
case12:
hour=hour*10+8;
8'
case13:
hour=hour*10+9;
9'
case14:
break;
//时针
case21:
hour=hour*10+4;
4'
case22:
hour=hour*10+5;
5'
case23:
hour=hour*10+6;
6'
case24:
//分针
case31:
hour=hour*10+1;
1'
case32:
hour=hour*10+2;
2'
case33:
hour=hour*10+3;
3'
case34:
//秒针
case41:
case42:
hour=hour*10+0;
0'
case43:
//确认
case44:
//退出
default:
ul_Number=(long)hour*10000;
}
if(setminute==1)
minute=minute*10+7;
minute=minute*10+8;
minute=minute*10+9;
minute=minute*10+4;
minute=minute*10+5;
minute=minute*10+6;
minute=minute*10+1;
minute=minute*10+2;
minute=minute*10+3;
minute=minute*10+0;
ul_Number=(long)minute*100;
if(setsecond==1)
second=second*10+7;
second=second*10+8;
second=second*10+9;
second=second*10+4;
second=second*10+5;
second=second*10+6;
second=second*10+1;
second=second*10+2;
second=second*10+3;
second=second*10+0;
ul_Number=(long)second;
voidsquarew(times)//产生方波
unsignedintt;
for(t=0;
t<
times;
t++)
buzz=0;
buzz=1;
;
voidselftest(void)//实现自检
unsignedinti;
P0=0xff;
P2=0x00;
for(i=0;
i<
40000;
i++);
//延时2秒
P2=0xff;
700;
i++)//发声检测
squarew(30);
}
//*********************************显示子程序
voiddisplay(void)
vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),uc_DisCount);
//在LED上显示1位数字。
if(uc_DisCount<
5)
uc_DisCount++;
//定时器0在每次被触发时,改变LED显示。
elseuc_DisCount=0;
//从第一位到第六位循环显示。
//*********************************主函数
voidmain()
selftest();
ledstate=0;
TMOD=0x11;
//定时器0:
模式一;
定时器0:
模式一.
//<
<
定时器1,用于1s计时>
>
TH1=TIME1H;
TL1=TIME1L;
ET1=1;
//开定时器1中断
PX1=1;
IT1=1;
//外部中断0,中断方式:
低电平
EX1=1;
//开启外部中断0
EA=1;
//开启总中断
//初始化键盘接口。
while
(1)
display();
KeyValue=ucKeyScan();
if(KeyValue!
=5)
if(KeyValue==14)
display();
sethour=1;
settime=1;
setminute=0;
setsecond=0;
elseif(KeyValue==24)
display();
setminute=1;
sethour=0;
elseif(KeyValue==34)
setsecond=1;
elseif(KeyValue==43)
dis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可编程 倒计时 装置 单片机 课程设计