① 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的亮度與其通電時間有關,也可以說成是占空比。上面的條件要理解成是呈線性增加或減小的頻率。可以理解成三角波,對應的面積就是通電時間。
不知能不能給你講明白!