#include<reg52h>
sbit output=P0^0;
void init()
{
TH1=(65535-1000)/256; //定时器1设定初始值 1ms中断一次即频率500Hz
TL1=(65535-1000)%256;
EA=1; //开总中断
ET1=1; //开定时器1中断
TR1=1; //启动定时器1
}
void t1() interrupt 3
{
TH1=(65535-1000)/256;
TL1=(65535-1000)%256;
output=!output;
}
void main()
{
init();
while(1);
}
用定时器定时100ms,可以从单片机一个引脚输出一个方波,就能看到效果了。
而你对ACC0 取反,这是在内部的,也看不到定时的效果呀。
你程序是采用查询方法判断定时到,即判断TF0的状态,就不能用开中断,
SETB EA
SETB ET0
这两行要删掉的。
改成如下这样
START:MOV P20,1
MOV TMOD,#01H
SETB TR0
MAIN: MOV R2,#2
LOOP: MOV TH0,#3CH
MOV TL0,#0B0H
JNB TF0,$
CLR TF0
DJNZ R2 ,LOOP
CPL P20
SJMP MAIN
END
下图是仿真时,从P20输出的方波信号,周期是200ms
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
中断程序中,变量加1,10次即500mS
P11取反即可
不管晶振频率是多少,一次就延时一秒是不可能的。
当晶振频率是12
M时,最大的延时是65536毫秒。通常可以设置定时50毫秒,并设置为中断方式,这样,每次当定时到就中断一次,再对中断计数,中断计数20次就是一秒了。
系统晶振为12MHz时,定时器的计数脉冲周期即为 1uS;
要求输出周期为200us,占空比为50% 的方波,即方波的高电平时间=100uS,低电平时间=100uS。
所以每定时100uS便产生一次中断,并将输出信号状态翻转一次;
sbit cp=P1^7;
void timer1 interrupt 3
{ cp=~cp; }
void main()
{
TMOD=0x20; // 定时器1采用方式2 进行定时;
TH0=256-100; //定时100uS;
TL0=TH0;
EA=1;ET1=1;TR1=1;
cp=1;
while(1){}
}
以上就是关于编写keil c程序,利用内部定时器T1,工作方式1,使单片机的P0.0口输出频率为50全部的内容,包括:编写keil c程序,利用内部定时器T1,工作方式1,使单片机的P0.0口输出频率为50、单片机实验用定时器T0,工作方式1,定时100ms。程序哪里有问题、1、使用定时器TO以方式1产生周期为 1S 的连续方波,并由P1.1输出,以中断方式 完成等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)