用51单片机定时器中断写数码管0-99

2 篇文章 0 订阅
1 篇文章 0 订阅

用定时器0实现数码管的0-99变化

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int

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

uint n=0;//个位
uint b=0;//十位
uint m=0;//控制十位
uint o=0;//整体的计时

uchar W[8]  = {0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//位选
uchar D[16] = {0x3f,0x06,0x5b,0x4f,
						  0x66,0x6d,0x7d,0x07,
						  0x7f,0x6f,0x77,0x7c,
						  0x39,0x5e,0x79,0x71};//段码

uchar num1;//定时器
							
void time(uint xms)//用软件延时给予数码管动态显示更简单
{
	uint i , j ;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}

void main()
{
	TMOD = 0x01;
	TH0  = (65536-45872)/256;
	TL0  = (65536-45872)%256;
	EA   = 1;
	ET0  = 1;
	TR0  = 1;//定时器
	
	while(1)
	{
	if(n>9)//个位只有9个数,所以当n=10(即显示A的时候)变为0
		n=0;
	if(num1==20)//定时器用的50ms
	{
		num1=0;
		n++;//每秒n+1来实现数组的选择
		o++;//时间+1
		m++;
		if(m==10)//没当10秒时,b+1实现十位的变化
		{
			m=0;
			b++;
		}
/*******0-9*******/
		if(o<=9)
		{
			dula = 1;
			P0 = D[n];
			dula = 0;
			
			wela = 1;
			P0 = W[0];
			dula = 0;
		}
	}	
/*******10-99******/
	if(o>9)
		{
			dula = 1;
			P0 = D[n];
			dula = 0;
			P0 = 0xFF;//消影
			wela = 1;
			P0 = W[1];
			dula = 0;
/*十位*/	
			time(1);//实现动态显示

			dula = 1;
			P0 = D[b];
			dula = 0;
			P0 = 0xFF;//消影
			wela = 1;
			P0 = W[0];
			dula = 0;
			time(1);
		}
	}	
}	

void T0_time() interrupt 1 //定时器部分
{
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	num1++;
}

通过这段代码可以了解到定时器中断的基本用法

  • 10
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
51单片机可以通过定时器来控制数码管时钟的显示。以下是实现的步骤: 1. 首先需要设置定时器的工作模式和计数器初值。这里可以选择定时器的模式为计数模式,计数器的初值为65535-50000,即每隔500ms中断一次。 2. 在定时器中断服务函数中,需要对数码管进行扫描和显示。具体实现可以通过循环扫描8个数码管,以共阳极数码管为例,先将所有数码管的位选信号置低,然后将当前要显示的数字通过段选信号输出到数码管上,最后将对应的位选信号置高,使其显示出来。 3. 在主函数中,需要开启定时器并启用中断,以便定时器中断服务函数能够正常运行。 下面是一个简单的代码示例: ```c #include <reg51.h> // 数码管显示的数字 unsigned char disp[8] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07}; // 定时器中断服务函数 void timer_isr() interrupt 1 { static unsigned char digit = 0; // 当前显示的数码管 P2 = 0xff; // 关闭所有数码管的位选 // 显示当前数码管的数字 P0 = disp[digit]; // 选中当前数码管 P2 = ~(1 << digit); // 切换到下一个数码管 digit++; if (digit >= 8) digit = 0; } void main() { TMOD = 0x01; // 定时器0工作在模式1(16位计数器)下 TH0 = 0xd8; // 定时器初值为65535-50000 TL0 = 0xf0; ET0 = 1; // 开启定时器0中断 EA = 1; // 开启总中断 TR0 = 1; // 启动定时器0 while (1) { // 主循环中不需要做什么,定时器中断服务函数会定时扫描和显示数码管 } } ``` 需要注意的是,以上代码仅供参考,具体实现可能需要根据实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值