標題:
關于單片機呼吸燈的新想法設計
[打印本頁]
作者:
鄧文雄ABC
時間:
2018-9-10 16:59
標題:
關于單片機呼吸燈的新想法設計
看過一些用單片機做的呼吸燈,很多都是利于延時做的。如果用延時做,會有大量的延時處理。這是非常落后的程序,再想擴展別的功能就可能得不到正確的響應。我想到一個方法來做,并且已實現(xiàn)同時多路LED 的呼吸燈;
原理圖見附件。
利用一個定時器產(chǎn)生20US的中斷。每500個中斷時間就是10ms,利用500個中斷控制這10ms的高低電平(占空比),如250個中斷高,250個中斷低,就是50%的占空比。10MS的周期剛好是100HZ,LED 100HZ刷新足夠了。利用另一個定時器來控制占空比的時間,這樣就產(chǎn)生的呼吸效果。而且可以同時控制多路。
單片機源碼:
#ifndef _CONFIG_H
#define _CONFIG_H
#include "STC15W40XXX.H"
#include <intrins.h>
//定義主時鐘
#define FOSC 24000000UL //20MHZ
#define T1000Hz (FOSC / 12 / 1000)
#define CCP_S0 0x10 //P_SW1.4
#define CCP_S1 0x20 //P_SW1.5
/* 數(shù)據(jù)類型定義 */
typedef signed char uchar; // 8位有符號整型數(shù)
typedef signed int uint; //16位有符號整型數(shù)
typedef signed long ulong; //32位有符號整型數(shù)
//定時器T0用作脈沖發(fā)生器,定時20us
void Timer0Init(void) //20微秒@24.000MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0xD8; //設置定時初值
TH0 = 0xFF; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1;
}
#endif
#include "main.h"
sbit LEDAll = P3^5;
sbit LEDA = P3^2;
sbit LEDB = P3^3;
sbit LEDC = P5^5;
sbit LEDD = P5^4;
sbit KEY_On=P3^4;
bit Power_on=0;
uchar KeySta = 1; //全部按鍵的當前狀態(tài)
uchar backup = 1; //按鍵值備份,保存前一次的值
uint cnt;
uint value;
uint PWM_Cont=0;
//--------------------
void UartInit(); [url=]//9600bps@33.1776MHz[/url]
void Timer0Init(); //Timer0 set
void PCATimerInit(); //Timer0 set
void Key_scan(); //按鍵掃描函數(shù)
void Key_Function(); //按鍵功能函數(shù)
void Delay500ms() [url=]//@33.1776MHz[/url]
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 64;
j = 9;
k = 179;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/**********************************************/
void main()
{
PCATimerInit(); //PCA定時器初始化
Timer0Init(); //定時器0初始化
UartInit(); //串口初始化
EA = 1; //打開總中斷
Delay500ms();
SBUF=0XFF;
LEDAll=0;
LEDA=0;
LEDB=0;
LEDC=0;
LEDD=0;
P1=0X00;
while(1)
{
if(Power_on )
{
// LEDAll=0;
}
else
{
//LEDAll=1;
}
}
}
/********************** Timer0 20us中斷函數(shù) ************************/
//定義20us的中斷,因為10ms的周期信號100hz控制LED頻頻, 在10MS內(nèi)分成500分占空比。每20US一次。
void timer0 (void) interrupt 1
{
static uint P_20us=0;
EA=0;
P_20us++;
if(P_20us>=500)
{
LEDAll=1;
P_20us=0;
}
else
{
if(P_20us==PWM_Cont)
LEDAll=0;
}
EA=1;
}
//PCA定時器中斷 1ms的中斷時間
void PCA_isr() interrupt 7 using 1
{
static bit i=0;
static uchar j=0;
j++;
CCF0 = 0; //清中斷標志
CCAP0L = value;
CCAP0H = value >> 8; //更新比較值
value += T1000Hz;
Key_scan();
Key_Function();
if(j>=5)
{
j=0;
if(i==0)
{
PWM_Cont++;
if(PWM_Cont==500)
{
i=1;
}
}
else
{
PWM_Cont--;
if(PWM_Cont==20)
{
i=0;
}
}
}
}
復制代碼
電路原理圖如下:
0.png
(141.07 KB, 下載次數(shù): 38)
下載附件
2018-9-10 17:49 上傳
下載:
直徑105MM的三色呼吸燈.pdf
(104.15 KB, 下載次數(shù): 16)
2018-9-10 16:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
鄧文雄ABC
時間:
2018-9-10 17:00
按鍵部份已刪除
作者:
z905188015
時間:
2018-9-11 14:38
學習學習,不錯不錯
作者:
z905188015
時間:
2018-9-11 14:38
學習學習,看看看看,見過大佬
作者:
leeder_a
時間:
2018-9-11 20:02
延時做的太占資源,芯片就干不了其它事了;用中斷來做,所占的資源很少,芯片可處理其它事情。
作者:
bhjyqjs
時間:
2018-9-12 08:37
專業(yè)呼吸燈可以,要是在其他應用中,20uS中斷一次,單片機什么也干不了
作者:
鄧文雄ABC
時間:
2019-1-25 10:15
單片機的頻率可以盡量設置最高的,比較24M或 以上,20US還是可以的,中斷里面不要做過多的事就可以
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1