‘壹’ 51单片机计数器怎么用
51单片机是基础入门的一个单片机,还是应用最广泛的。
51单片机的定时/计数器的概念
单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流逝,因此,单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的。
51单片机的定时/计数器的工作原理
加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。
作为定时器使用时,定时器计数8051单片机片内振荡器输出经过12分频后的脉冲个数,即:每个机器周期使定时器T0/T1的寄存器值自动累加1,直到溢出,溢出后继续从0开始循环计数;所以,定时器的分辨率是时钟振荡频率的1/12;
作为计数器使用时,通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号进行计数,当输入的外部脉冲信号发生从1到0的负跳变时,计数器的值就自动加1由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。当晶振频率为12MHz时,最高计数频率不超过1/2MHz,即计数脉冲的周期要大于2微秒。;计数器的最高频率一般是时钟振荡频率的1/24;
由此可知,不论是定时器还是计数器工作方式,定时器T0和T1均不占用CPU的时间,除非定时器/计数器T0和T1溢出,才可能引起CPU中断,转而去执行中断处理程序。所以说,定时器/计数器是单片机中效率高而工作灵活的部件。
‘贰’ 单片机定时计数器程序运行过程
程序运行到这里就死循环了,
while
(1)
{
led2
=
0;
}
后边的代码是无缘运行的。
程序运行首先从地址0000H开始,跳转到主程序入口也就是main()那里开始,所以真正有意义的运行第一条是:
=
0x01;
依次往下执行,到TR0=1;开始定时器开始计数,根据你的赋值,计数到50000之后,定时器0溢出,开始申请中断,进入中断服务程序
void
intt0()
interrupt
1
using
2
执行完中断后返回到主程序,你现在的情况是在while(1)那个死循环之中。
你说的那个while(1)后边的{
}里边的程序在执行完TR0=1之后就执行了,并一直在执行到中断开始。中断结束后又一直执行下去,一直反复如此。
‘叁’ 51单片机定时计数器方式2的工作过程
因为51单片机处理数据是按八位进行的,所以给定时器赋初值的时候,不能将一个数直接赋到t0中,而是将这个数先转化为一个十六进制数,将它的高两位数(也就是二进制的高八位)传送给th0,将低两位(也就是二进制的低八位)传送给tl0!(65536-x)/256就是取计数值的高八位运算表达式,因为八位二进制的最大值为256,所以将一个十进制数除以256后就会得到这个十进制数高八位数。最后将所得的余数传送到tl0,也就是后面(65536-x)%256的工作!希望能帮助你
‘肆’ 51单片机计数器如何使用,我想要一个简单一点的程序
将定时器0或者1设置为计数器模式就可以了。举例如下:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#06H
MOV TH1,#0FFH
MOV TL1,#0FFH
SETB TR1
SETB ET1
SETB EA
SJMP $
T0ISR:
INC A
MOV P1,A
RETI
END
‘伍’ 51系列单片机定时/计数器初始化的步骤
TMOD:模式控制寄存器,定时器的运行模式,定时计数模式等;
TCON:运行控制寄存器,定时器的中断允许和外部触发中断允许,运行停止控制,溢出标志等
THx/TLx:计数值
IE:中断控制,如果要开启中断允许,则需要配置这个寄存器;
IP:中断优先级控制,如果开了几个中断源,则需要配置中断控制的先后;
总体就是:
先关运行和中断,然后配置模式,配置计数值,定时器运行打开,定时器是否中断允许,是否开启总中断;
如果不开中断,就直接配置模式和计数值,然后运行即可,主程序里查询溢出位,判断是否到计数值(不准确)。
其他定时器T2等,有其他的寄存器,但配置方法同。
‘陆’ 怎样用51单片机做计算器啊
1、硬件仿真图
4、程序源代码
#include <reg51.h>#include <intrins.h>
#include <ctype.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
uchar operand1[9], operand2[9];
uchar operator;
void delay(uint);
uchar keyscan();
void disp(void);
void buf(uint value);
uint compute(uint va1,uint va2,uchar optor);
uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dbuf[8] = {10,10,10,10,10,10,10,10};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan()
{
uchar skey;
P1 = 0xfe;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xee: skey = '7'; break;
case 0xde: skey = '8'; break;
case 0xbe: skey = '9'; break;
case 0x7e: skey = '/'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xfd;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xed: skey = '4'; break;
case 0xdd: skey = '5'; break;
case 0xbd: skey = '6'; break;
case 0x7d: skey = '*'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xfb;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xeb: skey = '1'; break;
case 0xdb: skey = '2'; break;
case 0xbb: skey = '3'; break;
case 0x7b: skey = '-'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xf7;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xe7: skey = '$'; break;
case 0xd7: skey = '0'; break;
case 0xb7: skey = '='; break;
case 0x77: skey = '+'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
return skey;
}
void main()
{
uint value1, value2, value;
uchar ckey, cut1 = 0, cut2 = 0;
uchar operator;
uchar i, bool = 0;
init:
buf(0);
disp();
value = 0;
cut1 = cut2 = 0;
bool = 0;
for(i = 0;i < 9;i++)
{
operand1[i] = '