PIC單片機(jī)用軟件產(chǎn)生PWM與按鍵實(shí)時(shí)處理
文章來(lái)源:www. 作者:未知 --------------------------------------------------------------------------------
該文章講述了PIC單片機(jī)用軟件產(chǎn)生PWM與按鍵實(shí)時(shí)處理.
假設(shè)現(xiàn)在有個(gè)產(chǎn)品,要實(shí)現(xiàn)一個(gè)按鍵調(diào)節(jié)LED的亮度(PWM六檔調(diào)光)。要以最低成平,體積要小,抗干擾最好。用PIC12C508A,最適合不過(guò)了。 方案實(shí)現(xiàn)如下:
按鍵功能:
一個(gè)普通的IO口接上拉電阻輸入,通過(guò)按鍵拉地。按鍵低電平有效,高電平無(wú)效。 每按一下占空比增加一檔。長(zhǎng)按無(wú)效,第次增加一檔。要防止干擾。 調(diào)光功能:
一個(gè)普通的IO口外接三極管驅(qū)動(dòng)LED,由于單片機(jī)沒(méi)有PWM模塊,沒(méi)有中斷功能。只能用軟件產(chǎn)生PWM信號(hào)。 我們都知道用軟件產(chǎn)生PMW 是占用單片機(jī)太多的時(shí)間,系統(tǒng)很難做其它工作。要如何實(shí)時(shí)處理按鍵功能,要多下 功夫才行。 編譯軟件為HI-PICC。
為了方面調(diào)試,先使用可擦寫的PIC16F84A調(diào)試源程序,成功后再移值到PIC12C508A單片機(jī)系統(tǒng)。
《按鍵實(shí)時(shí)處理流程》
聲明申請(qǐng)兩個(gè)標(biāo)志 1,有效標(biāo)志 2,完成標(biāo)志 為靜態(tài)私有,初始化只清零一次。
一,判斷有效標(biāo)志是否等于 1。是,向下執(zhí)行。否,跳到二處。
判斷按鍵是否等于 0。是,向下執(zhí)行。否,跳到三處。
判斷完成標(biāo)志是否等于 0。是,向下執(zhí)行。否,按鍵長(zhǎng)按,無(wú)效退出。
按鍵有效,增加占空比。完成標(biāo)志置為 1。退出。
二,判斷按鍵是否等于 0。是,置有效標(biāo)志為 1。否,沒(méi)有按鍵退出。
三,按鍵受干擾,或按鍵彈開(kāi)。清所有標(biāo)志,退出。
《軟件產(chǎn)生PWM流程》
一,根據(jù)占空比計(jì)算高電平延時(shí),低電平延時(shí)。
輸出高電平,軟件產(chǎn)生高電平延時(shí)。 輸出低電平,軟件產(chǎn)生低電平延時(shí)。 二,循環(huán)執(zhí)行約20毫秒,后退出。 《主程序主作流程》
一,調(diào)用初始化子程序.
二,調(diào)用按鍵處理子程序。 三,調(diào)用軟件產(chǎn)生PWM子程序。 四,循環(huán)執(zhí)行 二,三。 C源程序 /引入頭文件*********************************************************
#include <pic1684.h> //腳位定義***********************************************************
#define key RA3 //按鍵輸入 #define led RB0 //輸出指示 //*******************************************************************
//函數(shù)名稱:port_init(); //輸入?yún)?shù):無(wú) //輸出參數(shù):無(wú) //功能描述:端口設(shè)置 //建造日期:2008.06.03 //***************************************************************** void PortInit(void) { PORTA = 0xfd; // TRISA = 0xfd; //A 口設(shè)置 PORTB = 0x00; // TRISB = 0x00; //B 口設(shè)置 } //******************************************************************* //函數(shù)名稱:KeyInt(*p); //輸入?yún)?shù):占空比地址 //輸出參數(shù):無(wú) //功能描述:按鍵處理函數(shù) //建造日期:2008.06.03 //******************************************************************* void KeyInt(unsigned char *p) { static bit valid = 0; //有效標(biāo)志 static bit finish = 0; //完成標(biāo)志 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ù):無(wú) //功能描述: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ù):無(wú) //輸出參數(shù):無(wú) //功能描述:主要程序 //建造日期:2008.06.03 //******************************************************************* void main(void) // { unsigned char Pwm = 0x01; //占空初值 PortInit(); //腳位設(shè)置
while (1) { KeyInt(&Pwm); //按鍵處理 LedPwm(Pwm); //脈沖輸出 } } (原文件名:KeyInt2.jpg) 引用圖片 ![]() 經(jīng)過(guò)產(chǎn)品實(shí)測(cè)PWM頻率約為1KHZ.在按鍵按下,彈起,長(zhǎng)按.燈光不出現(xiàn)閃爍. 本文來(lái)自: 高校自動(dòng)化網(wǎng)(Www.) 詳細(xì)出處參考(轉(zhuǎn)載請(qǐng)保留本鏈接):http://www./html/pic/10866.html |
|