⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 home4.c

📁 自己学习单片机时写的利用动态扫描和定时器的电路
💻 C
字号:
/*利用动态扫描和定时器1在数码管上显示出从765432
开始以1/10秒的速度往下递减直至765398并保持显示此
数,与此同时利用定时器0以500MS速度进行流水灯从上
至下移动,当数码管上数减到停止时,实验板上流水灯
也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全
部关闭、数码管上显示出“HELLO”。到此保持住。*/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar t1,t0,led;
uchar hunthou,tenthou,thou,hundard,ten,one;
uchar flag_led,flag_hello;
uint count_d;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0x80};
uchar code hello[]={
0x74,0x79,0x38,0x38,
0x38,0x80};
void delay(uint z);

void init_timer()
{	count_d=432;
	led=0xfe;
	P1=led;
    	
	TMOD=0x11;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
    	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;
   	ET1=1;
	TR1=1;

}
void display(uchar hunthou,uchar tenthou,uchar thou,uchar hundard,uchar ten,uchar one)
{dula=0;
 P0=table[hunthou];
 dula=1;
 dula=0;
 wela=0;
 P0=0xfe;
 wela=1;
 wela=0;
 delay(5);
 
 P0=table[tenthou];
 dula=1;
 dula=0;
 P0=0xfd;
 wela=1;
 wela=0;
 delay(5);

P0=table[thou];
 dula=1;
 dula=0;
 P0=0xfb;
 wela=1;
 wela=0;
 delay(5);
	
P0=table[hundard];
 dula=1;
 dula=0;
 P0=0xf7;
 wela=1;
 wela=0;
 delay(5);	

P0=table[ten];
 dula=1;
 dula=0;
 P0=0xef;
 wela=1;
 wela=0;
 delay(5);
 
 P0=table[one];
 dula=1;
 dula=0;
 P0=0xdf;
 wela=1;
 wela=0;
 delay(5);
}

void main()
{   	
	init_timer();
	
	
	while(1)
	{	if(flag_hello==0)
		display(7,6,5,hundard,ten,one);	
		else
		display(16,17,18,18,19,20);
	}
	
	}

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void timer0() interrupt 1 //led闪烁中断程序
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	t0++;
	if(flag_led==0)
	{
		if(t0==10)//倒计时进行同时,led流水显示
		{
		 t0=0;
		 led=_crol_(led,1);
		 P1=led;
		}
	}
	else{			//倒计时停止,led闪烁显示
		if(t0%4==0)    //每200msled闪烁一次
		  P1=~P1;
		 if(t0==60)    //闪烁3s计时判断
		 {
		 	TR0=0;	//led停止闪烁计时
		 	P1=0xff;//led熄灭
		 	flag_hello=1;//显示HELLO判断标志
		 }
		}	
}

void timer1() interrupt 3//倒计时中断程序
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
    t1++;
    if(t1==2)//每100ms递减1个数
		{
			t1=0;//计数清0
			count_d--;
			hundard=count_d/100;//display的3个参数
			ten=(count_d%100)/10;
			one=count_d%10;
			if(count_d==398)//倒计数停止判断
			{	TR1=0;//关闭倒计时计数器T1
				TR0=0;//关闭定时器T0,流水灯不再显示
				TH0=(65536-50000)/256;//寄存器赋初值
				TL0=(65536-50000)%256;
				t0=0;//闪烁时间计数清0
				flag_led=1;//定义倒计时停止,同时led开始3秒钟闪烁的标志
				TR0=1;//重启T0
				P1=0xff;//led初始状态全部熄灭
				
				
			}	
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -