单片机实验8:数码管倒计时led闪烁和蜂鸣器作响

数码管倒计时led闪烁和蜂鸣器作响

实验单片机晶振为11.0592

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar num = 0;
sbit led0 = P2^0;
sbit led2 = P2^2;
sbit led3 = P2^3;
sbit led4 = P2^4;
sbit beep = P1^5;

uchar code duanxuan[] = {
    
    0x3f,0x06,0x5b,0x4f,	  //0,1,2,3
						0x66,0x6d,0x7d,0x07,	  //4,5,6,7
						0x7f,0x6f,0x77,0x7c,	  //8,9,A,B
						0x39,0x5e,0x79,0x71};	  //C,D,E,F		段选
							
void fp(int i)       //调整蜂鸣器音调
{
    
    
	while(i--);
}

void Display(int i,int j,int k)				//数码管动态显示
{
    
    
	switch(i)
	{
    
    
		case(0):P0=duanxuan[j];led2=1,led3=1,led4=1;break;
		case(1):P0=duanxuan[k];led2=0,led3=1,led4=1;break;
		case(2):led2=1,led3=0,led4=1;break;				//2-7暂时没用到,可忽略
		case(3):led2=0,led3=0,led4=1;break;
		case(4):led2=1,led3=1,led4=0;break;			 
		case(5):led2=0,led3=1,led4=0;break;
		case(6):led2=1,led3=0,led4=0;break;
		case(7):led2=0,led3=0,led4=0;break;
	}	
}

void main()
{
    
    
	int i=0,time=60,j=time/10,k=time%10;
	TMOD = 0X01;				//定时器模式为0,1;16位定时器
	TH0 = (65536-45872)/256;	//高八位赋初值
	TL0 = (65536-45872)%256;	//低八位赋初值
	EA = 1;						//中断总开关
	ET0 = 1;					//定时器中断开关
	TR0 = 1;					//定时器开始计时
	led0 = 0;
	while(1)
	{
    
    
		if(num == 20)
		{
    
    
			led0 = ~led0;
			num = 0;
			time--;
			if(time < 0)			//当计时结束从新开始
			{
    
    
				time=60;
			}
			j=time/10,k=time%10;	//将数字分为十位和个位分别输入数码管
		}
		if(led0 == 0)				//led亮时蜂鸣器作响
		{
    
    
			beep = ~beep;
			fp(1);
		}
		Display(i,j,k);				//数码管显示
		i = (i+1)%2;
		fp(100);
		P0=0;		//消影,注意消影的间隔和视觉暂留的间隔不能太短,否则灯会不太明亮
	}				//因此前面需要延时100
}

void TR0_time() interrupt 1		//定时器中断程序
{
    
    
	TH0 = (65536-45872)/256;
	TL0 = (65536-45872)%256;
	num++;	
}

猜你喜欢

转载自blog.csdn.net/The_RedMaple/article/details/111555207