本帖最后由 明日香 于 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仿真的波形:為啥會出現連續的波形呢?這明顯不對啊,請問程序哪里不對呢?
捕獲1.PNG (39.51 KB, 下載次數: 85)
下載附件
2021-1-27 11:11 上傳
捕獲2.PNG (2.06 KB, 下載次數: 87)
下載附件
2021-1-27 11:11 上傳
|