编写keil c程序,利用内部定时器T1,工作方式1,使单片机的P0.0口输出频率为50

编写keil c程序,利用内部定时器T1,工作方式1,使单片机的P0.0口输出频率为50,第1张

#include<reg52h>

sbit output=P0^0;

void init()

{    

TMOD|=0x10; //设置定时器1工作方式1

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输出,以中断方式 完成等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9771962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存