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

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

相关推荐
ACP广源盛139246256731 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#IX6024 PCIe2.0 交换芯片在轻量化 AI 服务中的机会与应用场景
大数据·数据库·人工智能·嵌入式硬件·macos·开源
深圳市恒锐丰科技杨生1 小时前
EG2124A 260V 三相独立半桥栅极驱动芯片|BLDC 外置 MOS 三相桥驱动方案
嵌入式硬件·硬件工程
学linux的QQ蛋2 小时前
吃透传输层:UDP 无连接、TCP 可靠传输、套接字函数、粘包问题详解
单片机·tcp/ip·udp
kruptos2 小时前
嵌入式 Linux 驱动开发:第一个内核模块怎么写?
linux·运维·驱动开发·嵌入式硬件
HUI-4742 小时前
EG1133|SOT23‑6 18V/3A 电流模式同步降压 DC‑DC,中小功率大电流紧凑型电源优选
嵌入式硬件·硬件工程
单片机仿真设计3 小时前
基于 51 单片机老旧电梯层门防夹人装置优化设计(Proteus 仿真)
单片机·嵌入式硬件·proteus
wuyk5555 小时前
104.C 语言字节对齐:从底层原理到工程实践的完整指南
c语言·开发语言·stm32·单片机·嵌入式硬件
star learning white12 小时前
STM32入门学习5
stm32·嵌入式硬件·学习
新晨单片机设计13 小时前
S006A-基于STM32单片机温湿度检测系统【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
逐步前行15 小时前
ESP32-S3-分区表(Partition Table)
单片机