使用单片机的定时器,
例如:你输出1ms,占空比为50%的方波;
定时1ms,在定时中断子程序中,flag(P1^1)取反,就可以实现。
c程序如下:
#include<reg52h>
sibt flag=P1^1;
main()
{
TMOD=0X00;//定时器0工作方式定义
TH0=0X1C;//计数初TH0
TL0=0X18;//计数初值TL0
ET0=1;//开定时器0中断
EA=1;//开全局中断
TF0=0;//定时器0中断标志位清0
TR0=1;//定时器0开始计数
while(1);
}
void int0() interrupt 1 using 0//定时器0服务子程序
{
TH0=0X1C;//计数初TH0
TL0=0X18;//计数初值TL0
flag=~flag;
}
void main(void)
{uint temp1,temp2,counter;
initial();
for(;;) //产生周期为1000us的方波
{
TH1=0Xf0; // 重新装载计数初值
TL1=0X0c;
while(!TF1); //你是用查询的方式产生方波,但原程序的这个部分有问题
FB=!FB;
TF1=0;
if(loop1=1)
TR0=1; //开始计数
if(loop2=1) //停止计数
{TR0=0;
temp1=TL0;temp2=TH0;
couter=(temp2<<8)+temp1; //记录计数的次数
}
}
}
不知道500ums是什么单位,理解为500ms吧,占空比40%。这个不重要,理解错误自己改动一下就好了。
;假定晶振12M,机器周期1us
ORG 00H
AJMP GO
ORG 0BH
AJMP TIME0_1
ORG 30H
GO:
MOV SP,#60H
MOV TMOD,#01H
MOV TH0,#0B0H
MOV TL0,#3CH ;50MS
MOV R5,#5 ;中断间隔计次
MOV R6,#2 ;2中断为100MS
MOV R7,#0 ;取表序号数
LOOP:
MOV DPTR,#TAB
MOV A,R7
MOVC A,@A+DPTR
MOV P3,A
AJMP LOOP
TIME0_1:
PUSH ACC
DJNZ R6,RTT
MOV R6,#2 ;2次中断为100ms
INC R7 ;取表加1
DJNZ R5,RTT ;中断间隔次5次,2次为高电平,3次低电平,40%占空比
MOV R5,#5
MOV R7,#0
RTT:
POP ACC
RETI
TAB:
DB 80H,80H,00H,00H,00H
END
占空比为2:5周期为500ums的方波脉冲信号
----
题目写错了。
第一、500ums,不是时间单位。
第二、占空比为2:5,也不是方波。
第三、题目并没有给出晶振频率。
因此,凡是按照题目回答的答案,都是错误的。
以上就是关于Proteus如何输入方波脉冲,同时用keil怎么编译,能举个例子最好全部的内容,包括:Proteus如何输入方波脉冲,同时用keil怎么编译,能举个例子最好、51单片机:T1用作定时器在p1.0产生方波脉冲,输出到T0,T0用作计数器,记录该方波的下降沿个数,如下所述、AT80C51单片机,用汇编语言编写程序,在单片机的P3.7口产生一个占空比为2:5周期为500ums的方波脉冲信号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)