失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > stc12c5a60s2c语言程序 STC12C5A60S2单片机产生SPWM主程序C代码

stc12c5a60s2c语言程序 STC12C5A60S2单片机产生SPWM主程序C代码

时间:2023-08-11 01:53:06

相关推荐

stc12c5a60s2c语言程序 STC12C5A60S2单片机产生SPWM主程序C代码

本程序通过模拟仿真,实际示波器测试,均表现良好,愿拿出来分享,若有更好的实现方法,希望高手多多指教。。。。

/*************spwm产生程序******/

/*单片机STC12C5A60S2,晶振11.0592M,正弦波50Hz,spwm波形21.6KHz*/

#include

#define uchar unsigned char

#define uint unsigned int

uchar code pwm[54]={255,240,226,211,196,182,168,154,141,128,115,103,91,80,69,59,50,42,34,27,20,15,10,6,3,1,0,

0,1,3,6,10,15,20,27,34,42,50,59,69,80,91,103,115,128,141,154,168,182,196,211,226,240,255

}; // 反正弦变化

int index=0;

sbit P13=P1^3; //PCA模块0输出

sbit P14=P1^4; //PCA模块1输出

bit zf=0; //前后半周期标志

void init_pca(void)//pca计数器初始化函数

{

CMOD=0x02;//计数器0的溢出为PCA计数器的时钟源,允许pca中断使能

CCON=0x00;

CCAPM0=0x42;//8位PWM输出,无中断

CCAPM1=0x42;//8位PWM输出,无中断

CL=0x00;//清零pca计数器

CH=0x00;

CCAP0L=pwm[0]; //初始化spwm输出的占空比

CCAP0H=pwm[0];

CCAP1L=pwm[0]; //初始化spwm输出的占空比

CCAP1H=pwm[0];

CR=1;//运行pca计数器

}

void init_timer(void)//计数器初始化函数

{

TMOD= 0x01; //计数器0工作在方式模式1

TH0 = 0XF7;//T1的计数值为2048,若是11.0592M晶振,则中断频率为11.0592M/2048=5.4K

TL0 = 0xFF; //T1的计数值低位

AUXR=0xC0;//计数器均工作在1T模式。计数频率11.0592M

ET0 = 1; //开中计数器0断

TR0 = 1; //开启计数器0

}

void int_timer0(void) interrupt 1//计数器1中断函数

{

TH0=0xF7; //重装计数值

TL0=0xFF;

index++; //查表索引

if(index==54) //半周期转换,每半周期分为60份

{

CR=0; //关PCA计数

index=0;

zf=~zf; //半周期标志,zf=0,前半周期,zf=1,后半周期

if(zf) //设置后半周期

{

P13=0;

CCAPM0=0X00; //关闭模块0

CCAPM1=0X42; //设置模块1工作方式

}

else //设置前半周期

{

P14=0;

CCAPM1=0X00; //关闭模块1

CCAPM0=0X42; //设置模块0工作方式

}

CR=1; //开PCA计数

}

if(zf==0) //将下一小格的占空比赋给相应值

{

CCAP0H=pwm[index];

}

else

{

CCAP1H=pwm[index];

}

}

void main(void)

{

P14=0;

P13=0;

EA=1;//开总中断

init_pca();

init_timer();

while(1)//主循环

{//彩灯程序 和1602显示程序

}

}

如果觉得《stc12c5a60s2c语言程序 STC12C5A60S2单片机产生SPWM主程序C代码》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。