PIC16F877A最小系统原理图+定时器控制LED
扫描二维码
随时随地手机看文章
利用周末完成对PIC的入门,交上一份小作业,写下一点小经验,给后来者做为参考。
随便时间推移,PIC也出现了许多廉价编程器,我使用的是K149-BC,带编程锁紧座,也可ICSP用。官网(http://www.kitsrus.com/)有制作资料可供参考,我买的是成品,¥100元不到,USB转UART使用的是PL2303,相信比FT232差,但似乎不影响这款编程器使用。源程序在MPLAB 7.6+PICC 8.05测试通过。
原理图与源程序都比较简单,值得注意的地方有:
1. 我们一般只使用12V高压编程,PIC的低压编程引脚必须下拉,或者在CONFIG中使低压编程失效,否则MCU无法正常运行。
2. 因为编程器的VPP为12V高压,使用中要注意不可接入其他引脚,同时MCU的VPP也作为复位脚,要接入复位电路,这里我直接上拉。要注意的时编程器不动作时可能有较强的拉电流能力,如果接上编程器后测得VPP电压过低,要适当减小上拉电阻。
3. 定时器0的“内部时钟”指的是使用“系统时钟”而非“内部振荡”,(16F877A也没有内部振荡)。
#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 ;//内部时钟(即系统时钟)
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;
}