完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用的是555定时器和ULN2003A来驱动三个继电器选择不同的测量档位,但是当我下进程序选择档位是,LCD上不能显示测量值,我检查了程序,修改了一些地方,但还是不行,由于是新手,很多地方不懂,请给我指导指导,谢谢了
|
|
相关推荐
6个回答
|
|
没有源程序咋分析问题
|
|
|
|
图不完整,还没有程序,能看什么
|
|
|
|
程序是根据别人的改的,不知道改错没有,求指导
|
|
|
|
主函数 #include #include "1602.h" #include "delay.h" ***it vo = P3^2; // 用于检测P3.2口的值,计算时间。 计时器0的开与断 ***it tr = P3^7; // 产生一个低电平脉冲 // 超量程提示灯 ***it ledclc = P2^7; ***it con1 = P0^0; // 用于控制继电器,实现档位选择 ***it con2 = P0^1; ***it con3 = P0^2; ***it key1 = P0^3; // 独立按键部分,用于用户选择量程 ***it key2 = P0^4; ***it key3 = P0^5; ***it key4 = P0^6; ***it led1 = P2^3; // 量程提示灯 ***it led2 = P2^4; ***it led3 = P2^5; ***it led4 = P2^6; unsigned int tw; // 用于获取定时器的数值 float ftemp; // 用于计算电容值的中间变量 unsigned long int c; // 存放电容值 unsigned char need; // 需要测量时置1,一次测量结束置0 unsigned char R; // 表示不同的档位 unsigned char flag; // 数据处理结束置1 unsigned char temp[8]; // 存放电容值的各个位 unsigned char zimu1[] = " range is higher"; //量程太高 unsigned char zimu2[] = "The value of Cap"; unsigned char zimu3[] = "please press key"; unsigned char zimu4[] = " to measure "; unsigned char zimu5[] = " range is lower "; void process(unsigned long int c); // 数据处理函数 void keyscan(); // 键盘扫描函数 void ledlight(unsigned char R); // 量程指示灯函数 void init_timer0() // 定时器0 初始化 { TMOD = 0x09; // gate置1,方式1,16位计时,定时器由P3.2控制开断 TH0 = 0x00; TL0 = 0x00; EA = 1; ET0 = 1; TR0 = 1; } void init_INT1 () // 定时器0 初始化 { EA = 1; IT1 = 1; // 下降沿触发 EX1 = 1; } void main() { ledclc = 1; // 超量程提示灯熄灭 need = 0; // 一开始无需测量 con1 = con2 = con3 = 0; flag = 0; init_timer0(); // 初始化 init_INT1(); LCD_init(); dispchar1(zimu3); dispchar2(zimu4); while(1) { if(need == 1) { // 当需要测量时 if(vo == 0 ) //vo == 0时检测计数器的值可能还没开始计数,可能计数结束 { if(TH0 != 0x00 || TL0 != 0x00) // 是计数结束 若有读数,用tw 存下 { tw = TH0 << 8; tw = tw | TL0; TH0 = 0x00; // 一次结束,计时器清零 TL0 = 0x00; need = 0; // 需要再次测量时,need置1.避免tw的值被更//改 即不需要测量时,一直保持 EX1 = 1; // 开外部中断1 } else // 反之,证明没有计数,无电容,默认值tw置0 { tw = 0; } } ftemp = tw / 1.1 ; // 计算电容值 根据公式 tw = 1.1 * R * C c = (unsigned long int)(ftemp )*100; //扩大了一百倍 便于后续程序 //取两位小数点 process(c); // 调用数据处理函数,根据不同的R值进行处理 } if(flag == 1 ) // 数据处理结束 每次处理结束,证明需要更新显示的数据 { if(tw>=50000 || ledclc == 0) // 量程超出 { dispchar3(zimu1); delay_us(100); // 量程太高 ledclc = 0; } else if(tw<=100 && ledclc == 1) //量程太低 { dispchar3(zimu5); delay_us(100); ledclc = 0; } else { dispchar1(zimu2); delay_us(10); disp(temp); } flag = 0; } keyscan(); } } void timer0() interrupt 1 // 定时器0中断 用于超量程提示 { TMOD = 0x09; // gate置1,方式1,16位计时,定时器由P3.2控制开断 TH0 = 0x00; TL0 = 0x00; ledclc = 0; } void exint1 () interrupt 2 // 外部中断0 用于产生低脉冲,启动555定时器 { unsigned char a; tr = 1; // tr端一个负脉冲 a = 20; while(--a); tr = 0; a = 20; while(--a); tr = 1; // tr端负脉冲结束 大约40us的负脉冲 need = 1; // 表示需要测量 ledclc = 1; // 关闭先前的超量程提示 EX1 = 0; // 暂时关闭外部中断,一次测量结束,再开放外部中断 } void process(unsigned long int c) { if(R == 1) // 10M 的电阻 量程10pf ~ 5000pf { c = c /10; lcd_pos(0x4a); LCD_write_Data(' '); LCD_write_Data('p'); LCD_write_Data('f'); LCD_write_Data(' '); LCD_write_Data(' '); } if(R == 2) // 100k 的电阻 量程5nf~ 500nf { c = c /100; lcd_pos(0x4a); LCD_write_Data(' '); LCD_write_Data('n'); LCD_write_Data('f'); LCD_write_Data(' '); LCD_write_Data(' '); } if(R == 3) //1k欧姆 的电阻 量程0.5uf ~ 50uf { c = c /1000; // 扩大了一百倍 单位 c = tw/500 uf lcd_pos(0x4a); LCD_write_Data(' '); LCD_write_Data('u'); LCD_write_Data('f'); LCD_write_Data(' '); LCD_write_Data(' '); } if(R == 4) //100欧姆 的电阻 量程50uf ~ 500uf { c = c /100; // 扩大了一百倍 单位 c = tw/500 uf lcd_pos(0x4a); LCD_write_Data(' '); LCD_write_Data('u'); LCD_write_Data('f'); LCD_write_Data(' '); LCD_write_Data(' '); } temp[0] = c / 100000; // 千位 temp[1] = c / 10000 % 10; // 百位 temp[2] = c / 1000 % 10; // 十位 temp[3] = c / 100 %10; // 个位 temp[4] = c / 10 % 10; temp[5] = c % 10; flag = 1; } void keyscan() { if(key1 == 0) { delay_ms(10); if(key1 == 0) // b3按下 { while(key1==0); R = 1; // 10M 的电阻 量程10pf~ 5000pf(5nf) con1 = 1; con3 = 1; con2 = 0; ledclc = 1; dispchar3(zimu2); disp(temp);dispchar1(temp) ; /*dispchar2(zimu4);*/ } } if(key2 == 0) // b4按下 { delay_ms(10); if(key2 == 0) { while(key2==0); R = 2; // 100k 的电阻 量程5nf~ 500nf con1 = 0; con3 = 1; con2 = 0; ledclc = 1; dispchar3(zimu2); disp(temp); } } if(key3 == 0) // b5按下 { delay_ms(10); if(key3 == 0) { while(key3==0); R = 3; con1 = 0; // 1k欧姆 的电阻 量程0.5uf ~ 50uf con2 = 0; con3 = 0; ledclc = 1; dispchar3(zimu2); disp(temp); } } if(key4 == 0) // b6按下 { delay_ms(10); if(key4 == 0) { while(key4==0); R = 4; con1 = 0; // 100欧姆 的电阻 量程50uf ~ 500uf con2 = 1; con3 = 0; ledclc = 1; dispchar3(zimu2); disp(temp); } } ledlight(R); } void ledlight(unsigned char R) { if(R == 1) { led1 = 1; led2 = 1; led3 = 1; led4 = 0; } if(R == 2) { led1 = 1; led2 = 1; led3 = 0; led4 = 1; } if(R == 3) { led1 = 1; led2 = 0; led3 = 1; led4 = 1; } if(R == 4) { led1 = 0; led2 = 1; led3 = 1; led4 = 1; } } 这是1602.c #include "1602.h" #include "delay.h" void LCD_write_com(unsigned char com) { RS_CLR; RW_CLR; EN_SET; com = pro_data(com); P1 = com; delay_us(300); EN_CLR; } void LCD_write_Data(unsigned char Data) { RS_SET; RW_CLR; EN_SET; Data = pro_data(Data); P1 = Data; delay_us(300); EN_CLR; } void LCD_init(void) { /* LCD_write_com(0x38); // 显示模式设置 delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); delay_ms(5); */ LCD_write_com(0x38); LCD_write_com(0x08); // 显示关闭 LCD_write_com(0x01); // 显示清屏 LCD_write_com(0x06); // 显示光标移动设置 delay_ms(5); LCD_write_com(0x0c); // 显示开及光标设置 } void lcd_pos(unsigned char pos) { LCD_write_com(0x80|pos); } void disp(unsigned char *p) // 第二行显示数据 { unsigned char i; lcd_pos(0x43); for(i=0;i<6;i++) { if(i==4) { LCD_write_Data(0x2e); } LCD_write_Data('0'+(*p)); p++; } } void dispchar1(unsigned char *p) // 第一行显示需要显示的提示字符串 { lcd_pos(0x00); while(*p != ' |