杜邦线压线的时候,可能有一股导线没压进去,与另一根短路,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++; } |