完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
(1)测量量程为100Ω、1kΩ、10kΩ、10MΩ四档。测量准确度为(±1%)。
(2)3 位数字显示(最大显示数必须为999),能自动显示小数点和 单位,测量速率大于5 次/秒。 (3)100Ω、1kΩ、10kΩ三档量程具有自动量程转换功能。 程序: /************************************ *********STC89C51********** **********12MHz晶振********/ #include "reg51.h" #include #include #define uint8 unsigned char #define uint16 unsigned int #define uchar unsigned char #define uint unsigned int uint16 cnt2ms; //10ms计数器 uint8 cnt1s; //1秒计数器 //电阻-------------------------------- #define Z1 13700053.00 #define Z2 3685279.00 float RZ=0; unsigned long RX=0; unsigned long RX2=0; unsigned long RX3=0; unsigned long RX4=0; unsigned long RX5=0; unsigned long RX6=0; unsigned long RX7=0; unsigned long RX8=0; unsigned long RX9=0; uint8 KL=0; // unsigned int Pulsecnt=0; //脉冲个数 unsigned int Pulsenum; //脉冲个数 uint8 start=0; // uint16 Pulsetime; //10ms计数器 uint16 Pulse; //10ms计数器 bit flag=0; uint8 CH=0; // unsigned long x; void Init_Extint(void); void TimerInitProc(); void Init_System(void); void Display(uint8 chose_dat, uint8 dat); void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s); void DelayMs(uint8 Ms); uint8 Pulse_FLAG=0; uint8 Pulse_5=0; /********************************按键*****************************************/ ***it K2=P1^4; //电阻档 /********************************LCD液晶**************************************/ #define LCD_Data P0 //LCD的数据口 ***it LCD_BF=LCD_Data^7; //LCD忙信号位 ***it LCD_RS=P1^0; ***it LCD_RW=P1^1; ***it LCD_EN=P1^2; #define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位 //输入方式设置 #define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一 #define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一 #define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移 #define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动 //设置显示、光标及闪烁开、关 #define LCD_DISPLAY_ON 0x0C //显示开 #define LCD_DISPLAY_OFF 0x08 //显示关 #define LCD_CURSOR_ON 0x0A //光标显示 #define LCD_CURSOR_OFF 0x08 //光标不显示 #define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁 #define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁 //光标、画面移动,不影响DDRAM #define LCD_LEFT_MOVE 0x18 //LCD显示左移一位 #define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位 #define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位 #define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位 //工作方式设置 #define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示 #define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示 /*定义子程序*/ void LCD_ClrAll(void); //清屏 void Judge_LCD_busy(void); //检测是否忙碌 void LCD_Write(uchar WriteData); //写控制字 void LCD_write_data(uchar LCD_data); //写数据显示 void LCD_cursor(uchar x); //光标起始地址 void LCD_printc(unsigned char lcd_data) ; //输出一个字符 void LCD_prints(unsigned char *lcd_string);//输出字符串 /*LCD1602忙碌判断子程序*/ void Judge_LCD_busy(void) //判断LCD1602是否忙状态 { while(1) { LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_Data=0xff; LCD_EN=1; //EN 是 1—0 使能 if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待。 } LCD_EN=0; } /******LCD清屏***************/ void LCD_ClrAll(void) { Judge_LCD_busy(); //判断是否忙碌 LCD_RS=0; LCD_RW=0; LCD_Data=0x01; LCD_EN=1; LCD_EN=0; } /*******LCD写数据定义各种模式*********/ void LCD_Write(uchar WriteData) //写指令到LCD { Judge_LCD_busy(); LCD_RS=0; LCD_RW=0; P0=WriteData; //把WriteData的数据送到数据口 LCD_EN=1; LCD_EN=0; } /********LCD显示数据***********/ void LCD_write_data(uchar LCD_data) //输出一个字节数据到LCD { Judge_LCD_busy(); LCD_RS=1; LCD_RW=0; P0=LCD_data; LCD_EN=1; LCD_EN=0; } /****光标位置的确定***/ void LCD_cursor(uchar x) //LCD光标定位到x处 { LCD_Write(0x80+x); //第一行地址是0x80 } /*输出一个字符*/ void LCD_printc(unsigned char lcd_data) { LCD_write_data(lcd_data); } /*输出字符串*/ void LCD_prints(unsigned char *lcd_string) { unsigned char i=0; while(lcd_string[i]!=0x00) { LCD_write_data(lcd_string[i]); i++; } } /*初始化程序*/ void LCD_initial(void) //初始化LCD { LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); LCD_Write(LCD_DISPLAY_DOUBLE_LINE); LCD_ClrAll(); } /****延时******/ void delay_1ms(uint x) { uint j; uchar i; for(j=0;j for(i=0;i<120;i++); } } void Key_SM(void){ if(K2==0){ delay_1ms(5); if(K2==0){ LCD_cursor(0x00); LCD_prints(" MEASURE Rx "); //----电阻档------- CH=1;//电阻档 while(K2==0){} } } } void Value_to_ASCII(unsigned long value,uchar add) { unsigned char temp[] = "0000.000K "; temp[0] = value/1000000 + 0x30;//数值改成字符,液晶显示需要ASCII码 value = value%1000000; temp[1] = value/100000 + 0x30; value = value%100000; temp[2] = value/10000 + 0x30; value = value%10000; temp[3] = value/1000 + 0x30; value = value%1000; temp[5] = value/100 + 0x30; value = value%100; temp[6] = value/10 + 0x30; value = value%10; temp[7] = value + 0x30; LCD_cursor(add); //光标起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f LCD_prints(temp); } //--------------------主程序-------------------------------- void main() { TMOD=0x51; //设置定时器0,方式1:16位定时器 TH1=0; TL1=0; TH0=(65536-2000)/256; //设定定时周期 TL0=(65536-2000)%256; TR0=1; TR1=1; ET1=1; ET0=1; EA=1; //----电阻档------- LCD_initial(); delay_1ms(50); LCD_initial(); delay_1ms(50); LCD_cursor(0x00); LCD_prints(" MEASURE Rx "); LCD_cursor(0x45); CH=1; while(1) { Key_SM(); if(flag==1){ flag=0; x=Pulsenum*65536+TH1*256+TL1;//计算1s内的脉冲个数,频率=脉冲个数 if(CH==1){ RZ=(Z1/x);//测量100到1000 RX=RZ-1000; RX=RX>>1; if(RX>=1005){ RX=RX-1005; }else{RX=0;} if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;} if(RX>1000000){RX=1000000; } RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度 RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX; //保存上一次的阻值 Value_to_ASCII(RX2,0x44);//更新阻值显示 } cnt2ms=0; Pulsenum=0; TH1=0; TL1=0; TR1=1; } } } /******************************************************************************* * 函 数 名: Exti0_interrupt * 函数功能: /T0引脚下降沿进入中断 * 入口参数: 无 * 返 回: 无 *******************************************************************************/ void T1_interrupt(void) interrupt 3 using 0 { Pulsenum++; //保存测得脉搏值 } /******************************************************************** 函数功能:定时器/计数器1中断处理 入口参数:null 返 回:null 备 注:null ********************************************************************/ void Timer0IntProc() interrupt 1 using 0 //2ms { TH0=(65536-2000)/256; TL0=(65536-2000)%256; cnt2ms++; if(cnt2ms==497) //1s计时到 { TR1=0; cnt2ms = 0; flag=1; } }
|
|
相关推荐
|
|
右下脚的那个元器件是什么
|
|
|
|
|
|
6077 浏览 3 评论
7343 浏览 1 评论
7585 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
9373 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1273 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 22:02 , Processed in 0.548132 second(s), Total 73, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号