单片机PWM程序是怎么编写的啊,能给一个简单的例子吗?

单片机PWM程序是怎么编写的啊,能给一个简单的例子吗?,第1张

有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:

#include<reg51.h>

unsigned char pwhh,pwhl,pwlh,pwll

bit flag

sbit pwm=P1^0

void t0isr() interrupt 1

{

if(flag)

{

TH0=pwhh

TL0=pwhl

}

else

{

TH0=pwlh

TL0=pwll

}

pwm=~pwm

}

main()

{

TMOD=0x01

pwhh=(65536-1000)/256

pwhl=(65536-1000)%256

pwlh=(65536-500)/256

pwll=(65536-500)%256

TH0=pwhh

L0=pwhl

TR0=1

ET0=1

EA=1

while(1)

}

#include<reg51.h>

#define uchar unsigned char

uchar pwm=50,cnt

sbit pluse=P1^0

sbit keyu=P1^4

sbit keyd=P1^5

void t0isr() interrupt 1

{

TH0=(65536-100)/256

TL0=(65536-100)%256

cnt++

if(pwm>0)

{

if(cnt>100)cnt=0

if(cnt<=pwm)pluse=1

else pluse=0

}

else pluse=0

}

main()

{

TMOD=0x01

TH0=(65536-100)/256

TL0=(65536-100)%256

TR0=1

ET0=1

EA=1

while(1)

{

if(keyu==0)

{

while(keyu==0)

pwm++

if(pwm>100)pwm=100

}

if(keyd==0)

{

while(keyd==0)

if(pwm>0)pwm--

}

}

}

共两个:

/*********************************************************************************************

程序名:触控调光台灯

编写人:杜洋

编写时间: 2009年 7月 25日

硬件支持: STC12C2052 12MHz

接口说明: P3.7(PWM0)用PWM控制LED,P1.5~P1.7接3路触摸键

修改日志:

NO.1-20090725_0622 完成触控开关LED灯部分和PWM调光部分程序。

NO.2-20090725_0638 完成开关灯时的渐变亮度

/*********************************************************************************************

说明:电路制作时需要将触摸键和VCC线放在一起,然后触摸时将手同时触摸按键引脚和VCC线。

/*********************************************************************************************/

#include <STC12C2052AD.H>//STC12Cx052或STC12Cx052AD系列单片机头文件

sbit ON_OFF_Key = P1 ^ 7//ON/OFF开关键

sbit Add_Key = P1 ^ 6//加亮度(+)

sbit Doc_Key = P1 ^ 5//减亮度(-)

//LED与P3.7(PWM0)连接

unsigned char Bright=0x88//全局变量,亮度值

bit POWER=0//LED灯开/关状态标志位

/*********************************************************************************************

函数名:PWM初始函数

调 用:PWM_init()

参 数:无

返回值:无

结 果:将PCA初始化为PWM模式,初始占空比为0

备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可

/**********************************************************************************************/

void PWM_init (void){

CMOD=0x02//设置PCA定时器

CL=0x00

CH=0x00

CCAPM0=0x42//PWM0设置PCA工作方式为PWM方式(0100 0010)

CCAP0L=0x00//设置PWM0初始值与CCAP0H相同

CCAP0H=0x00// PWM0初始时为0

CR=1//启动PCA定时器

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:PWM0占空比设置函数

调 用:PWM0_set()

参 数:0x00~0xFF(亦可用0~255)

返回值:无

结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平

备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可

/**********************************************************************************************/

void PWM0_set (unsigned char a){

CCAP0L= a//设置值直接写入CCAP0L

CCAP0H= a//设置值直接写入CCAP0H

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:毫秒级CPU延时函数

调 用:DELAY_MS (?)

参 数:1~65535(参数不可为0)

返回值:无

结 果:占用CPU方式延时与参数数值相同的毫秒时间

备 注:应用于1T单片机时i<600,应用于12T单片机时i<125

/*********************************************************************************************/

void DELAY_MS (unsigned int a){

unsigned int i

while( --a != 0){

for(i = 0i <600i++)

}

}

/*********************************************************************************************/

/*********************************************************************************************

函数名:主函数

调 用:无

参 数:无

返回值:无

结 果:程序开始处,无限循环

备 注:

/**********************************************************************************************/

void main (void){

PWM_init()//PWM初始化

P1M0 = 0xff//将P1接口设置为高阻态输入

P1M1 = 0x00//触摸按键启用

DELAY_MS (200)//延时等待I/O接口电平状态稳定

while(1){ //循环程序部分

unsigned char a//临时变量

if(ON_OFF_Key == 1){ //开关键按下

if(POWER == 0){ //如果当前状态为关,则执行开灯程序

for(a=0a<=Brighta++){ //

PWM0_set(a)

DELAY_MS (20)//渐暗的时间间隔

}

PWM0_set(Bright)//达到存储的LED亮度

POWER = 1//把状态标志位变成开

}else{ //如果当前状态为开,则执行关灯程序

for(a=Brighta>0a--){ //循环渐暗

PWM0_set(a)

DELAY_MS (20)//渐暗的时间间隔

}

PWM0_set(0)//关LED

POWER = 0//把状态标志位变成关

}

while(ON_OFF_Key == 1)//等待按键放开

}

if(Add_Key == 1 &&POWER == 1){ //加亮度键按下,同时在开灯状态下

Bright++//亮度值加1

PWM0_set(Bright)//将值写入PWM控制LED亮度

if(Bright >= 0xFD){ //如果亮度值大于0xFD,则不再增加

Bright = 0xFD

}

DELAY_MS (20)//渐变亮度的时间间隔

}

if(Doc_Key == 1 &&POWER == 1){ //减亮度键按下,同时在开灯状态下

Bright--//亮度值减1

PWM0_set(Bright)//将值写入PWM控制LED亮度

if(Bright <0x08){ //如果亮度值小于0x08,则不再减少

Bright = 0x08

}

DELAY_MS (20)//渐变亮度的时间间隔

}

}

}

/**********************************************************************************************/

/*************************************************************

* 杜洋工作室 DoYoung Studio

* 与电子爱好者同行 www.DoYoung.net

/*************************************************************/

/*********************************************************************************************

程序名:PWM模块调试程序(仅实验用)

编写人:杜洋

编写时间: 2009年7月22日

硬件支持: STC12C2052 12MHz

接口说明: LED灌电流接P3.7接口(PWM0)

修改日志:

NO.1-

/*********************************************************************************************

说明:

/*********************************************************************************************/

#include<STC12C2052AD.H>//头文件

/*********************************************************************************************

函数名:PWM初始化函数

调 用:PWM_init()

参 数:无

返回值:无

结 果:将PCA初始化为PWM模式,初始占空比为0

备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可

/**********************************************************************************************/

void PWM_init (void){

CMOD=0x02//设置PCA定时器

CL=0x00

CH=0x00

CCAPM0=0x42//PWM0设置PCA工作方式为PWM方式(0100 0010)

CCAP0L=0x00//设置PWM0初始值与CCAP0H相同

CCAP0H=0x00// PWM0初始时为0

//CCAPM1=0x42//PWM1设置PCA工作方式为PWM方式(使用时删除//)

//CCAP1L=0x00//设置PWM1初始值与CCAP0H相同

//CCAP1H=0x00// PWM1初始时为0

//CCAPM2=0x42//PWM2设置PCA工作方式为PWM方式

//CCAP2L=0x00//设置PWM2初始值与CCAP0H相同

//CCAP2H=0x00// PWM2初始时为0

//CCAPM3=0x42//PWM3设置PCA工作方式为PWM方式

//CCAP3L=0x00//设置PWM3初始值与CCAP0H相同

//CCAP3H=0x00// PWM3初始时为0

CR=1//启动PCA定时器

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:PWM0占空比设置函数

调 用:PWM0_set()

参 数:0x00~0xFF(亦可用0~255)

返回值:无

结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平

备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可

/**********************************************************************************************/

void PWM0_set (unsigned char a){

CCAP0L= a//设置值直接写入CCAP0L

CCAP0H= a//设置值直接写入CCAP0H

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:主函数

调 用:无

参 数:无

返回值:无

结 果:程序开始处,无限循环

备 注:

/**********************************************************************************************/

void main (void){

PWM_init()//PWM初始化

PWM0_set(0x10)//设置PWM占空比

while(1){

//无限循环程序

}

}

/**********************************************************************************************/

/*************************************************************

* 杜洋工作室 DoYoung Studio

* 与电子爱好者同行 www.DoYoung.net

/*************************************************************/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11797852.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存