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的矩形脉冲等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)