① 51单片机pwm调光电路
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 Molation 就是通常所说的PWM,译为脉冲宽度调制,简称脉宽调制。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,由于计算机不能输出模拟电压,只能输出0 或5V 的的数字电压值,我们就通过使用高分辨率计数器,利用方波的占空比被调制的方法来对一个具体模拟信号的电平进行编码。
② 求大神给写一个单片机的pwm程序,,,
在编写单片机PWM(脉冲宽度调制)程序时,以下是一个参考示例,它展示了如何配置和初始化8051微控制器的PCA(可编程计数器/振荡器)模块以产生PWM信号。请注意,此代码是为特定硬件平台(如8051微控制器)和编译器(如Keil C)编写的,可能需要根据您的具体硬件和软件环境进行调整。
```c
#include "reg51.h" // 引入8051寄存器定义的头文件
#include "intrins.h" // 引入 Intrinsics 函数的头文件
// 定义相关宏
#define FOSC 11059200L // 定义晶振频率
typedef unsigned char BYTE; // 定义字节类型
typedef unsigned int WORD; // 定义字类型
// 定义并映射PCA相关寄存器
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P_SW1 = 0xA2; // 外设功能切换寄存器1
// 定义PCA中断和控制位定义
#define CCP_S0 0x10 // P_SW1.4
#define CCP_S1 0x20 // P_SW1.5
sfr CCON = 0xD8; // PCA控制寄存器
sbit CCF0 = CCON^0; // PCA模块0中断标志
sbit CCF1 = CCON^1; // PCA模块1中断标志
sbit CR = CCON^6; // PCA定时器运行控制位
sbit CF = CCON^7; // PCA定毕桥时器溢出标志
sfr CMOD = 0xD9; // PCA模式寄存器
sfr CL = 0xE9; // PCA定时器低字节
sfr CH = 0xF9; // PCA定时器高字节
sfr CCAPM0 = 0xDA; // PCA模块0模式寄存器
sfr CCAP0L = 0xEA; // PCA模块0捕获寄存器 LOW
sfr CCAP0H = 0xFA; // PCA模块0捕获寄存器 HIGH
sfr CCAPM1 = 0xDB; // PCA模块1模式寄存器
sfr CCAP1L = 0xEB; // PCA模块1捕获寄存器 LOW
sfr CCAP1H = 0xFB; // PCA模块1捕获寄存器 HIGH
sfr CCAPM2 = 0xDC; // PCA模块2模式寄存器
sfr CCAP2L = 0xEC; // PCA模块2捕获寄存器 LOW
sfr CCAP2H = 0xFC; // PCA模块2捕获寄存器 HIGH
sfr PCA_PWM0 = 0xF2; // PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xF3; // PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xF4; // PCA模块2的PWM寄存器
// 主函数
void main() {
// 配置端口
P1M0 = 0x00;
P1M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
// 配置P_SW1寄存器
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1); // 配置PCA模式
P_SW1 = ACC;
// 初始化PCA控制寄存器
CCON = 0;
// 停止PCA定时器
// 清除CF标志
// 清除模块中断标志
CL = 0;
CH = 0;
// 设置PCA时钟源
CMOD = 0x02;
// 禁止PCA定时器溢出中断
// 配置PCA模块0为8位PWM
PCA_PWM0 = 0x00;
CCAP0H = CCAP0L = 0x20; // 设置占空比为87.5%
CCAPM0 = 0x42;
// 配置PCA模块1为7位PWM
PCA_PWM1 = 0x40;
CCAP1H = CCAP1L = 0x20; // 设置占空比为75%
CCAPM1 = 0x42;
// 配置PCA模块2为6位PWM
PCA_PWM2 = 0x80;
CCAP2H = CCAP2L = 0x20; // 设置占空比为50%
CCAPM2 = 0x42;
// 启动PCA定时器
CR = 1;
// 主循环
while (1);
}
```
在这个示例中,程序首先配置了端口和P_SW1寄存器,然后初始化了PCA控制寄存器,并设置了PCA定时器的时钟源和PWM占空比。最后,它启动了PCA定时器,并进入了一个无限循环。
请根据您的硬件平台和开发环境调整寄存器地址、PWM占空比计算和其他相关设置。在实施之前,请确保进行充分的测试以验证代码的正确性。
③ 请高手用51单片机定时器计数器编写一个PWM的渐变程序,
发过去了,对的话,就给分吧
④ 求助,51单片机用PWM的RGB呼吸灯程序怎么写
#include<reg52.h>
sbitLED0=P2^0;//译码器控制端,低有效
voidDelay(unsignedintt);//函数声明
voidmain(void)
{
unsignedintset=400,pwm=0;//定义周期并赋值
while(1)//主循环
{
LED0=0;
Delay(60000);//延时,可以看到熄灭的过程
for(pwm=1;pwm<set;pwm++){
LED0=1;//熄灭LED
Delay(pwm);//延时长度,600次循环中从1加至599
LED0=1;//点亮LED
Delay(set-pwm);//延时长度,600次循环中从599减至1
}
LED0=1;
for(pwm=set-1;pwm>0;pwm--){//与逐渐变亮相反的过程
LED0=1;
Delay(pwm);
LED0=0;
Delay(set-pwm);
}
//主循环中添加其他需要一直工作的程序
}
}
voidDelay(unsignedintt)
{
while(--t);
}
⑤ 51单片机如何用一个按键和一个定时器来模拟PWM控制一个LED灯的亮度
使用定时器T0产生PWM方波,
用按键调整占空比,20级可调
控制led灯的亮度等级.
#include "my51.h"
#include "timer0.h"
#define grading 20 //亮度20级变化
sbit keyS3=P3^5; //按键调整占空比,PWM_keyChange++
sbit keyS4=P3^6; // PWM_keyChange--
u8 PWM_keyChange=10; //初值,按键调整在1~20之间变化
//占空比 PWM_keyChange/grading
void T0_work() //本函数由T0定时器中断函数调用
{
if(timeMultiple1Flag)
{
led=off(7); //关闭7号灯
timeMultiple1Flag=0; //清定时器复用置位标志
}
if(timeMultiple2Flag)
{
led=on(7); //打开7号灯
timeMultiple2Flag=0; //清定时器复用置位标志
}
}
void main() //测试
{
u8 keyFlag=1; //程序中没有消抖处理,只是简易的按键进出自锁标志
led0=ledon; //先打开0号灯,用于和7号灯对比亮度
initT0(1,10,grading); //1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒
while(1)
{
if(0==keyS3)
{
if(keyFlag) //防止一次按键中多次执行
{
keyFlag=0; //清标志,类似同步锁
if(++PWM_keyChange>grading)
{
PWM_keyChange=grading; //占空比最大100%
}
initT0(1,PWM_keyChange,grading);
}
}
else if(0==keyS4)
{
if(keyFlag)
{
keyFlag=0;
if(0==--PWM_keyChange) //占空比减小
{
PWM_keyChange=1; //最小占空比 1/20
}
initT0(1,PWM_keyChange,grading); //占空比减小
}
}
else
{
keyFlag=1; //按键锁释放标志,下一次按键时允许调整占空比
}
}
}
C代码
#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include <stdio.h>
#include "mytype.h"
#ifndef _51LED_
#define _51LED_
#define led P1 //P1总线连8个led灯,灯连573锁存器,P1置低电平点亮
#define LED led
#define ON(x) P1&(~(1<<(x))) //打开某个灯,开多个灯用 ON(m) & ON(n)
#define OFF(x) P1|(1<<(x)) //关闭某个灯,关多个灯用 OFF(m)| OFF(n)
#define on(x) ON(x) //包含大小写
#define off(x) OFF(x)
#define ledon 0 //某个灯,打开
#define ledoff 1 //某个灯,关闭
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //锁定当前8个led的状态,0锁定 ,1不锁定
#endif
/*************二进制输入宏****************************/
#ifndef _LongToBin_
#define LongToBin(n) \
( \
((n >> 21) & 0x80) | \
((n >> 18) & 0x40) | \
((n >> 15) & 0x20) | \
((n >> 12) & 0x10) | \
((n >> 9) & 0x08) | \
((n >> 6) & 0x04) | \
((n >> 3) & 0x02) | \
((n ) & 0x01) \
)
#define bin(n) LongToBin(0x##n##l)
#define BIN(n) bin(n)
#define B(n) bin(n)
#define b(n) bin(n)
#endif
/*************单个数据位的置位宏*********************/
#ifndef _BIT_
#define BIT(n) (1<<n)
#define bit(n) BIT(n)
#endif
#define high 1 //高电平
#define low 0 //低电平
sbit beep=P2^3; //蜂鸣器
extern void delayms(u16 ms);
extern void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////
#endif
C代码
#ifndef _TIMER0_H
#define _TIMER0_H
#include "my51.h"
extern u8 timeMultiple1Flag; //中断时间复用置位标志,须手动清零
extern u8 timeMultiple2Flag; //中断时间复用置位标志,须手动清零
extern void T0_work(); //该函数未实现,需外部实现
extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定时器初始化
#endif
C代码
#include "timer0.h"
u8 TH0Cout=0 ; //初值
u8 TL0Cout=0 ;
u16 T0IntCouts1=0; //中断计数
u16 T0IntCouts2=0; //中断计数
u16 timeMultiple1=0; //中断复用时间的倍数
u16 timeMultiple2=0; //中断复用时间的倍数
u8 timeMultiple1Flag=0; //中断时间复用置位标志,须手动清零
u8 timeMultiple2Flag=0; //中断时间复用置位标志,须手动清零
//开启定时器,定时完成后需要手动关闭TR0,否则将循环定时
//参数一是定时的毫秒数,参数二和三是定时基时的倍率数(定时复用)
void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) //定时器初始化设定,ms取值不超过65
{
u16 N=11059.2*ms/12; //定时器总计数值
TR0=STOP; //停掉定时器
ET0=CLOSE; //关定时器中断
//对于110592晶振,ms为5的整数倍时没有计算误差,但ms最大不超过71毫秒
TH0Cout =(65536-N)/256; //装入计时值零头计数初值
TL0Cout =(65536-N)%256;
if(0==t_multiple1) //0倍的基准时间是不合理的,至少1倍
{
t_multiple1=1;
}
if(0==t_multiple2) //0倍的基准时间是不合理的,至少1倍
{
t_multiple2=1;
}
timeMultiple1=t_multiple1; //倍时
timeMultiple2=t_multiple2; //倍时
TMOD &= 0xf0; //清定时器0配置
TMOD |= 0x01; //配置定时器0的工作方式为1
EA =OPEN; //打开总中断
ET0=OPEN; //打开定时器中断
TH0=TH0Cout; //定时器装入初值
TL0=TL0Cout;
TR0=START; //启动定时器
}
void T0_times() interrupt 1 //T0定时器中断函数
{
TH0=TH0Cout; //重装初值
TL0=TL0Cout;
if(++T0IntCouts1==timeMultiple1) //判断是否复用定时器
{
T0IntCouts1=0; //中断次数清零,重新计时
timeMultiple1Flag=1; //复用定时器标志,须在T0_work()中手动清零
}
if(++T0IntCouts2==timeMultiple2) //判断是否复用定时器
{
T0IntCouts1=0; //这个也要清,防止到达最小公倍数时乱掉
T0IntCouts2=0; //中断次数清零,重新计时
timeMultiple2Flag=1; //复用定时器标志,须在T0_work()中手动清零
}
T0_work(); //调用工作函数
}
⑥ 51单片机的某个I/O口 输出一组脉冲,求例子程序,谢谢了
#include<reg51.h> //
sbitP1_0=P1^0; //PWM 脉冲输出
sbitkey10=P3^2;
sbitkey11=P3^3;
unsignedcharSet_PWM0=2;//占空比调整
unsignedcharcounter=0; //计数的
bitbdatatt1; //标志位
voidmain()
{
TMOD=0x01;
TH0=(65536-2000)/256; //定时时间 可以修改
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{ //开关调整PWM 占空比
if(key10==0&&tt1==0){tt1=1;Set_PWM0++;}//K1、K2
if(key11==0&&tt1==0){tt1=1;Set_PWM0--;}
if(key10==1&&key11==1)tt1=0;
}
}
voidTimer0(void)interrupt1//定时器0 PWM控制
{
TH0=(65536-2000)/256; //定时时间 可以修改
TL0=(65536-2000)%256;
counter++;
if(counter>=16)counter=0; //PWM 16级 可以修改
if(counter>=Set_PWM0)P1_0=0;elseP1_0=1;
}
⑦ 请教51单片机利用PWM控制灯的亮度的程序
第一,要理解中断在这里的作用是固定的“一小段”时间进入一次。
第二,PWM_ON在程序中的作用很大,它会由0------>CYCLE------>0并且一直循环下去。可以把它看成一个有规律的变化的量。
第三,每进入中断一次count++,满足条件count==PWM_ON或count==CYCLE时改变LED的当前状态。作用是给小灯亮或灭的时间不同。
第四,LED的亮度与其通电时间有关,也可以说成是占空比。上面的条件要理解成是呈线性增加或减小的频率。可以理解成三角波,对应的面积就是通电时间。
不知能不能给你讲明白!