自我介紹下:60后從業(yè)模電,自封工程師,動(dòng)手能力強(qiáng)。學(xué)單片機(jī)歷程30年,學(xué)級(jí)仍是未入門的學(xué)前班。所以各位看官都是我的老師,各位的每句話都能使我進(jìn)步!期望大家都出一份正能量!廢話不說(shuō)入正題: PIC12F683單片機(jī),編程平臺(tái)MPLAB IDE -V8.84 編譯器HI-TECH-PICC_9.83 無(wú)單片機(jī)開(kāi)發(fā)板,有RF809H編程器,有GA1202CAL示波器 實(shí)驗(yàn)要求單片機(jī)GP0和GP1輸出20KHz占空比為50%的互補(bǔ)方波
C程序: #include <pic.h>
void IO_init(void) /*端口初始化*/ { TRISIO=0x00; GPIO=0X00; } void timer0_init(void) //定時(shí)器0初始化使用系統(tǒng)默認(rèn)時(shí)鐘4M fosc/4 所以計(jì)數(shù)周期為1us { T0CS=0; //timer0工作于定時(shí)器方式 PSA=1; //timer0不分頻 T0IF=0; //清timer0中斷標(biāo)志 TMR0=0xE0; /*置初值 20KHz的半個(gè)周期為25us*/ T0IE=1; //timer0中斷允許 GIE=1; //開(kāi)全局中斷 }
void interrupt isr(void) //中斷子程序 { TMR0=0xE0; //定時(shí)器0置初值25us T0IF=0; //清中斷標(biāo)志 GP0=~GP0; //GP0位取反 GP1=!GP0; //使GP1引腳取反GP0 /*在這里廢寢忘食3總天,一度引起孫子的奶奶發(fā)飆 也沒(méi)有折騰出正確的結(jié)果*/ } void main(void) //主程序 { IO_init(); //引腳初始化函數(shù) timer0_init(); //定時(shí)器0初始化函數(shù) while(1) //死循環(huán) { } }
寫入單片機(jī);手工搭建最小系統(tǒng)上示波器看波形結(jié)果頻率是26.3KHz,GP0引腳正占空比只有12.6%,負(fù)占空比87.3%;GP1引腳正占空比86.3%,負(fù)占空比13.6%幅值5.04V 刪除中斷子程序里的GP1=!GP0語(yǔ)句結(jié)果GP0引腳示波器上只有一條5.17V的直線沒(méi)有波形了,頻率顯示為小于10Hz. 大家說(shuō)怪不怪!本應(yīng)該GP0輸出信號(hào)不受影響的怎么就沒(méi)有了呢???? 接下來(lái)就是折騰了反復(fù)換TMR0的初值,最后試到0xE0時(shí)頻率是19.96KHz正占空比9.6%負(fù)占空比是90.4%,也就是說(shuō)正脈沖的寬度是4.8us這個(gè)值基本是恒定的試了下,從10KHz到30KHz這個(gè)值不變.然后大發(fā)現(xiàn)這個(gè)4.8us竟然是執(zhí)行GP1=!GP0 這條語(yǔ)句所耗費(fèi)的時(shí)間,所以上述刪除這條語(yǔ)句示波器上只顯示一直線。
|