编写程序,要求使用T0,采用方式2定时,在P1.0输出周期为400us,占空比为10:1的矩形脉冲。

编写程序,要求使用T0,采用方式2定时,在P1.0输出周期为400us,占空比为10:1的矩形脉冲。,第1张

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP IT0P

MAIN: MOV TMOD,#02H ;定时器/计数器T0为定时方式2

MOV TL0,#4AH ;定时364μs初值赋值

SETB TR0 ;启动T0,开始计数

SETB ET0 ;允许T0中断

SETB EA ;CPU开中断

SETB P10

WAIT: AJMP WAIT

IT0P: CLR EA

CLR P10 ;关中断

MOV R0,#9

DLY: DJNZ R0,DLY ;延时26μs

MOV TL0,#4AH ;定时364μs初值赋值

SETB P10

SETB EA

RETI

#include"at89x51h"

unsigned char PWM=0;

#define PWMOUT P1_0

#define KEYUP P1_1

#define KEYDOWN P1_2

void TunPWM();

void key();

void delayms(unsigned char time);

void main()

{

P1=0xff;

while(1)

{

key();

TunPWM;

}

}

void TunPWM()

{

unsigned char i;

for(i=0;i<PWM;i++)

PWMOUT=1;

for(i=0;i<100-PWM;i++)

PWMOUT=0;

}

void key()

{

if(KEYUP==0)

{

delayms(10);

if(KEYUP==0)

{

PWM++;

if(PWM==100)

PWM=100;

while(KEYUP==0);

}

}

if(KEYDOWN==0)

{

delayms(10);

if(KEYDOWN==0)

{

PWM++;

if(PWM==100)

PWM=100;

while(KEYDOWN==0);

}

}

}

void delayms(unsigned char time)

{

}

延时自己写。

DJNZ Rn,rel;

这个指令执行一次需要两个机器周期,R0=9,就是需要执行9次,那么总共消耗18个机器周期,而条件说一个机器周期为2uS,因此总消耗时间就是 36uS 了;

频率10kHz,周期是100微秒,半个周期定时50微秒,可用定时器实现,如果晶振12M,则需50个脉冲

TMOD=0x02;//定时器0 8位自动重装模式

TH0=256-50;

TL0=256_50;

ET0=1;

EA=1;

TR0=1;

中断程序中只需将输出管脚取反即可

如 P1^0=!P1^0

2ms周期方波,1:2占空比的话得不到精确值。

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#02H

MOV TH0,#246

MOV TL0,#246

SETB TR0

SETB ET0

SETB EA

SETB P10

CLR A

SJMP $

T0ISR:

INC A

CJNE A,#67,T01

T01:

JC T02

CLR P10

CJNE A,#200,T03

T03:

JC T0E

CLR A

T0E:

RETI

T02:

SETB P10

RETI

END

#include "reg52h"

unsigned char count; //05ms次数标识

sbit pwm =P2^7 ; //PWM信号输出

sbit jia =P2^4; //角度增加按键检测IO口

sbit jan =P2^5; //角度减少按键检测IO口

unsigned char jd; //角度标识

void delay(unsigned char i)//延时

{

unsigned char j,k;

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

void Time0_Init() //定时器初始化

{

TMOD = 0x01; //定时器0工作在方式1

IE = 0x82;

TH0 = 0xfe;

TL0 = 0x33; //110592MZ晶振,05ms

TR0=1; //定时器开始

}

void Time0_Int() interrupt 1 //中断程序

{

TH0 = 0xfe; //重新赋值

TL0 = 0x33;

if(count< jd) //判断05ms次数是否小于角度标识

pwm=1; //确实小于,PWM输出高电平

else

pwm=0; //大于则输出低电平

count=(count+1); //05ms次数加1

count=count%40; //次数始终保持为40 即保持周期为20ms

}

void keyscan() //按键扫描

{

if(jia==0) //角度增加按键是否按下

{

delay(10); //按下延时,消抖

if(jia==0) //确实按下

{

jd++; //角度标识加1

count=0; //按键按下 则20ms周期从新开始

if(jd==6)

jd=5; //已经是180度,则保持

while(jia==0); //等待按键放开

}

}

if(jan==0) //角度减小按键是否按下

{

delay(10);

if(jan==0)

{

jd--; //角度标识减1

count=0;

if(jd==0)

jd=1; //已经是0度,则保持

while(jan==0);

}

}

}

void main()

{

jd=1;

count=0;

Time0_Init();

while(1)

{

keyscan(); //按键扫描

}

}

以上就是关于编写程序,要求使用T0,采用方式2定时,在P1.0输出周期为400us,占空比为10:1的矩形脉冲。全部的内容,包括:编写程序,要求使用T0,采用方式2定时,在P1.0输出周期为400us,占空比为10:1的矩形脉冲。、单片机可调占空比程序。、编写程序,要求使用T0,采用方式2定时,在P1.0输出周期为400us,占空比为10:1的矩形脉冲等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存