最长99s倒计时_99s倒计时器课程设计
最长99s倒计时由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“99s倒计时器课程设计”。
09光信息科学与技术专业1班 单片机课程设计
杨兆永
3109008897
单片机课程设计
一、本设计任务及完成的功能
1、本设计任务:实现最长99S的倒计时功能;利用数码管或液晶屏显示数字;利用按键可以设置倒计时时间;设置倒计时开始启动键;时间到,声(光)报警,示意倒计时时间到。
2、完成的功能:实现了0~99S之间任意整数秒的倒计时,通过矩阵按键中0~9数字键设置倒计时间,按下*或#键开始倒计时,当倒计时间结束时,LED灯亮,停止倒计时。
二、倒计时器硬件设计
1、元器件 AT89C51单片机1个、两位动态共阴数码管1个、9个引脚的排阻、1k电阻3个、12MHz晶振1个、33pF电容2个、10uF极性电容1个、独立按键1个、4行3列矩阵按键1个、LED指示灯1个、电源和地若干
2、系统的硬件构成及功能
最长99秒计时器的原理框图如图1所示。
图1 99秒计时器系统原理框图
系统硬件连线:
(1)P1口接矩阵按键
(2)P2口接动态数码管的8个段选
(3)P0^
6、P0^7分别接动态数码管的十位和个位
(4)P3^7接LED指示灯
(5)XTAL1和XTAL2接晶振
09光信息科学与技术专业1班 单片机课程设计
杨兆永
3109008897 其中那排阻是驱动电路。
3、复位电路如图:
RST为复位信号输入端,高电平有效。系统上电后,当已经进行过倒计时,这时想进行不同时间的倒计时,只要按下复位按钮后,就可以进行新的倒计时。中断函数设计 先初始化中断函数:
TMOD=0x01;设置定时器0为工作方式1(0000 0001)TH0=(65536-50000)/256;//装初值50ms一次中断 TL0=(65536-50000)%256;EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=0;//先别启动中断,留着用按键启动,以便开始倒计时 中断函数如下: void T0_time()interrupt 1 {
}
//定时器0中断函数
TH0=(65536-50000)/256;//重装初值 TL0=(65536-50000)%256;numt0++;//50ms中断一次
四、总体程序如下:
#include
#define uchar unsigned char #define uint unsigned int sbit sw=P0^6;//十位位选 sbit gw=P0^7;//个位位选 sbit led=P3^7;//LED灯 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f};//编码定义 uchar numt0,num;void delayms(uint);void text(uchar);
void display(uchar numdis)//动态数码管显示子函数 {
09光信息科学与技术专业1班 单片机课程设计
杨兆永
3109008897
text(key);
while(temp!=0x0f)//判断按键是否释放
{
temp=P1;
temp=temp&0x0f;
}
} } P1=0xdf;//第2行
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delayms(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xdb:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xde:
key=6;
break;
}
text(key);
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
} } P1=0xbf;//第3行
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
09光信息科学与技术专业1班 单片机课程设计
杨兆永
3109008897
break;
}
text(key);
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
} }
} void text(uchar key)//判断键盘扫描结果,并倒计时 {
} static uchar n,bb,s;//静态局部变量
s=1;if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)n++;//有数字键被按下,n加1 if(key==10||key==11)n=3;//*和#被按下,n置3 switch(n){
} case 1: bb=key;key=20;display(bb);break;//第1次按下数字键
case 2: bb=bb*10+key;n=0;key=20;display(bb);break;//第2次按下数字键 case 3: { num=bb;//*和#被按下,开始倒计时
while(s==1){
}
TR0=1;//启动定时器0中断
if(numt0==20)//如果到了20次,说明1秒时间到 {
numt0=0;//然后把numt0清0重新再计20次 num--;//num自减
if(num==0)//如果num等0
TR0=0;//关闭定时器0中断 s=0;//推出循环
led=0;//点亮LED灯
{
} } display(num);//显示num
} break;
09光信息科学与技术专业1班 单片机课程设计
杨兆永
3109008897 帮忙,不知为什么,就是修改不好,不是改得更差了,就是改好了这个功能同时别的功能不行了。唉!我快要崩溃了,期末考试就来了,本来想早点弄好它,以便专心去复习,可看是简单就偏偏弄不出来。不管了,先复习、准备考试去了。
几天后,我连了一个新的一样的原理图(我以前做模电、数电课程设计的时候,一样的电路图,第一次连好后,检查确实没问题但运行不了,重新连一个就有可能运行),希望这次能成功。连好图后,程序也重新写,运行,随较上个图的改善了很多,但还是不行。没方法,只能找错误、修改,又花了几个钟,终于弄好了。问题出现在对矩阵扫描后的结果进行处理那里。好激动啊!
通过这次课程设计,不但加深我单片机的知识,更是让我再一次明白,不要小看那些看似简单的事,只有自己真正动手去做了,并把它做成功了,那才能说明自己真正的懂了。