任务:
用定时器设计一个以间隔 1s 从 100 减到 0 的计数器,在数码管上显
示。当数码管上的数字减到 0 时,蜂鸣器发出警报。
原理图


算法设计
利用138译码器选择数码管引进(8进制)
倒计时:通过定时器精确计算1s,然后设置 “sec = 100” 每一秒 -1,数码管部分,通过 求商和取余 分别取得 百位 十位 个位。
蜂鸣器:可通过不同的延时函数,发出不同频率的声音(可用于做电子琴的音符)
代码
#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit beep= P1^5;
u8 code smgduan[10] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
}; //共阴
u16 cnt = 0;
u16 sec = 100;
void Timer0Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式 定时器0 是 13位的
TL0 = 0x30; //设置定时初值
TH0 = 0xE3; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void DIGdisplay()
{
u8 i;
for (i=0;i<3;i++){
switch(i){
case(0): LSA = 1 ;LSB = 0 ; LSC = 1 ;P0 = smgduan[sec/100] ;break; //5
case(1): LSA = 0 ;LSB = 1 ; LSC = 1 ;P0 = smgduan[sec/10%10] ; break; //6
case(2): LSA = 1 ;LSB = 1 ; LSC = 1 ;P0 = smgduan[sec%10] ; break; //7 第八个
}
P0 =0X00;
}
}
void Delay200us() //@11.0592MHz
{
unsigned char i, j;
i = 3;
j = 35;
do
{
while (--j);
} while (--i);
}
void warning()
{
beep = ~beep;
Delay200us();
}
void main()
{
Timer0Init();
ET0 = 1;
EA = 1;
P0 = 0x00;
while(1){
DIGdisplay();
}
}
void InterruptTime0() interrupt 1
{
TL0 = 0x30; //设置定时初值
TH0 = 0xE3;
cnt++;
if (cnt == 1000) {
cnt = 0;
if(sec != 0) sec--;
}
if(sec == 0) warning();
}```