自我介绍下:60后从业模电,自封工程师,动手能力强。学单片机历程30年,学级仍是未入门的学前班。所以各位看官都是我的老师,各位的每句话都能使我进步!期望大家都出一份正能量!废话不说入正题: PIC12F683单片机,编程平台MPLAB IDE -V8.84 编译器HI-TECH-PICC_9.83 无单片机开发板,有RF809H编程器,有GA1202CAL示波器 实验要求单片机GP0和GP1输出20KHz占空比为50%的互补方波
C程序: #include <pic.h>
void IO_init(void) /*端口初始化*/ { TRISIO=0x00; GPIO=0X00; } void timer0_init(void) //定时器0初始化使用系统默认时钟4M fosc/4 所以计数周期为1us { T0CS=0; //timer0工作于定时器方式 PSA=1; //timer0不分频 T0IF=0; //清timer0中断标志 TMR0=0xE0; /*置初值 20KHz的半个周期为25us*/ T0IE=1; //timer0中断允许 GIE=1; //开全局中断 }
void interrupt isr(void) //中断子程序 { TMR0=0xE0; //定时器0置初值25us T0IF=0; //清中断标志 GP0=~GP0; //GP0位取反 GP1=!GP0; //使GP1引脚取反GP0 /*在这里废寝忘食3总天,一度引起孙子的奶奶发飙 也没有折腾出正确的结果*/ } void main(void) //主程序 { IO_init(); //引脚初始化函数 timer0_init(); //定时器0初始化函数 while(1) //死循环 { } }
写入单片机;手工搭建最小系统上示波器看波形结果频率是26.3KHz,GP0引脚正占空比只有12.6%,负占空比87.3%;GP1引脚正占空比86.3%,负占空比13.6%幅值5.04V 删除中断子程序里的GP1=!GP0语句结果GP0引脚示波器上只有一条5.17V的直线没有波形了,频率显示为小于10Hz. 大家说怪不怪!!本应该GP0输出信号不受影响的怎么就没有了呢???? 接下来就是折腾了反复换TMR0的初值,最后试到0xE0时频率是19.96KHz正占空比9.6%负占空比是90.4%,也就是说正脉冲的宽度是4.8us这个值基本是恒定的试了下,从10KHz到30KHz这个值不变.然后大发现这个4.8us竟然是执行GP1=!GP0 这条语句所耗费的时间,所以上述删除这条语句示波器上只显示一直线。
|