基于型号为STC8A8K64D4的单片机在11.0592MHZ下使用串口输入调整占空比输出PWM的程序
时间: 2024-03-05 07:47:23 浏览: 17
好的,以下是基于STC8A8K64D4单片机在11.0592MHz下使用串口输入调整占空比输出PWM的程序,你可以参考一下:
```c
#include <STC8.H>
#define FOSC 11059200L
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LED = P1^0; //定义P1.0为LED控制引脚
uchar pwm_duty = 50; //占空比值,初始值为50%
void InitUART() //串口初始化函数
{
TMOD = 0x20; //定时器1工作在模式2
TH1 = 0xFD; //波特率设置为9600
TL1 = 0xFD;
TR1 = 1; //启动定时器1
SCON = 0x50; //串口工作在模式1
ES = 1; //开启串口中断
EA = 1; //开启总中断
}
void InitPWM() //PWM初始化函数
{
P2M0 = 0x02; //将P2.1设置为推挽输出
P2M1 = 0x00;
PWMCKS = 0; //PWM时钟源选择FOSC
PWMCFG = 0x20; //PWM输出单端模式
PWMCR = 0x80; //PWM输出使能
PWMPH = 0x00; //PWM高8位初始值为0
PWMPL = 0x00; //PWM低8位初始值为0
PWMIF = 0; //清除PWM中断标志位
PWMIE = 1; //开启PWM中断
}
void main()
{
InitUART(); //初始化串口
InitPWM(); //初始化PWM
while(1)
{
LED = ~LED; //LED闪烁提示
delay(1000); //延时1s
}
}
void UART_ISR() interrupt 4 using 1 //串口中断服务函数
{
uchar ch;
if(RI) //接收中断
{
RI = 0; //清除接收中断标志位
ch = SBUF; //读取接收到的数据
if(ch>='0' && ch<='9') //检查接收到的数据是否合法
{
pwm_duty = ch-'0'; //将接收到的数据赋值给占空比变量
if(pwm_duty>100) //占空比值不能大于100%
{
pwm_duty = 100;
}
}
}
}
void PWM_ISR() interrupt 5 using 2 //PWM中断服务函数
{
static uint count = 0;
count++; //计数器加1
if(count>=100) //当计数器达到100时,输出一个完整的PWM波形
{
count = 0;
PWMDH = 0x00; //PWM高8位赋值为0
PWM0DUTY = pwm_duty*255/100; //计算PWM占空比
}
PWMF = 0; //清除PWM中断标志位
}
void delay(uint t) //延时函数,t为延时时间,单位为ms
{
uchar i, j;
while(t--)
{
i = FOSC/13000;
while(i--)
{
j = 14;
while(j--);
}
}
}
```
希望能对你有所帮助!