单片机---数码管动态显示和定时器应用,实例练习

利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500Ms速度进行流水灯从上至下移动,当数码管上数减到停止时,试验板上流水灯也停止然后全部闪烁,3秒后(用T0定时)流水灯全部关闭,数码管上显示出HELLO,至此保持住。

复制代码
#include <reg52.h>
#include <intrins.h>

unsigned char temp,t0,t1,bai,shi,ge,flag,flag1;
unsigned int shu;

sbit dula=P2^6;//段选信号
sbit wela=P2^7;//位选信号

unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x36,0x79,0x38,0x3f,0};//定义数码管显示内容0~f的数组


void init();
void display(unsigned aa,unsigned bb,unsigned cc,unsigned char bai,unsigned char shi,unsigned ge);
delay(unsigned z);

void main()
{
	init();
	while(1)
	{
		if(flag1!=1)
			display(7,6,5,bai,shi,ge);
		else
			display(16,17,18,18,19,20);
	}
}

void init()
{
	shu=432;
	temp=0xfe;
	P1=temp;
	TMOD=0x11;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	EA=1;
	ET0=1;
    ET1=1;

	TR0=1;
    TR1=1;	
}

void timer0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	t0++;
	if(flag!=1)
	{
		if(t0==10)
		{
			t0=1;
			temp=_crol_(temp,1);
	        P1=temp;
		}
	}else{
		if(t0%4==0)
		{
			P1=~P1;
		}
		if(t0==60)
		{
			TR0=0;
			P1=0xff;
			flag1=1;
		}
	}
	
}

void timer1() interrupt 3
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	t1++;
	if(t1==2)
	{
		t1=0;

		shu--;
		bai = shu/100;
	    shi = shu%100/10;
		ge = shu%10;

		if(shu==398)
		{
			TR0=0;
			TH0=(65536-50000)/256;
			TL0=(65536-50000)%256;
            TR0=1;
			flag=1;
			t0=0;
			P1=0xff;
			TR1=0;
		}
	}
}

/*aa,bb,cc 数码管前三位*/
void display(unsigned aa,unsigned bb,unsigned cc,unsigned char bai,unsigned char shi,unsigned ge)
{
	dula=1;
	P0=table[aa];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfe;
	wela=0;
	delay(1);

	dula=1;
	P0=table[bb];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;
	delay(1);

	dula=1;
	P0=table[cc];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfb;
	wela=0;
	delay(1);
	
	dula=1;
	P0=table[bai];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xf7;
	wela=0;
	delay(1);

	dula=1;
	P0=table[shi];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xef;
	wela=0;
	delay(1);

	dula=1;
	P0=table[ge];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xdf;
	wela=0;
	delay(1);
}

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

WeChat_20241025162439

相关推荐
Crazyong1 小时前
FreeRTOS-CPU使用率统计
单片机·嵌入式硬件
_Ningye8 小时前
STM32 — 6.1 TIM定时中断
stm32·单片机·嵌入式硬件
小白学电子_8 小时前
proteus仿真51单片机通过矩阵按键和数码管制作简单计算器
嵌入式硬件·51单片机·proteus
FreakStudio10 小时前
把 Flask 搬进 ESP32,高中生自研嵌入式 Web 框架 MicroFlask !
python·单片机·嵌入式·cortex-m3·异步编程·电子diy
AnalogElectronic10 小时前
RP2040 pico 实验6,光敏电阻传感器模块(LM393 比较器版)
单片机
17(无规则自律)10 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
电子工程师成长日记-C5110 小时前
51单片机4乘4计算器
单片机·嵌入式硬件·51单片机
梅尔文.古10 小时前
ADCU-Ethernet-以太网在AUTOSAR与Linux架构下对比
arm开发·单片机·汽车
没有医保李先生11 小时前
esp32和stm32的工程宏定义
stm32·单片机·嵌入式硬件
炸膛坦客11 小时前
单片机/C/C++八股:(十五)内存对齐、结构体内存对齐
c语言·开发语言·单片机