本帖最后由 明日香 于 2021-1-29 10:53 编辑
用定时器0,任选一管脚P21,使其输出频率50HZ,周期20ms,输出1500us的高电平时间
具体单片机程序如下:
#include <stc12c5a.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P2^1;//P21输出PWM波
uchar time=0; //占空比
/**单片机晶振11.0592MHZ,时钟周期为1/11.0592us,8位定时器最大定时时间256us**/
/*11.0592MHZ除以12=921600HZ,就是1秒921600机器周期,0.1ms就是92机器周期*/
/** 输出PWM频率为50HZ,即周期20ms,分成两百份,中断200次**/
/** 定时器初值:256-92=164 **/
/*周期20ms中高电平时间为1.5ms,也就是15*0.1ms*/
void time0init()//定时器0初始化
{
TMOD=0X02;//定时器0,工作方式2
TH0=164;
TL0=164;
ET0=1;
EA=1;
TR0=1;//开启定时器
}
void timer0() interrupt 1
{
TR0=0;//赋初值时关闭定时器
TH0=164; //定时器赋初值
TL0=164; //定时器赋初值
TR0=1;
time++;
if(time == 200)//PWM周期为0.1ms*200=20ms
{
time=0;
PWM=1;
}
if(time == 15)//占空比为15%,高电平时间为1500us
PWM=0;
}
void main()
{
time0init();
while(1)
{
}
}
用这是proteus仿真的波形:为啥会出现连续的波形呢?这明显不对啊,请问程序哪里不对呢?
|