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

利用动态扫描和定时器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

相关推荐
jianqiang.xue1 小时前
ESP-IDF保姆级入门02|Ubuntu24.04搭建EIM-GUI开发环境,打通Windows_Linux双平台统一开发
stm32·单片机·物联网
无垠的广袤2 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
嵌入式-老费2 小时前
esp32开发与应用(添加数据分区)
单片机·嵌入式硬件
嵌入式-老费3 小时前
esp32开发与应用(OTA升级)
嵌入式硬件
CYLAM20256 小时前
STC32G 单片机0.96“OLED 西历农历可调万年历 (1901-2100)
单片机·嵌入式硬件·stc32g·万年历·西历农历·0.96”oled 12864·4x4 矩阵键盘
Discipline~Hai6 小时前
ARM03-蜂鸣器和中断
c语言·arm开发·单片机·嵌入式硬件·嵌入式
KaifuZeng7 小时前
电源面试问题汇总一
单片机·嵌入式硬件·面试·电路
驱动探索者9 小时前
RISC-V PLIC 深度解析:从 Spec 到 Zephyr 驱动实现
单片机·嵌入式硬件·中断控制器
LCG元9 小时前
STM32 FreeRTOS 实战:任务调度 + 互斥锁 + 消息队列 + 串口命令解析器
stm32·单片机·嵌入式硬件
Hello_Damon_Nikola9 小时前
姿态式饮水量估算从原理到实战
嵌入式硬件