找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6366|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机做的万用表仿真 功能很全面

[复制链接]
跳转到指定楼层
楼主
51单片机万用表仿真原理图:


万用表直流电压测量程序:
  1. #include<reg52.h>
  2. #include"Delay.h"
  3. #include<KEY_FUNCTION_DEFINE.H>
  4. #include<measure_define.h>
  5. #include"AD.h"
  6. #include"LCD.h"
  7. extern uchar disp_value[5];
  8. extern uchar key_number;
  9. uchar code DC_disp[]="DC VOL Measure ";
  10. uchar code DC_disp2[]="value=        ";
  11. uchar code DC_disp3[]="1          ";
  12. sbit Buzz=P3^7;
  13. void DC_VOL_measure(void)                        //直流电压测量函数
  14. {   uchar  ADTemp,num;
  15.         float ValueTemp;
  16.         WriteCom(0x01);        
  17.            WriteCom(0x80);                                                                 //显示
  18. for(num=0;DC_disp[num]!='\0';num++)
  19.                 {
  20.                 WriteData(DC_disp[num]);                        
  21.                 Delay(10);        
  22.                 }               
  23.                 WriteCom(0x80+0x40);                                                                 //显示
  24. for(num=0;DC_disp2[num]!='\0';num++)
  25.                 {
  26.                         WriteData(DC_disp2[num]);                        
  27.                         Delay(10);        
  28.                 }
  29.         do{                                                                                                             //高电压选择端,20V~200V电压选择测量
  30.                                              s1=0;
  31.                                             s2=0;
  32.                                             s3=1;
  33.                                                 Delay(10);
  34.                         ADTemp=ADSample(DC_VOL_adder);                        //直流电压的采样
  35.                         if(ADTemp>253)
  36.                         {        Buzz=0;
  37.                             WriteCom(0x80+0x46);                                                                                //显示
  38.                                 for(num=0;DC_disp3[num]!='\0';num++)
  39.                                         {WriteData(DC_disp3[num]);
  40.                                                          Delay(10);
  41.                     }
  42.                         
  43.                           }         
  44.                  else
  45.                                         {   
  46.                                           ValueTemp=ValueConver(ADTemp);                         //采样值转换为对应的电压值
  47.                                     ValueTemp=ValueTemp*100;                                                 //电压值乘以对应的比例值
  48.                                                 FloatToChar(ValueTemp);                                                         //电压值转换为字符型
  49.                         
  50.                                            WriteCom(0x80+0x46);                                                                 //显示
  51.                                                 for(num=0;num<5;num++)
  52.                                                 {
  53.                                                         WriteData(disp_value[num]);                        
  54.                                                         Delay(10);        
  55.                                                 }
  56.                                           WriteData('V');
  57.                                           WriteData(' ');               
  58.                                         }
  59.                         }  while((ADTemp>25)&&(key_number==1));
  60.                

  61.                  do                                                                                                                                                        //中端电压选择端,4V~40V电压选择端
  62.                 {                                                                                 
  63.                                                     s1=0;
  64.                                                     s2=1;
  65.                                                     s3=0;
  66.                                                         Delay(50);                                                
  67.                                         ADTemp=ADSample(DC_VOL_adder);                                 //直流电压的采样
  68.                                         ValueTemp=ValueConver(ADTemp);                                 //采样值转换为对应的电压值
  69.                                         ValueTemp=ValueTemp*10;                                                                  //电压值乘以对应的比例值
  70.                                         FloatToChar(ValueTemp);                                                                 //电压值转换为字符型
  71.                                 
  72.                                         WriteCom(0x80+0x46);                                                                                //显示
  73.                                         for(num=0;num<5;num++)
  74.                                         {
  75.                                                 WriteData(disp_value[num]);
  76.                                                          Delay(10);
  77.                                         }
  78.                                         WriteData('V');
  79.                                         WriteData(' ');                        
  80.         } while((ADTemp>25)&&(ADTemp<253)&&(key_number==1));        

  81.                   
  82.                   do                                                                                                                                         //小端电压选择端,0~4V电压选择端
  83.            {
  84.                                                             s1=1;
  85.                                                             s2=0;
  86.                                                             s3=0;
  87.                                                                 Delay(10);
  88.                                                 ADTemp=ADSample(DC_VOL_adder);                                //直流电压的采样
  89.                                                 ValueTemp=ValueConver(ADTemp);                                 //采样值转换为对应的电压值
  90.                                        
  91.                                                 FloatToChar(ValueTemp);                                                                //电压值转换为字符型
  92.                                 
  93.                                            WriteCom(0x80+0x46);                                                                   //显示
  94.                                                 for(num=0;num<5;num++)
  95.                                                 {
  96.                                                         WriteData(disp_value[num]);
  97.                                                         Delay(10);        
  98.                                                 }
  99.                                                 WriteData('V');        
  100.                                                 WriteData(' ');
  101.         } while((ADTemp<253)&&(key_number==1));

  102. }
复制代码


  1. #include<reg52.h>
  2. #include"Delay.h"
  3. #include<KEY_FUNCTION_DEFINE.H>
  4. #include<measure_define.h>
  5. #include"AD.h"
  6. #include"LCD.h"
  7. extern uchar disp_value[5];
  8. extern uchar key_number;
  9. extern uchar code  DC_disp3[];
  10. uchar code RES_disp[]="RES Measure    ";
  11. uchar code RES_disp2[]="value=        ";        
  12.         
  13. void Res_measure(void)
  14. {
  15.                 uchar  ADTemp,num;
  16.                 float ValueTemp;
  17.                 WriteCom(0x01);         //清屏
  18.         WriteCom(0x80);                                                                 //显示
  19.                 for(num=0;RES_disp[num]!='\0';num++)
  20.                 {
  21.                         WriteData(RES_disp[num]);                        
  22.                         Delay(10);        
  23.                 }
  24.                 WriteCom(0x80+0x40);                                                                 //显示
  25.                 for(num=0;RES_disp2[num]!='\0';num++)
  26.                 {
  27.                         WriteData(RES_disp2[num]);                        
  28.                         Delay(10);        
  29.                 }                                

  30.         do{                                                                     //先选通20K通道
  31.                              s1=0;
  32.                             s2=0;
  33.                             s3=1;
  34.                                 Delay(50);
  35.                 ADTemp=ADSample(Res_adder);                                     //读采样值
  36.             if(ADTemp>253)
  37.                         {         WriteCom(0x80+0x46);                                //显示
  38.         for(num=0;DC_disp3[num]!='\0';num++)
  39.                                         {
  40.                                                 WriteData(DC_disp3[num]);
  41.                                                          Delay(50);
  42.                                         }
  43.                 }
  44.                 else        
  45.                 {
  46.                                 ValueTemp=ValueConver(ADTemp);                 //采样值0~255转换为电压值0~2v
  47.                                 ValueTemp=ValueTemp/2        ;                         //电压转换为电阻值
  48.                                 ValueTemp=ValueTemp*20000;                         //电阻值乘以对应的档位
  49.                                 FloatToChar(ValueTemp);                                 //浮点电压值转换为字符型数字
  50.                            WriteCom(0x80+0x46);                                      //显示的地址
  51.                                 for(num=0;num<5;num++)
  52.                                 {
  53.                                         WriteData(disp_value[num]);                //显示数值
  54.                                         Delay(10);        
  55.                                 }        
  56.                                 WriteData('R');
  57.                                 WriteData(' ');                                                                                       
  58.                         
  59.                 }

  60.         }  while((ADTemp>25)&&(key_number==4));                //采样电压值大于0.2V

  61.         do{                                                                                  //选通2K通道
  62.                                     s1=0;
  63.                                     s2=1;
  64.                                     s3=0;
  65.                                         Delay(50);                                                  //读采样值
  66.                         ADTemp=ADSample(Res_adder);
  67.                         ValueTemp=ValueConver(ADTemp);                         //采样值0~255转换为电压值0~2v
  68.                         ValueTemp=ValueTemp/2;                                        //电压转换为电阻值
  69.                         ValueTemp=ValueTemp*2000;                        //电阻值乘以对应的档位
  70.                
  71.                         FloatToChar(ValueTemp);
  72.                    WriteCom(0x80+0x46);               
  73.         for(num=0;num<5;num++)
  74.                         {
  75.                                 WriteData(disp_value[num]);
  76.                                 Delay(10);        
  77.                         }
  78.                                 WriteData('R');
  79.                                 WriteData(' ');        
  80. }  while((ADTemp>25)&&(ADTemp<254)&&(key_number==4));//采样电压值大于0.2v小于2v

  81.            do{
  82.                                     s1=1;                                                         //选通200欧通道
  83.                                     s2=0;
  84.                                     s3=0;
  85.                                         Delay(50);
  86.                         ADTemp=ADSample(Res_adder);                        //AD采样
  87.                         ValueTemp=ValueConver(ADTemp);                    //将0~255的数值转换为0~2V的电压值
  88.                         ValueTemp=ValueTemp/2;                                        //电压转换为电阻值
  89.                         ValueTemp=ValueTemp*200;                                //电阻乘以相对应的档位值
  90.                         
  91.                         FloatToChar(ValueTemp);                                        //电阻值转换为字符型
  92.                          WriteCom(0x80+0x46);                                        //显示电阻值
  93.         for(num=0;num<5;num++)
  94.         {
  95.                 WriteData(disp_value[num]);
  96.                 Delay(10);
  97.                         
  98.         }
  99.                 WriteData('R');
  100.                 WriteData(' ');                        
  101. }  while((ADTemp<253)&&(key_number==4));                //采样电压值小于2v     

  102. }
复制代码
显示程序:
  1. #include<reg52.h>
  2. #include"LCD.h"

  3. #define  datasend  P0                                                //P0口数据送LCD1602
  4.          

  5. sbit LcdRs=P2^0;                                           //1602数据、命令控制端
  6. sbit LcdEn=P2^1;                                                           //1602使能端

  7. uchar  mytable0[]=" my design" ;
  8. uchar  mytable1[]="wan yong biao";
  9. uchar code line0[]="welcome you";
  10. uchar code line1[]="Value=     V";

  11. unsigned char disp_value[5]={'0','0','0','0','0'};
  12. //写命令
  13. void WriteCom(unsigned char Com)
  14. {
  15.           LcdRs=0;                     //低电平选择为写指令        
  16.           datasend=Com;             //把指令写入P0口
  17.           Delay(5);                     //参考时序图
  18.           LcdEn=1;                         //开使能
  19.           Delay(5);                         //读取指令
  20.           LcdEn=0;                         //关闭使能        
  21. }
  22. //写数据
  23. void WriteData(unsigned char Data)
  24. {
  25.            LcdRs=1;                      //高电平选择为写数据
  26.            datasend=Data;          //把数据写入P0口
  27.            Delay(5);                  //参考时序图
  28.            LcdEn=1;                          //开使能
  29.            Delay(5);                  //读取指令
  30.            LcdEn=0;                          //关闭使能
  31. }
  32. //初始化
  33. void LcdInit(void)
  34. {              uchar num;
  35.             LcdEn=0;
  36.             WriteCom(0x38);            //设置16x2显示,5x7点阵显示,8位数据接口
  37.             WriteCom(0x0c);            //00001DCB,D(开关显示),C(是否显示光标),B(光标闪烁,光标不显示)
  38.             WriteCom(0x06);            //000001N0,N(地址指针+-1)
  39.             WriteCom(0x01);            //清屏指令  每次显示下一屏内容时,必须清屏
  40.                 WriteCom(0x80+0x01);  //第一行,顶格显示         
  41.         for(num=0;num<10;num++)
  42.             {
  43.                     WriteData(mytable0[num]);
  44.                           Delay(10);
  45.                 }
  46.         WriteCom(0x80+0x40);           //第二行,从第一格开始显示
  47.         
  48.         for(num=0;num<13;num++)
  49.              {
  50.                           WriteData(mytable1[num]);
  51.                     Delay(10);
  52.                  }
  53.                     Delay(1000);
  54.                  
  55.                           WriteCom(0x01);          //清屏指令  每次显示下一屏内容时,必须清屏
  56.                         
  57.                           WriteCom(0x80);
  58.         for(num=0;num<8;num++)
  59.                  {
  60.                           WriteData(line0[num]);
  61.                           Delay(10);
  62.                  }
  63.         
  64.                     WriteCom(0x80+0x40);
  65.         for(num=0;num<12;num++)
  66.                   {
  67.                           WriteData(line1[num]);
  68.                           Delay(10);
  69.                   }


  70. }

  71. //将浮点数据转换为字符型数组
  72. void FloatToChar(float Data)
  73. {
  74.                 uchar Temp1[5];
  75.                 uchar Temp2[3];
  76.         
  77.                 unsigned int IntData,Temp;
  78.                 float FloatData;
  79.                 unsigned char i=0,j=0,k=0;
  80.                 IntData=(unsigned int)Data;
  81.                 FloatData=Data-IntData;
  82.         //整数部分
  83. if(IntData==0)
  84.         {
  85.                 Temp1[i]=0;
  86.                 i++;        
  87.         }
  88. while(IntData)
  89.         {
  90.                 Temp1[i]=IntData%10;
  91.                 i++;
  92.                 IntData=IntData/10;

  93.         }
  94.   //小数部分
  95. while((FloatData>0.001)&&(j<3))
  96.         {
  97.                 FloatData=FloatData*10;
  98.                 Temp=(int)FloatData;
  99.                 Temp2[j]=Temp;
  100.                 j++;
  101.                 FloatData=FloatData-Temp;

  102.         }
  103. while(i>0)
  104.         {
  105.                 disp_value[k]=Temp1[i-1]+'0';
  106.                 i--;
  107.                 k++;
  108.         }
  109.                 disp_value[k]='.';
  110.                 i=0;
  111.                 k++;
  112. while(i<j)
  113.         {
  114.                 disp_value[k]=Temp2[i]+'0';
  115.                 i++;
  116.                 k++;
  117.                                 
  118.         }

  119. }

复制代码




下载:
http://www.51hei.com/bbs/dpj-80194-1.html

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表