![]() |
發布時間: 2021-5-26 17:53
正文摘要:代碼如下,仿真用stc89c52,實際用的是IAP15W4K58S4。 用protues仿真沒有問題,電阻電容都能測出來。可實際用自己焊的液晶屏卻全是黑塊,對比度也調過了。 現在還有一個疑問是,4052數據選擇器的輸出端與單片機相 ... |
杜邦線壓線的時候,可能有一股導線沒壓進去,與另一根短路,90%都是此問題導致的。 |
新新科技 發表于 2021-5-27 11:14 兩個555和數據選擇器的輸出都沒錯,會不會主要是芯片哪里的代碼有沖突,或者是延時函數的問題? |
是要把delay函數改掉嗎?里面的值是要改小還是改大? 改delay_us還是改delay_ms? |
liqingb 發表于 2021-5-27 10:39 如果是改delay的話,應該在原有基礎上如何改進? |
通常是某個接線錯誤導致,軟件無問題,就先再次認真核對接線吧。 |
liqingb 發表于 2021-5-27 10:39 是要把delay函數改掉嗎?里面的值是要改小還是改大? 改delay_us還是改delay_ms? |
我測試過可以的,我用的是24m晶振,你把時間該小一些試試 |
#include<STC15.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit R=P1^0; sbit C=P1^1; sbit A1=P1^3; sbit A0=P1^4; sbit RW=P2^5; //讀寫選擇位,P2.5引腳 sbit RS=P2^6; //寄存器選擇位,P2.6引腳 sbit E=P2^7; //使能信號位,P2.7引腳 #define FR P3^5 //sbit 位變量名=SFR名稱^變量位地址值 #define LCD_data P0 //定義P0.0至p0.7接口 //uchar code table1[16]={0x52,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52}; //uchar code table2[16]={0x43,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x46}; uchar code table1[16]={"R= R"}; uchar code table2[16]={"C= pF"}; uchar code f_table[88]={13,14,15,16,17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100}; uchar code f_correct[88]={9,10, 11, 12, 12, 12, 13, 14, 15, 16, 17, 18, 18, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, 26, 26, 27, 28, 29, 29, 30, 30, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 51, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 70, 71, 71,}; uchar a8,a7,a6,a5,a4,a3,a2,a1,a0; uchar flag; unsigned long cnt,cnt1,cnt2; unsigned m1, m2, m3, m4; uchar f_cnt; // char:8位字符型數據類型 /********************************/ void delay_us(); //18us void delay_ms(uint); void lcd_init(); void lcd_write_com(uchar com); void lcd_write_dat(uchar dat); void lcd_init(); void lcd_display(uchar add,uchar dat); /***********************************/ void delay_us() //延時18us? { uchar x; for(x=5;x>0;x--); //5個時鐘周期 } void delay_ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=2460;y>0;y--); //延遲時間為123*z } void lcd_write_com(uchar com) //LCD寫指令 { E=0; RS=0; RW=0; delay_us(); LCD_data=com; E=1; //高脈沖寫入數據 delay_us(); E=0; } void lcd_write_dat(uchar dat) //LCD寫數據 { E=0; RS=1; RW=0; delay_us(); LCD_data=dat; E=1; //高脈沖寫入數據 delay_us(); E=0; } void lcd_init() //lcd初始化 { delay_ms(15); lcd_write_com(0x38); //十六進制數,設置16x2顯示,5x7點陣,8位數據接口 delay_ms(10); lcd_write_com(0x0c); //設置開始顯示不顯示光標 delay_ms(10); lcd_write_com(0x06); //寫一個字符后地址指針加1 delay_ms(10); lcd_write_com(0x01); //顯示清零數據指針清零(清屏) delay_ms(2); } void timer_init(void) //定時器初始化 { TMOD=0X51; PT0=1; /*中斷優先*/ TH0=0x4c; TL0=0x00; TH1=0; TL1=0; ET0=1; ET1=1; TR0=1; TR1=1; EA=1; } void lcd_display(uchar add,uchar dat) //lcd顯示(地址,數據) { lcd_write_com(add); //地址 lcd_write_dat(dat); //數據 delay_us(); } void real_display(void) { if(!R) //寫“R=……R” { A1=A0=0; lcd_display(0x80,table1[0]); //R,0x80表示第一位地址 lcd_display(0x80+1,table1[1]); //= lcd_display(0x80+14,table1[14]); //R,正常 lcd_display(0x80+15,table1[15]); } else if(!C) //寫“C=……pF” { A0=0;A1=1; lcd_display(0x80,table2[0]); //C lcd_display(0x80+1,table2[1]); //= lcd_display(0x80+14,table2[14]); //P lcd_display(0x80+15,table2[15]); //F } //由高位往低位寫入數據 if(a8) lcd_display(0x80+2,0x30+a8); //0x30表示0 else lcd_display(0x80+2,' '); if(a8||a7) lcd_display(0x80+3,0x30+a7); else lcd_display(0x80+3,' '); if(a8||a7||a6) lcd_display(0x80+4,0x30+a6); else lcd_display(0x80+4,' '); if(a8||a7||a6||a5) lcd_display(0x80+5,0x30+a5); else lcd_display(0x80+5,' '); if(a8||a7||a6||a5||a4) lcd_display(0x80+6,0x30+a4); else lcd_display(0x80+6,' '); if(a8||a7||a6||a5||a4||a3) lcd_display(0x80+7,0x30+a3); else lcd_display(0x80+7,' '); if(a8||a7||a6||a5||a4||a3||a2) lcd_display(0x80+8,0x30+a2); else lcd_display(0x80+8,' '); lcd_display(0x80+9,0x30+a1); lcd_display(0x80+10,0x2e); //0x2e表示小數點 lcd_display(0x80+11,0x30+a0); } void correct(void) //誤差修正函數 { uchar i,k; unsigned long wucha; if(cnt<1000000) //100KHz以內的修正 { if(cnt>9800&&cnt<21000) cnt-=1; if(cnt>=21000&&cnt<39000) cnt-=2; if(cnt>=39000&&cnt<48000) cnt-=3; if(cnt>=48000&&cnt<57000) cnt-=4; if(cnt>=57000&&cnt<80000) cnt-=5; if(cnt>=80000&&cnt<91000) cnt-=6; if(cnt>=91000&&cnt<109000) cnt-=7; if(cnt>=109000&&cnt<119000) cnt-=8; if(cnt>=119000&&cnt<130000) cnt-=9; if(cnt>=130000&&cnt<=1000000) { k=cnt/1000; for(i=0;i<88;i++) { if(k==f_table[i]) { cnt-=f_correct[i]; } } } } if(cnt>10000000) { wucha=(cnt/1000)*73065/100000; cnt-=wucha; } } void main() { P1M1 = 0x00; P1M0 = 0x00; P0M1 = 0x00; P0M0 = 0x00; P2M1 = 0x00; P2M0 = 0x00; P3M1 = 0x00; P3M0 = 0x00; timer_init(); //定時器初始化 lcd_init(); //lcd初始化 while(1) { if(flag==1) { real_display(); flag=0; } } } void timer0() interrupt 1 //定時器0的中斷函數,interrupt中斷關鍵字,1定時器0的中斷號 { uchar timer0; //定時時間50ms,主振頻率11.0592MHz //機器周期=12/主振頻率 //計數次數=定時時間/機器周期=46080 //65536-46080=19456 //4c00 TH0=0x4c; //高位 TL0=0x00; //低位 timer0++; if(timer0==20) //60-32+1=19 { TR1=0; //關閉的計數器 EA=0; cnt=TL1+TH1*256+f_cnt*65536; correct(); if(!R) { //cnt1為待測值 cnt1=10000000/(2*0.693*cnt)-165; //1/cnt為NE555脈沖周期,1/cnt1=0.693*(R+2RX)*10^(-7) // cnt1=1/(1/(10000000/(2*0.693*cnt)-(1000+2*560)/2)-1/(47*1000000))/11.0592*12; } else if(!C) { cnt1=1000000000/(0.693*3*510*cnt); //1/cnt=0.644*(3*510*10^3)*CX } timer0=0; a8=cnt1%100000000/10000000; a7=cnt1%10000000/1000000; a6=cnt1%1000000/100000; a5=cnt1%100000/10000; a4=cnt1%10000/1000; a3=cnt1%1000/100; a2=cnt1%100/10; a1=cnt1%10; if(!R) { cnt2=10000000*10/(2*0.693*cnt)-165; a0=cnt2%10; } else if(!C) { cnt2=1000000000*10/(0.693*3*510*cnt); a0=cnt2%10; } flag=1; TH1=0; TL1=0; TH0=0x4c; TL0=0x00; cnt=0; f_cnt=0; EA=1; TR1=1; //打開計數器 } } void int1() interrupt 3 { f_cnt++; } |