普中51开发板倒计时100秒

任务:

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

原理图

普中51开发板倒计时100秒
普中51开发板倒计时100秒

算法设计

利用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();
}```