微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第32节:数码管中的倒计时程序

第32节:数码管中的倒计时程序

时间:11-22 来源:互联网 点击:
interrupt 1
{
TF0=0;//清除中断标志
TR0=0; //关中断

key_scan(); //按键扫描函数

if(ucStartFlag==1)//启动倒计时的计时器
{
uiTimeCnt++;
if(uiTimeCnt>=const_1s) //1秒钟的时间到
{
if(ucCountDown!=0) //加这个判断,就是避免在0的情况下减1
{
ucCountDown--;//倒计时当前显示值减1
}

if(ucCountDown==0)//倒计时结束
{
ucStartFlag=0;//暂停
uiVoiceCnt=const_voice_long; //蜂鸣器触发提醒,滴一声就停。
}

ucWd1Update=1; //窗口1更新显示标志
uiTimeCnt=0; //计时器清零,准备从新开始计时
}
}

if(uiVoiceCnt!=0)
{
uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
beep_dr=0;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
// beep_dr=1;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
}
else
{
; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
beep_dr=1;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
// beep_dr=0;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
}

display_drive();//数码管字模的驱动函数

TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
TL0=0x0b;
TR0=1;//开中断
}

void delay_short(unsigned int uiDelayShort)
{
unsigned int i;
for(i=0;i{
; //一个分号相当于执行一条空语句
}
}

void delay_long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i{
for(j=0;j<500;j++)//内嵌循环的空指令数量
{
; //一个分号相当于执行一条空语句
}
}
}

void initial_myself()//第一区 初始化单片机
{

/* 注释三:
* 矩阵键盘也可以做独立按键,前提是把某一根公共输出线输出低电平,
* 模拟独立按键的触发地,本程序中,把key_gnd_dr输出低电平。
* 朱兆祺51学习板的S1就是本程序中用到的一个独立按键。
*/
key_gnd_dr=0; //模拟独立按键的地GND,因此必须一直输出低电平

led_dr=0;//关闭独立LED灯
beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。

hc595_drive(0x00,0x00);//关闭所有经过另外两个74HC595驱动的LED灯

TMOD=0x01;//设置定时器0为工作方式1

TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
TL0=0x0b;

}

void initial_peripheral() //第二区 初始化外围
{

ucDigDot8=0; //小数点全部不显示
ucDigDot7=0;
ucDigDot6=0;
ucDigDot5=0;
ucDigDot4=0;
ucDigDot3=0;
ucDigDot2=0;
ucDigDot1=0;

EA=1; //开总中断
ET0=1; //允许定时中断
TR0=1; //启动定时中断

}

总结陈词:
这节讲了数码管中的倒计时程序。如果要在此程序上多增加两个按键,用来控制数码管倒计时的速度档位,并且需要在数码管中闪烁显示被设置的速度档位,该怎么编写这个程序?欲知详情,请听下回分解-----能设置速度档位的数码管倒计时程序。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top