关于51单片机定时器的提问!
怎样实现单片机的任意时间定时?(就是需要单片机开始计时,它才计时)
首先是怎么单片机如何确定开始计时的问题,是什么中断方式来做?比如,按键,实时时钟,串口等等外设模块,得到这个信号后就方便了,在中断服务程序里直接启动定时器也行,置位一个标志位跳到主程序去处理也行
定时器工作有三个条件:1.初始值2.开启总中断3,打开定时器中断 你只要打开和关断条件3即可
通过设置定时器th1和th0的值设置初始值,同时打开中断,当中断产生时,定时器开始计时并且到达时间产生中断进行下一步骤
51单片机有两个定时器 每个定时器又有四种模式 你要自己自己选择模式
列如 定时器0 模式1 TMOD=0X01; TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;意思是打开定时器0的工作模式1 定时50ms溢出
设置 中断总开关EA 或者定时器0或1的中断允许
需要用的时候开启定时器中断(别忘了定时器赋初值),不用的时候定时器关闭中断即可。
那是不是只要定时器初值设置好,需要时直接给TR置1就可以了呢。还是需要在特定情况下TR置1才有效
那是不是只要定时器初值设置好,需要时直接给TR置1就可以了呢。还是需要在特定情况下TR置1才有效
先设置定时器模式 再赋初值 再打开定时器 需要中断再打开中断
TR0=1 是打开定时器0 一打开就开始计时
能给看一下我这个程序哪错了么?它老是不能计时,debug显示不进入中断
#include <reg52.h>
# include <intrins.h>
# define uint unsigned int
# define uchar unsigned char
uint tt=0;
void timerdy ()
{
tt=0;
P0=0xfe;
TMOD=0X01;
TH0=0X4C;
TL0=0X00;
IE=0X82;
}
void delay(uint a)
{
uint b,c;
for(b=0;b<=a;b++)
for(c=0;c<=110;c++);
}
void main ()
{
timerdy();
while(1)
{
P0=_crol_(P0,1);
delay(1000);
if(P0==0xef)
{
TR0=1;
P1=0x00;
}
if(tt==40)
{
tt=0;
P1=0xf0;
TR0=0;
}
}
}
void timer() interrupt 1 using 2
{
TH0=0X4C;
TL0=0X00;
tt++;
}
看看 学习学习!
1、打开总中断2,、打开定时器中断,3,给高八位、低八位赋初始值
总中断跟定时器中断没打开
即EA=1;ETO=1; 这样打开应该就不会错啦
IE就是统一设置的EA和ET0啊
我知道 你试试单独设置一下
少个EA=1总中断服务打开