
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P1//8个发光二级管
sbit key1=P3^5
sbit key2=P3^6
#define LED_ON() LED=0x00 //所有灯亮
#define LED_OFF() LED=0xff //灭
#define LED_PWM_MAX 99
#define LED_PWM_MIN 0
uchar LED_Direction=0 //LED方向控制 0:变亮 1:变暗
uchar LED_PWM_Counter=0 //LED占空比
uchar count=0 //中断计数
bit flag=0//按键扫描标志位
void main()
{
P3=0xff //做输入口先写1
TMOD=0x01
TH0=0xff
TL0=0x47
EA=1
ET0=1
TR0=1
while(1)
{
if(flag)
{
if(key1==0)
{
if((LED_PWM_Count<=LED_PWM_MAX)&&(LED_Direction==0))
{
LED_PWM_Count++
if(LED_PWM_Count>LED_PWM_MAX)
{
LED_PWM_Count=LED_PWM_MAX
LED_Direction=1
}
}
}
if(key2==0)
{
if((LED_PWM_Count>=LED_PWM_MIN)&&(LED_Direction==1))
{
LED_PWM_Count--
if(LED_PWM_count<LED_PWM_MIN)
{
LED_PWM_Count=LED_PWM_MIN
LED_Direction=0
}
}
}
if(LED_PWM_Count>0)
{
LED_ON()
LED_PWM_Count--
}
else
{
LED_OFF()
}
}
}
}
void timer0() interrupt 1
{
TH0=0xff
TL0=0x47
if(++count>=10)//2ms扫描一次按键(不行可以把时间改小)
{
count=0
flag=1
}
}
大概就这个思路,如果不行你自己改改吧!
51单片机pwm调光电路参考源程序:
int potpin=0//定义模拟接口0
int ledpin=11//定义数字接口11(PWM 输出)
int val=0// 暂存来自传感器的变量数值
void setup()
{
pinMode(ledpin,OUTPUT)//定义数字接口11 为输出
Serial.begin(9600)//设置波特率为9600
//注意:模拟接口自动设置为输入
}
void loop()
{
val=analogRead(potpin)// 读取传感器的模拟值并赋值给val
Serial.println(val)//显示val 变量
analogWrite(ledpin,val/4)// 打开LED 并设置亮度(PWM 输__________出最大值255)
delay(10)//延时0.01 秒
}
原理图:
PWM简介:
Pulse Width Modulation 就是通常所说的PWM,译为脉冲宽度调制,简称脉宽调制。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,由于计算机不能输出模拟电压,只能输出0 或5V 的的数字电压值,我们就通过使用高分辨率计数器,利用方波的占空比被调制的方法来对一个具体模拟信号的电平进行编码。
下面这个程序是应用在stc上的pwm程序,测试成功#includesfr CCON =0xD8 //PCA control register
sfr CMOD =0xD9
sfr CL =0xe9
sfr CH =0xF9
sfr CCAP0L=0xea
sfr CCAP1L=0xeb
sfr CCAP0H=0xfa
sfr CCAP1H=0xfb
sfr CCAPM0=0xda
sfr CCAPM1=0xdb
sbit CR=0xde//位寻址
void main(void)
{
CMOD=0x02 //使用系统时钟,时钟输入源频率fosc/2。PWM频率=fosc/2/256
/************************************
7 6 5 4 3 21 0
CIDL- - - cps2CPS1 CPS0 ECF
CIDL: =0时,空闲模式下PCA计数器继续工作;=1时,空闲模式下PCA计数器停止工作。
CPS2,CPS1,CPS0:PCA计数脉冲选择。010,定时器0的溢出,可以实现可调频率的PWM输出。
ECF: =1时,使能寄存器CCON CF位的中断;=0时,禁止该功能。
***************************************/
CL=0x00
CH=0x00
CCAP0L=0xc0//当CL小于CCAP0L时,输出为低大于时,输出为高。
CCAP0H=0x7f//当CL由ff变为00溢出时,CCAP0H装载到CCAP0L中,实现无干扰的更新PWM。
CCAP1L=0xc0//当CL小于CCAP1L时,输出为低大于时,输出为高。
CCAP1H=0xc0//当CL由ff变为00溢出时,CCAP1H装载到CCAP1L中,实现无干扰的更新PWM。
CCAPM0=0X42//使能PWM模式,PWM0=1,ECOM0=1
CCAPM1=0X42//使能PWM模式,PWM1=1,ECOM1=1
CR=1 //启动PCA计数器
while(1)
{
CCAP0H=RF4432_TxRxBuf[4] //此处改变占空比
CCAP1H=RF4432_TxRxBuf[5]
CCAP2H=RF4432_TxRxBuf[6]/2.5
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)