51单片机定时器控制数码管显示

代码:

#include<reg52.h>
// Header:定时器数码管显示0-F
// Author:Time
// Date:2022-10-12
unsigned char code Tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/*共阴数组
(如果是共阳数码管就换一下共阳数组"0xc0,0xf90xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e")
如果只需要显示0-9就删了后面6个*/

void delay(unsigned int x)//延时1秒
{
	unsigned int i,j;
	for(i=0;i<x;i++)
		for(j=0;j<125;j++);
}

void main()//主函数
{
	unsigned char n=0;//局部变量				
	P0=Tab[0];//初始化赋值
	/*你接的P几口就写P几,我连接的P0所有写P0*/
	TMOD=0x01;						//定时器工作方式1	
	TR0=1;										//开启定时器

	while(1)									//循环
	{
		TH0=(65536-1000)/256;		//定时1ms
		TL0=(65536-1000)%256;   
		do{}while(!TF0);				//判断是否溢出
		if(n>=15)	//你数组有几个就写几个减1,我是0-F,所以我写15,你如果是0-9就写9							
			n=0;
		else
			n++;
		P0=Tab[n];	/*你接的P几口就写P几,我连接的P0所有写P0*/		
		delay(1000);					
	}
}

原理图:

b999f8edd55c42868b9ce279bcbd436a.jpeg

 原理图元器件清单:

4ce184e92c394e869afdcff7bb00bf19.jpeg

 

注意事项:

1. 数组{}后面不要忘记加  ;  分号,别问为什么要提醒,因为我就是这个少了找了半天错误;

2.你的题目是共阳就用共阳数组,是共阴就用共阴数组,数组是0-F;

3.你题目是显示0-9,就只要输入前10个数组,是0-F就全部输入;

4.0-9,把n>=15改n>=9.

5.那个元器件数码管是不是很难连对不齐,嘿嘿,按Ctrl+F1可以解决。

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用定时器中断来实现定时器的计数,然后通过编写数码管驱动代码来实现数码管的显示。以下是一种可能的解决方案: 1. 初始化定时器,设定定时器的时钟源和预分频系数等参数。在定时器中断中进行计数。例如,将定时器的时钟源设置为系统时钟,预分频系数设置为64,计数器初始值设置为0。 2. 编写数码管驱动代码,包括点亮每个段的代码,以及显示数字的代码。可以使用循环语句来依次点亮每个数码管的每个段,也可以使用一个函数来转换数字到对应的数码管段的状态。 3. 在定时器中断中,在计数达到一定值时(例如,达到每秒钟计数一次),更新显示数码管的数字,例如显示倒计时的秒数。 4. 当计数达到60秒时,重新开始计数,即清零计数器,重新显示60的数字,并等待下一个定时器中断。 以下是示例代码: // 初始化定时器,计数器初始值为0 void init_timer() { TCCR1B |= (1 << CS11) | (1 << CS10); // 使用64预分频 TCNT1 = 0; // 计数器初始值为0 TIMSK1 |= (1 << TOIE1); // 启用定时器中断 } // 定时器中断 ISR(TIMER1_OVF_vect) { static uint8_t count = 0; count++; if (count >= 60) { count = 0; // 到达60秒,重新开始计数 TCNT1 = 0; display_number(60); } else { // 更新显示 display_number(60 - count); } } // 显示数字,例如显示秒数 void display_number(uint8_t number) { // 将数字转换为对应的数码管状态 uint8_t digit_code = number_to_segment_code(number); // 驱动数码管显示 for (uint8_t i = 0; i < 4; i++) { set_segment(i, digit_code & 0x01); digit_code >>= 1; } } // 数字到数码管状态的转换,例如 0x01 到 "1" uint8_t number_to_segment_code(uint8_t number) { static uint8_t segment_codes[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 // 其它数字,例如 A, b, C, d, E, F 等 }; if (number >= 10) { return 0; // 超过10,无法转换 } else { return segment_codes[number]; } } // 将数码管的每个段设置为 on 或 off void set_segment(uint8_t index, bool on) { // 实现方法略 }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值