PIC16F877A最小系統(tǒng)原理圖+定時器控制LED
利用周末完成對PIC的入門,交上一份小作業(yè),寫下一點小經(jīng)驗,給后來者做為參考。
隨便時間推移,PIC也出現(xiàn)了許多廉價編程器,我使用的是K149-BC,帶編程鎖緊座,也可ICSP用。官網(wǎng)(http://www.kitsrus.com/)有制作資料可供參考,我買的是成品,¥100元不到,USB轉(zhuǎn)UART使用的是PL2303,相信比FT232差,但似乎不影響這款編程器使用。源程序在MPLAB 7.6+PICC 8.05測試通過。
原理圖與源程序都比較簡單,值得注意的地方有:
1. 我們一般只使用12V高壓編程,PIC的低壓編程引腳必須下拉,或者在CONFIG中使低壓編程失效,否則MCU無法正常運行。
2. 因為編程器的VPP為12V高壓,使用中要注意不可接入其他引腳,同時MCU的VPP也作為復位腳,要接入復位電路,這里我直接上拉。要注意的時編程器不動作時可能有較強的拉電流能力,如果接上編程器后測得VPP電壓過低,要適當減小上拉電阻。
3. 定時器0的“內(nèi)部時鐘”指的是使用“系統(tǒng)時鐘”而非“內(nèi)部振蕩”,(16F877A也沒有內(nèi)部振蕩)。
#include
__CONFIG(HS & PWRTEN & LVPDIS & WDTDIS & BOREN);
//高速晶振,上電延時有效,低壓編程無效,看門狗無效,掉電檢測有效
void timer0_init()//Timer0初始化設置
{
PSA=0 ;//Timer0 使用預分頻器
PS0=0 ;//Timer0選擇分頻率為1:128
PS1=1 ;
PS2=1 ;
T0CS=0 ;//內(nèi)部時鐘(即系統(tǒng)時鐘)
TMR0=0xD5 ;
}
void port_init(void)//端口初始化
{
TRISA=0xfe;//RA0配置為輸出
}
void device_init(void)
{
port_init();
timer0_init();
T0IE=1 ;//Tiemr0中斷允許
GIE=1 ;//總中斷允許
}
void interrupt IRQ(void)//中斷子程序
{
static unsigned int count=0;
static bit ledonoff=0;
if(T0IF)//Timer0中斷服務子程序
{
T0IF=0 ;//清定時器中斷標志
TMR0=0xD5 ;//重設定時器初值
if(count++>500)
{
count=0;
ledonoff=!ledonoff;
RA0=ledonoff;
}
}
}
int main(void)
{
device_init();
RA0=1;
while(1)
{
;
}
return 0;
}