專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應用測試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導入到強大技術支援服務 全程貼心伴隨服務,創(chuàng)造無限潛能!
十年專注單片機方案開發(fā)的方案公司英銳恩,分享軟件產(chǎn)生PWM與按鍵實時處理-PICC初學例子。英銳恩現(xiàn)提供服務產(chǎn)品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。
假設現(xiàn)在有個產(chǎn)品,要實現(xiàn)一個按鍵調(diào)節(jié)LED的亮度(PWM六檔調(diào)光)。要以最低成平,體積要小,抗干擾最好。用PIC12C508A,最適合不過了。
方案實現(xiàn)如下:
按鍵功能:
一個普通的IO口接上拉電阻輸入,通過按鍵拉地。按鍵低電平有效,高電平無效。
每按一下占空比增加一檔。長按無效,第次增加一檔。要防止干擾。
調(diào)光功能:
一個普通的IO口外接三極管驅(qū)動LED,由于單片機沒有PWM模塊,沒有中斷功能。只能用軟件產(chǎn)生PWM信號。
我們都知道用軟件產(chǎn)生PMW 是占用單片機太多的時間,系統(tǒng)很難做其它工作。要如何實時處理按鍵功能,要多下
功夫才行。
編譯軟件為HI-PICC。
為了方面調(diào)試,先使用可擦寫的PIC16F84A調(diào)試源程序,成功后再移值到PIC12C508A單片機系統(tǒng)。
《按鍵實時處理流程》
聲明申請兩個標志 1,有效標志 2,完成標志 為靜態(tài)私有,初始化只清零一次。
一,判斷有效標志是否等于 1。是,向下執(zhí)行。否,跳到二處。
判斷按鍵是否等于 0。是,向下執(zhí)行。否,跳到三處。
判斷完成標志是否等于 0。是,向下執(zhí)行。否,按鍵長按,無效退出。
按鍵有效,增加占空比。完成標志置為 1。退出。
二,判斷按鍵是否等于 0。是,置有效標志為 1。否,沒有按鍵退出。
三,按鍵受干擾,或按鍵彈開。清所有標志,退出。
《軟件產(chǎn)生PWM流程》
一,根據(jù)占空比計算高電平延時,低電平延時。
輸出高電平,軟件產(chǎn)生高電平延時。
輸出低電平,軟件產(chǎn)生低電平延時。
二,循環(huán)執(zhí)行約20毫秒,后退出。
《主程序主作流程》
一,調(diào)用初始化子程序.
二,調(diào)用按鍵處理子程序。
三,調(diào)用軟件產(chǎn)生PWM子程序。
四,循環(huán)執(zhí)行 二,三。
C源程序
/引入頭文件*********************************************************
#include
//腳位定義***********************************************************
#define key RA3 //按鍵輸入
#define led RB0 //輸出指示
//*******************************************************************
//函數(shù)名稱:port_init();
//輸入?yún)?shù):無
//輸出參數(shù):無
//功能描述:端口設置
//建造日期:2008.06.03
//*****************************************************************
void PortInit(void)
{
PORTA = 0xfd; //
TRISA = 0xfd; //A 口設置
PORTB = 0x00; //
TRISB = 0x00; //B 口設置
}
//*******************************************************************
//函數(shù)名稱:KeyInt(*p);
//輸入?yún)?shù):占空比地址
//輸出參數(shù):無
//功能描述:按鍵處理函數(shù)
//建造日期:2008.06.03
//*******************************************************************
void KeyInt(unsigned char *p)
{
static bit valid = 0; //有效標志
static bit finish = 0; //完成標志
if (valid == 1)
{
if (key == 0)
{
if (finish == 0)
{
finish = 1; //完成置位
if (*p == 251)
{
*p = 0x01; //按鍵有效
}
else
{
*p += 50; //按鍵有效
}
}
}
else
{
valid = 0; //有效清零
finish = 0; //完成清零
}
}
else
{
if (key == 0) valid = 1; //有效置位
}
}
//*******************************************************************
//函數(shù)名稱:LedPwm(Pwm);
//輸入?yún)?shù):占空比
//輸出參數(shù):無
//功能描述:led 脈沖調(diào)寬輸出
//建造日期:2008.06.03
//*******************************************************************
void LedPwm(unsigned char Pwm)
{
unsigned char PwmH;
unsigned char PwmL;
unsigned char i;
for (i = 0; i < 20; i++)
{
PwmH = Pwm; //脈沖高位
PwmL = 255 - PwmH; //脈沖低位
led = 1; //
while (PwmH--); //高位輸出
led = 0; //
while (PwmL--); //低位輸出
}
}
//*******************************************************************
//函數(shù)名稱:main();
//輸入?yún)?shù):無
//輸出參數(shù):無
//功能描述:主要程序
//建造日期:2008.06.03
//*******************************************************************
void main(void) //
{
unsigned char Pwm = 0x01; //占空初值
PortInit(); //腳位設置
while (1)
{
KeyInt(&Pwm); //按鍵處理
LedPwm(Pwm); //脈沖輸出
}
}
(文源網(wǎng)絡,侵刪)