51单片机的计数器的工作原理

如图所示,导入元器件并连线。

编写c程序并生成hex文件。


#include"reg52.h"

char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int num=0;

void initcounter(){
    TMOD = 0x06;  // 0000 0110
    TH0=256-3;      // 赋初值   计数3次
    TL0=256-3;      //  赋初值  计数3次
    ET0 = 1;    // 开启计时器0
    EA = 1;      // 打开总中断
    TR0 = 1;     // 开启计数器0
    
}

void display(){
    P2=duan[num];
}

void main(){
    initcounter();
    while(1){
        display();
    }
}

void zhongduan() interrupt 1{   // 中断函数,  只要前面的计数器产生了中断,程序就会往这个函数里面走
    num++;
    if(num==10){
        num=0;
    }
}

最后导入proteus中,按 按键3次实线数码管加1的效果。

下面写一段计数器1触发的代码:

#include<reg52.h>


char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int num=0;

void init()
{
	TMOD=0x60;    //用计数器0的值: 0000 0110
	TH1=256-3;   // 用计数器0的值: TH0
	TL1=256-3;   // 用计数器0的值: TL0
	ET1=1;       // 用计数器0的值: ET0
	TR1=1;       // 用计数器0的值: TR0
	EA=1;
}

void display()
{
	P2=duan[num];
}

int main()
{
	init();
	while(1)
	{
		display();
	}
}

void zhongduan()interrupt 3
{
	num++;
	if(num==10)
	{
		num=0;
	}
}

用上面的程序把button接到P3.5/T1接口上也能实现按3次button数码管加1.

下面是最近看到的内容,感觉挺有用就记录下来吧!

 

 

 为此写了一个小程序来验证学习到的知识是否正确。主要功能就是控制P0的第0口的小灯间隔1秒亮灭,来看程序,这是使用16位计时器0的例子:

#include<reg52.h>

sbit LED = P0^0;
unsigned int count = 0;
void InitTime()
{
	TMOD = 0x01;
	TH0 = 0xB4;
	TL0 = 0x00;
	TR0 = 1;
}

int main()
{
	InitTime();
	
	while(1)
	{
		if(1 == TF0)
		{
			TF0 = 0; // 将硬件置1的溢出标志位置0,重新计时
			TH0 = 0xB4;
			TL0 = 0x00;
			count++;
			if(40 == count)
			{
				count = 0;
				LED = ~LED;
			}
		}
		
		
	}
	return 0;
}

下面是使用16位计时器1的例子

#include<reg52.h>

sbit LED = P0^0;
unsigned int count = 0;
void InitTime()
{
	TMOD = 0x10;  // 设置使用计时器1的工作模式1
	TH1 = 0xB4;
	TL1 = 0x00;
	TR1 = 1;
}

int main()
{
	InitTime();
	
	while(1)
	{
		if(1 == TF1)
		{
			TF1 = 0; // 将硬件置1的溢出标志位置0,重新计时
			TH1 = 0xB4;
			TL1 = 0x00;
			count++;
			if(20 == count)
			{
				count = 0;
				LED = ~LED;
			}
		}
		
		
	}
	return 0;
}

下面是使用16位计数器0和1,8位计数器0和1的例子,13位计数器只有计数1次能 成功,不知道原因。放开注释就能测试。

#include<reg52.h>

#define uc unsigned char

uc s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uc num=0;

void init_count();
void display();

void main()
{
	init_count();
	while(1)
	{
		display();
	}
}

void display()
{
	P2=s[num];
}


//下面这是配置的16位计数器0的方法
//void init_count()
//{
//	TMOD=0x05;               //和定时器0的使用方法是一样的,只不过这里把C/T位置1了而已。
//	TH0=(65536-3)/256;
//	TL0=(65536-3)%256;
//	TR0=1;
//	ET0=1;
//	EA=1;
//}

//void count_isr()interrupt 1
//{
//	TH0=(65536-3)/256;
//	TL0=(65536-3)%256;
//	num++;
//	if(num==10) num=0;
//}


//  下面这是配置的16位计数器1的方法

//void init_count()
//{
//	TMOD=0x50;               //和定时器0的使用方法是一样的,只不过这里把C/T位置1了而已。
//	TH1=(65536-3)/256;
//	TL1=(65536-3)%256;
//	TR1=1;
//	ET1=1;
//	EA=1;
//}

//void count_isr()interrupt 3
//{
//	TH1=(65536-3)/256;
//	TL1=(65536-3)%256;
//	num++;
//	if(num==10) num=0;
//}


   下面这个是配置的8位计数器0的方法
//void init_count()
//{
//	TMOD=0x06;               //和定时器0的使用方法是一样的,只不过这里把C/T位置1了而已。
//	TH0=256-3;           //这里赋值不用除是因为8位的数据可以放下,除是为了取高8位。
//	TL0=256-3;          //这里赋值不用取余是因为8位的数据可以放下,取余是为了取低8位。
//	TR0=1;
//	ET0=1;
//	EA=1;
//}

//void count_isr()interrupt 1
//{  // 8位计数计时器能自动重载,所以不用赋初值
//	num++;
//	if(num==10) num=0;
//}


   下面这个是配置的8位计数器1的方法
//void init_count()
//{
//	TMOD=0x60;               //和定时器0的使用方法是一样的,只不过这里把C/T位置1了而已。
//	TH1=256-3;           //这里赋值不用除是因为8位的数据可以放下,除是为了取高8位。
//	TL1=256-3;          //这里赋值不用取余是因为8位的数据可以放下,取余是为了取低8位。
//	TR1=1;
//	ET1=1;
//	EA=1;
//}

//void count_isr()interrupt 3
//{  // 8位计数计时器能自动重载,所以不用赋初值
//	num++;
//	if(num==10) num=0;
//}

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
51单片机按键计数器是一个基于STC89C52RC单片机的小程序,使用C语言编写,在KEIL开发环境中进行开发。该程序的功能是每按下一次按键,计数器的数值就会加一。这个小程序使用了外部中断、数码管动态显示和按键的扫描等知识。通过连接一个共阳极的数码管和一个按钮到单片机的相应引脚上,实现了计数器的功能。具体的程序实现和电路原理图可以参考配套的PDF格式的文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [51单片机STC89C52RC开发板例程之按键计数器.rar](https://download.csdn.net/download/weichen_78/87190233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [51单片机简易计算器(中断,按键扫描,数码管显示)【0】](https://blog.csdn.net/qq_39609656/article/details/105798838)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [题解:按钮加减计数器设计(单片机C51)(外部中断)](https://blog.csdn.net/zhanghgh/article/details/124069185)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚久龙

你的鼓励是我最大的动力!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值