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

作者&投稿:阮堵 (若有异议请与网页底部的电邮联系)
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两个分别设置成定时器和计数器没问题,可以实现功能要求。需要帮忙写程序的话 可以私信我

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

51单片机的两个定时器T0和T1能同时工作吗?
答:可以的,其中的定时器互不影响,像8052有三个定时器,都可同时定时,还有它们的两个外部中断也都一起工作……

51单片机如何配置定时器2?
答:要配置51单片机的定时器2,首先需要了解其定时器的基本结构和功能。51单片机通常具有两个定时器/计数器,即定时器0和定时器1,而没有明确标记为“定时器2”的组件。然而,有些51单片机的变种或扩展版本可能包含额外的定时器或计数器,这些可能被称为定时器2。因此,下面的说明将基于一个假设...

51单片机两个定时器能共用吗
答:可以。可以运行,在执行A中断程序时,来了B中断,A的中断优先级高于B,B的中断请求将不被得到响应,51单片机有两个定时器,这两个定时器可以工作,互不影响。

51单片机3个定时器同时使用的问题
答:定时本身不会冲突的,除非程序中有修改的,你可以简单的测试下即可知道是否定时器的问题,还是你程序本身有问题。比如用定时T0定时一个闪灯,定时器1定时第二个个闪灯,定时器2定时第三个闪灯,即可看出来是否都在正常运行了,把他们的时间都定义不同更好看效果。

怎样使用51单片机的定时器?
答:51单片机定时器的使用 51单片机定时器/计时器的使用 步骤:1、 打开中断允许位:对IE寄存器进行控制,IE寄存器各位的信息如下图所示:EA: 为0时关所有中断;为1时开所有中断 ET2:为0时关T2中断;为1时开T2中断,只有8032、8052、8752才有此中断 ES: 为0时关串口中断;为1时开串口中断 ET1:...

51单片机中定时中断和串口不能同时使用?
答:那是因为你的定时器设置有问题.

51单片机怎样用1个定时器定时多个事件
答:在interrupt里面定义多个计时变量,t1,t2,t3 然后就和以前一样用

51单片机两个定时器同时走吗
答:同时进行,互不干扰。单计数器溢出时进行一次中断,然后继续计数。切记,避免同时进入中断,否则程序会絮乱。但是设置优先级,能够解决这种问题。

C51单片机外部中断,定时中断,串口中断同时使用的问题
答:应该一个定时器,一个计算器,一个外部中断。定时器中断设高。不要用外部中断计数,有可能会漏掉脉冲。开一个计数器就行,外部中断来了就开定时器和计数器。定时器到2S直接关计数器,并将计数值用串口发送。注意计数器满了之后会由FF变为00然后继续计数。

关于同时使用51单片机两个定时器中断的问题。急!急!急!
答:TR1=0; //定时器1不工作 TR0=0; //定时器0不工作 你的定时器没有工作 你只是把定时器中断打开了 还应该使定时器工作