51单片机如何同时使用定时器和计数器采集数据?

供稿:hz-xin.com     日期:2025-01-14
51单片机定时器的计数器功能的使用

计数器1,也是计数,设置初值也是为了计数,是对外部脉冲计数,而这外部脉冲是要从P3.5输入的。初值也是计数的需要,TL1=256-实际计数值=6,可以算出实际计数值是250。也就是需要对外部脉冲计250个才中断一次。

你在外部加脉冲,是只加一个吧,所以,屏幕上没有显示,至少要加250个以上,每加250个,cou才加一个数。

可以的! 但需要初始化! 例如一个定时器用于串口的波特率产生,另外一个则可以用作计数器!

void init_uart() void
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 253; // 设置初值
TL1 = 253;
TR1 = 1; // 开始计时
SCON = 0x50; //工作方式1,波特率9600bps,允许接收
ES = 1;
EA = 1; // 打开所有中断
TI = 0;
RI = 0;
}

这是我根据频率计程序修的
//用定时计数器1作为脉冲计数器(P3.5引脚正是输入功能),定时器0作为定时器用,定时50ms产生中断
//中断4次后(即0.2s)读计数器1的数据
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
//定义以I/O口的功能
sbit rs=P1^3;//液晶屏写选择,0命令 1数据
sbit rw=P1^4;//液晶屏读写选择
sbit lcden=P1^5;//液晶屏使能
#define db P2 //定义P2为数据输出口,写数据时用db代替P2,增加液晶屏程序的通用性
//更改硬件接线时,只更改此处,而不必去更改液晶屏读写子程序
uchar aa;//计中断次数
uint bb,cc,dd;//保存计数器的值
void Delay1ms(unsigned int i) //1ms延时程序
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化设置
{
TMOD=0x51;//定时器1作为计数器,定时器0作为定时器用
TH1=0;//计数器清0
TL1=0;
EA=1;//开总中断
ET0=1;//允许定时器0中断
TH0=0x4c;
TL0=0x5c;
TR1=1;//启动计数器
TR0=1;//启动定时器
aa=0;
}
void write_com(uchar com)//向液晶屏写命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void write_date(uchar date)//向液晶屏写数据
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void init2()//液晶屏初始化
{
rw=0;
write_com(0x38);//显示模式16字*2行,5*7点阵,数据口8位
Delay1ms(10*12);
write_com(0x0f);//开显示,显示光标,光标闪烁
Delay1ms(10*12);
write_com(0x06);//写完数据后数据指针和光标位置自动加1
Delay1ms(10*12);
write_com(0x01);//屏幕清除
Delay1ms(10*12);
}
void display4(unsigned int number) //单行多位显示程序
{
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分离出十万,万,千,百,十,个
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;
write_com(0x80);//第1个数据的位置设定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//写数据
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
}
void main()//主程序很简单
{
init();//初始化
while(1)//循环程序
{
dd=bb*256+cc;//0.2S的计数值
display4(dd);//显示
Delay1ms(100); //延时
}
}
void timer0()interrupt 1//注意:定时器0的中断序号为1
{
aa++;
TH0=0x4c;

TL0=0x5c;

if(aa==4)//中断4次,共0.2S
{
TR1=0;//暂停计数
aa=0;
bb=TH1;//读出计数器数据
cc=TL1;
TL1=0;//计数器清0
TH1=0;
TR1=1;//重新启动计数器
}
}

TIMER1作计数器,TIMER0作定时器。不能只用一个同时做两件事的。

开两个中断,一个定时,一个计数

51单片机在兆级晶振下单纯定时器是达不到200ms计时的,需要其他软件程序实现。T0和T1两个分别设置成定时器和计数器没问题,可以实现功能要求。需要帮忙写程序的话 可以私信我

系统和硬件都具有升级的空间,但主要还是看你对电脑的用途和要求!这个配置,玩一般电脑游戏,办公等等都不会有问题!没有升级 的必要!当然,对电子产品有狂热追求的那就可以选择升级!显卡,内存,硬盘都有升级空间!

【MCS-51】内部定时和计数器
计数器工作原理涉及模式设置、方向设定、分频系数调整、计数初始值设定及中断使能等参数配置。应用包括频率计数、编码器测量、信号采集等。综上所述,51单片机内置的定时器与计数器模块提供时间管理与计数功能,对于精确控制时间、周期性任务、频率测量、信号采集等应用场景至关重要。正确配置参数与中断处理,能...

单片机汇编语言问题:同时启动T0,T1。一个工作在定时器模式,一个工作在...
那么 TMOD=0101 0001 =51h;就是T1方式1计数器模式,T0方式1定时器模式 mov TMOD,#51

单片机,当定时器\/计数器工作方式于1下,晶振频率为6M,请计算最短定时时间...
定时器是通过计数溢出来计时的,工作方式1是16位计数方式。晶振频率为6M,那么计数器加1需要一个机器周期2us。机器周期=12\/fosc,fosc为晶振频率。计数初值为1时,定时最短为2us,最长是计2的16次方(即65536),最长时间=2*65536us=131.072ms 。在工作方式1下,定时时间:t=(65536-T0初始值)*...

C51单片机定时器1以方式1定时1秒如何设置?
1、先打开我们熟悉的单片机c51编程软件——keil,先把主方法写好。2、然后,我们要定义两个变量。3、接着,设定好定时器的工作方式。4、设置中断发生的机制。5、最后,我们要加进这几行代码进行初值的重装。6、最后,把if语句补充完毕就可以了。

51单片机的T0或T1可以同时作为定时器又作为I\/O口使用吗?这样做时两个...
T0 T1式定时器\/计数器,当定时或计数完成时,单片机产生中断,在中断服务程序中,你可以进行I\/O控制,例如T0的输出可以作为T1的输入脉冲。

单片机T2 T1 T0定时器\/计数器不能同时工作?
52单片机有三个定时器,T2、T1、T0,三个定时是可以同时工作的,只要TR2=1,TR1=1,TR0=1,那么三个定时就同时开始工作了。但是由于中断是有优先级且不能同时进行中断服务的,所以三个定时器不能同时进入中断服务,同时触发中断的话,需要根据优先级进行排队。

单片机定时器计数器如何使用
2.方式0为13长度计数(TL0高3位不使用),设计数初值为X,则(8192-X)*1us=2500us,得X=5692D。X=1011000111100B。因为TL0高3位不用,所以10110001-00011100B得TH0=B1H,TL0=1CH 3.由控制寄存器TCON的TR0位来控制定时的启动和停止,TR0=1启动,TR0=0停止 C语言程序如下(编译器Keil C)include...

单片机:定时器工作方式0、1、2下的计时时间计算方法?
首先明确三种方式的计数范围:方式0是13位的定时\/计数器,记满值为2^13=8192;方式1是16位的定时\/计数器,计满为2^16=65536;方式2是8位的定时\/计数器,计满为2^8=256。我以方式1来举例说明(12M晶振):如果我想计数1S,但是计数方式1的计数最大计数65536us即65ms,为了方便计数,选取50ms,...

51系列单片机内部定时\/计数常用的两种工作方式,各有说明特点?
51系列单片机内部定时\/计数常用的两种工作方式分别是模式1(16位定时器)和模式2(8位自动重装载定时器)。它们的特点如下:1. 模式1(16位定时器):- 该模式下,定时器\/计数器T0和T1均以16位的方式运作。- 每次达到预设的计数值后(即溢出),需要重新设置初值以继续计数。2. 模式2(8位自动重...

请问stc单片机1个定时器怎么控制两个设备?
如果是循环工作就 好办,可以定时50ms,然后各个灯的开启或关闭时间都 是50ms的倍数 每次中断查询设定的时间点,然后同时输出两个灯的状态。如3S时(中断次数60), A灯亮,B灯灭,5S时,A灯亮,B灯也亮 10秒时AB灯都灭 过一个周期,如60s 回到0秒时的状态 如果灯亮灯灭的规律你自己都 找...