发光管200ms时间间隔闪烁 数码管实现0~59s循环显示

本文介绍了一个基于51单片机的LED显示程序实现细节,通过定时器控制LED显示时间,并利用中断服务函数进行计数,实现LED数字的自动更新。程序采用分时复用的方式控制两个LED显示器轮流显示十位和个位上的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit led1=P1^0;
unsigned char code table[]={  
0x3f,0x06,0x5b,0x4f,  
0x66,0x6d,0x7d,0x07,  
0x7f,0x6f,0x77,0x7c,  
0x39,0x5e,0x79,0x71  
}; 

void delayms(uint);
void display(uchar,uchar);
uchar num,num1,num2,shi,ge;

void main()
{
//设置定时器0和1的工作方式(0001 0001)
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;//开总中断
ET0=1;//开定时器0 中断
ET1=1;
TR0=1;//启动定时器0
TR1=1;
while(1)
{
display(shi,ge);
}
}

void display(uchar shi,uchar ge)
{
dula=1;//段选信号
P0=table[shi];
dula=0;
P0=0xff;
wela=1;// 位选信号
P0=0xfe;
wela=0;
delayms(5);

dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);


}


void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
;
}

void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;

num1++;
if(num1==4)
{
num1=0;
led1=~led1;
}
}


void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2==20)
{
num2=0;
num++;
if(num==60) num=0;
shi=num/10;
ge=num%10;
}
}



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值