‘壹’ 51单片机程序如下,问定时器为啥没工作,求改错。
TF0是什么?溢出中断请求标志位。 T0计数溢出时由硬件自动置TF0为1。CPU响应中断后TF0由硬件自动清0。 中断是什么意思? 就拿 你这里来说,就是暂停执行你这里的主函数,去执行中断里面 的函数。
你的程序过程是这样的: 定时器第一次计数,计数满后,TF0=1,进入中断(此时,就暂停执行主函数里面的东西),但是你中断里什么都没有(没有中断函数),然后硬件又直接将TF0置0,跳出中断,回到主函数,判断if(TF0==1)是否满足,这里不满足(因为TF0=0),所以 IF里面所有的东西都没有执行(包括定时器的重装),所以定时器只计数了一次,然后程序结束。
你这里不能吧定时器0的重装数据放在主函数里面,这个过程要放在中断函数里面取处理,因此用定时器时,要开启定时器0中断。
程序应该这么 写:
‘贰’ 单片机 TCON 每一位:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 表示什么意思0或1代表什么谢谢,百度百科都没
这里TF、TR、IE、IT后面跟的0和1是对单片机寄存器中位的命名,因为有两个定时/计数器、两个中断,所以用0、1来区分。
各位的定义如下:
TF1、TF0:分别是定时器1、定时器0的溢出标志位。当定时器x计满溢出时,由硬件使TFx位置“1”,并申请中断。进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。
TR1、TR0:分别是定时器1、定时器0的运行控制位。由软件清“0”关闭定时器。当GATE=1,且INTx为高电平时,TR置“1”启动定时器;当GATE=0,TRx置“1”启动定时器。
IE1、IE0:分别为外部中断1、外部中断0的请求标志位。
IT1、IT0:分别为外部中断1、外部中断0的触发方式选择位。当ITx=0,为低电平触发方式;当ITx=1,为下降沿触发方式。
(2)单片机tf0为1没有中断扩展阅读:
TCON初始化:
1、确定工作方式(即对TMOD赋值);
2、预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);
3、根据需要开放定时器/计数器的中断(直接对IE位赋值);
4、启动定时器/计数器(若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。
‘叁’ 关于单片机汇编
你程序中的F0,并不是T0的中断请求标志位,中断请求标志位是TF0,当TF0=1时,申请中断,单片机响应后,从中断返回时才被自动清零。而F0是自己定义的一个标志位,与TF0毫无关系。或者是PSW寄存器中的一位,也是用户标志位,与TF0没有关系。
就你的程序,那个F0的标志位,在主程序中被清0了,可在中断程序中没有再被置1,
JB F0 ,COUNT,这条指令中的F0是不会变1的,也就是不会跳转的,这条指令也没有什么用。
再问一句,这程序是你自己写的,还是从哪里抄来的,程序中的
SETB GATE,那GATE是什么?注释是打开计数门,这是谁这么写的?那GATE是TMOD寄存器中的那个GATE吗,TMOD是不可以位寻址的寄存器,GATE并没有位地址,也就是说这条指令
SETB GATE是无效的。
所以,这个程序是有问题的。这只是在纸上谈兵吧,并没有编译吧,如果编译的话会有错误的,更不可能去真的运行了吧?那这就没有什么意义了,都是空谈。
‘肆’ 单片机程序定时器问题
应该是TF0=0; 这是清除定时器中断标志位为0。这个语句放在重新赋初值后与现在的位置,是有区别的。主要是对定时的精度的影响,因为,定时器定时到,则停止计数,必须重新赋值才开始计数定时,为了保证定时的精度,应立即赋值,以减少执行其它指令而延长了赋值的时间,所以,TF0=0放在赋值语句后,就不影响定时精度,而放在现在的位置,就要执行完才赋值。当然了,定时一次的误差虽然只有2us,但程序要运行一天以上,积累的计时误差就不能忽略了。
‘伍’ 如何实现单片机的中断
#define _1231_C_#include "reg51.h"#include "1231.h"//sbit OE=P2^3;unsigned int SystemTime;void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑{ TH0 = 0xdb; TL0 = 0xff;// TF0 = 0; SystemTime++;}void main(){ TMOD &= 0xF0; TMOD |= 0x01; //TMOD的值表示定时器工作方式选择 TH0 = 0xdb; //写入初始值,初始值可以决定定时多久 TL0 = 0xff;//根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。//TH0 = 0xdb;TL0 = 0xff;可以这样子理解相当于木桶里已经有部分液铅在里面,//TH0和TL0这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装水,//TH0 = 0xff;TL0 = 0xff;即表示桶的最高位置. TF0 = 0; //计数到时TF0为1,即当TH0 = 0xff;TL0 = 0xff;再运行一步TF0 = 1; TR0 = 1; //开始计数,从这时起,每运行一步TH0和TL0都会增加,直到TH0 = 0xff;TL0 = 0xff; //相当于开水龙头,如TR0=0则TH0和TL0不变 ET0 = 1; //允许定时器0中断 EA=1; //开总中断//下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0xff;TL0 = 0xff;//单片机会从死循环里退出,去执行中断部分的代码,即开始运行void timer0(void) interrupt 1 using 3{}//运行完中断部分的代码后,接着继续执行死循环里的代码。//注意:当TH0 = 0xff;TL0 = 0xff;再运行,TF0并没有从0变为1,个人猜测TF0=1;时触发了中断,并重新被置零。//如把ET0 = 1;和EA=1;注释掉,当TH0 = 0xff;TL0 = 0xff;再运行,TF0会变为1,此时不会再执行中断部分代码。 while(1) { if ((SystemTime%100)<50) //SystemTime除以100,余数小于50为真 { //这两行不用管,就当做是功能1 P0=0xf1; P2=0xf0; } else { //这两行不用管,就当做是功能2 P0=0x00; P2=0xf0; } };}释疑:void Timer0() interrupt 1 using 1Timer0 是函数名,随便取的 interrupt xx using y 跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1 4 串行中断
‘陆’ 51单片机中执行完定时器中断函数,TF0是硬件自动清0吗
TF0是51单片机定时器T0的溢出中断标志位。当T0被允许计数后,T0从初值开始按机器周期或者外部引脚输入的脉冲进行加1计数。当计数到T0最高位产生溢出时,置“1”TF0,并向CPU请求中断。当CPU响应该中断时,将由硬件自动清“0”TF0。当然,你也可以用“位操作指令”对TF0进行置“1”或清“0”操作。
‘柒’ 如果单片机T0的中断没开,T0计满数后,TF会始终保持为1吗会影响下面重新开始的计数吗
T0的话一般TF0由硬件清0,至于计数和中断是两个相对独立而又有联系的过程,媒介就是T0的中断允许,也就是说中断允许开不开计数照常,TF变化和T0中断开了一样,满了清0满了清0.bu不影响重新计数
‘捌’ 51单片机中断问题
这位仁兄:
单片机有两种工作方式:中断和查询。
你用的是查询,没用到中断。要用到中断的话,就得给EA、 ET1、ET0 设1开中断。
TF0、TF1是定时器溢出标志,特点是有中断时由硬件清零,没用到中断时,由软件清零。你的程序没用到中断,当然中断也不会响应,所以必须用软件清零。
把你的程序改一改如下,是一个用中断的例子:
#include<reg51.h>
sbit P10=P1^0;
void timer0(void) interrupt 1 using 1
{
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
P10=1;
}
void main (void)
{
TMOD=0x01;
P10=0;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
EA=1; ET0=1;
TR0=1;
for(;;)
//TF0=0; 这句不用了
}
‘玖’ 单片机中,计数器tcon中tf0,tro是什么意思他们的值对计数器有什么影响
1.TF0由硬件控制,当计数器溢出时置为1时,中断发生;中断后自动清0
2.TR0是程序控制,控制T0的工作,置1工作,清0停止
‘拾’ 单片机程序中TF0是什么意思 定时器T0溢出中断
定时器/计数器0的溢出中断标志位
当T0从初值开始加一计数到产生溢出时,由硬件使TF0置1,直到CPU响应中断由硬件复位