找回密码
 立即注册

QQ登录

只需一步,快速开始

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

双端输入万用表Proteus仿真设计+单片机代码

[复制链接]
跳转到指定楼层
楼主
注释是乱码,源码不是,下载看一下
双端输入万用表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>  
  2. #include <stdlib.h>  
  3. #include <intrins.h>  
  4. #include <stdio.h>  

  5. typedef unsigned int u16;          //对数据类型进行声明定义
  6. typedef unsigned char u8;
  7. unsigned char receiveData[8];

  8. #define uchar unsigned char  
  9. #define uint  unsigned int
  10.         
  11. unsigned char dav[15]="v=0 . 000 V   ";        
  12. unsigned char dat[16];
  13. unsigned char dad[15]="I=00. 000 mA  ";
  14. unsigned char dab[10]="R=    000 ";//0.1
  15. unsigned char daz[2]="Ω";
  16. //unsigned char daw[7]="万用表";
  17. unsigned char d[4]="1. ";
  18. //unsigned char f[8]="00000";

  19. unsigned long  tmp;
  20. float sum1,sum2,sum;

  21. sbit CS  = P2^7;//第4根线  RS  
  22. sbit SID = P2^6;//第5根线  RW  
  23. sbit SCK = P2^5;//第6根线  E  

  24. // adc0809模块接线
  25. sbit STR=P3^0; //单片机P1.0接模块STR引脚, 启动转换信号
  26. sbit EOC=P3^1; //单片机P1.1接模块EOC, 转换结束信号,高电平有效
  27. sbit OE=P3^6; //单片机P1.2接模块OE,输出允许信号,高电平有效
  28. sbit CLK=P3^7;//单片机P1.3接CLK ,ADC0809时钟,输入50-800KHZ的频率一般选用500K


  29. sbit ADDA=P2^4;
  30. sbit ADDB=P2^3;
  31. sbit ADDC=P2^2; //单片机通道地址选择,选in0--in7一  b        个



  32. sbit KEY1=P0^1;//电阻
  33. sbit KEY2=P0^2;//电压5
  34. sbit KEY3=P0^3;//电压12         
  35. sbit KEY4=P0^4;//电流

  36. uchar ad_data,adc,s,dianliu;


  37. uchar code AC_TABLE[]={  
  38. 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,    //第一行汉字位置   
  39. 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,    //第二行汉字位置   
  40. 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,    //第三行汉字位置   
  41. 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,    //第四行汉字位置   
  42. };  
  43. /********************************
  44. 名称:SendByte  
  45. 功能:串口发送一个字节
  46. *********************************/  
  47. void SendByte(uchar Dbyte)  
  48. {  
  49.      uchar i;  
  50.      for(i=0;i<8;i++)  
  51.      {  
  52.            SCK = 0;  
  53.            Dbyte=Dbyte<<1;      
  54.            SID = CY;            
  55.            SCK = 1;  
  56.            SCK = 0;  
  57.      }  
  58. }

  59.    
  60. /**********接收一个字节****/  
  61. uchar ReceiveByte(void)  
  62. {  
  63.      uchar i,temp1,temp2;  
  64.      temp1 = 0;  
  65.      temp2 = 0;  
  66.      for(i=0;i<8;i++)  
  67.      {  
  68.            temp1=temp1<<1;  
  69.            SCK = 0;  
  70.            SCK = 1;              
  71.            SCK = 0;  
  72.            if(SID) temp1++;  
  73.      }  
  74.      for(i=0;i<8;i++)  
  75.      {  
  76.            temp2=temp2<<1;  
  77.            SCK = 0;  
  78.            SCK = 1;  
  79.            SCK = 0;  
  80.            if(SID) temp2++;  
  81.      }  
  82.      return ((0xf0&temp1)+(0x0f&temp2));  
  83. }  
  84.    
  85. void CheckBusy( void )  
  86. {  
  87.      do   SendByte(0xfc);        
  88.      while(0x80&ReceiveByte());      
  89. }  
  90.    
  91. void WriteCommand(uchar Cbyte )  
  92. {  
  93.      CS = 1;  
  94.      CheckBusy();  
  95.      SendByte(0xf8);              
  96.      SendByte(0xf0&Cbyte);      
  97.      SendByte(0xf0&Cbyte<<4);  
  98.      CS = 0;  
  99. }  
  100.    
  101. void WriteData(uchar Dbyte )  
  102. {  
  103.      CS = 1;  
  104.      CheckBusy();  
  105.      SendByte(0xfa);              
  106.      SendByte(0xf0&Dbyte);        
  107.      SendByte(0xf0&Dbyte<<4);  
  108.      CS = 0;  
  109. }  
  110.    
  111. uchar ReadData( void )  
  112. {  
  113.      CheckBusy();  
  114.      SendByte(0xfe);              
  115.      return ReceiveByte();  
  116. }  
  117.    
  118. void Delay(uint MS)  
  119. {  
  120.      uchar us,usn;  
  121.      while(MS!=0)            
  122.       {   
  123.          usn = 2;  
  124.          while(usn!=0)  
  125.           {  
  126.             us = 0xf5;  
  127.             while (us!=0)  
  128.              {  
  129.                us--;  
  130.              };  
  131.             usn--;  
  132.            }  
  133.          MS--;  
  134.       }  
  135. }  
  136.    
  137.    
  138.    
  139. void LcmInit( void )  
  140. {  
  141.      WriteCommand(0x30);        
  142.      WriteCommand(0x03);        
  143.      WriteCommand(0x0C);        
  144.      WriteCommand(0x01);        
  145.      WriteCommand(0x06);        
  146. }  
  147.    
  148. void LcmClearTXT( void )  
  149. {  
  150.      uchar i;  
  151.      WriteCommand(0x30);      
  152.      WriteCommand(0x80);        
  153.      for(i=0;i<64;i++)  
  154.      WriteData(0x20);  
  155. }     
  156. void write_str(uchar row,uchar col,uchar *puts)  
  157. {  
  158.      WriteCommand(0x30);      
  159.      WriteCommand(AC_TABLE[8*row+col]);     
  160.      while(*puts != '\0')        
  161.      {  
  162.            if(col==8)            
  163.            {              
  164.                  col='0';  
  165.                  row++;  
  166.            }  
  167.            if(row==4) row='0';      
  168.            WriteCommand(AC_TABLE[8*row+col]);  
  169.            WriteData(*puts);        
  170.            puts++;  
  171.            WriteData(*puts);  
  172.            puts++;  
  173.            col++;  
  174.      }  
  175. }  
  176.    
  177.    
  178. void DisplayDots(uchar DotByte)  
  179. {  
  180.      uchar i,j;  
  181.      WriteCommand(0x34);      
  182.      WriteCommand(0x36);      
  183.      for(i=0;i<32;i++)            
  184.      {  
  185.            WriteCommand(0x80|i);      
  186.            WriteCommand(0x80);      
  187.            for(j=0;j<32;j++)      
  188.            {              
  189.               WriteData(DotByte);                    
  190.            }  
  191.            DotByte=~DotByte;  
  192.      }  
  193. }  

  194. unsigned long int pow(uchar a,uchar b)
  195. {
  196.         unsigned long int result=1;//  初始化为 1
  197.                 for(;b>0;b--)
  198.         {
  199.                 result*=a;
  200.         }
  201. return result;
  202. }

  203. void write_num(uchar x,uchar y,unsigned long int num)
  204. {
  205.         uchar i=10;
  206.         switch (x)
  207.         {
  208.                 case 0: WriteCommand(0x80+y);break;
  209.                 case 1: WriteCommand(0x90+y);break;
  210.                 case 2: WriteCommand(0x88+y);break;
  211.                 case 3: WriteCommand(0x98+y);break;
  212.                 default: ;
  213.         }
  214.         while(i>=1)
  215.         {
  216.                 if((uchar)(num/pow(10,i-1))!=0)
  217.                 break;
  218.                 i--;
  219.         }
  220.         while(i)
  221.         {
  222.                 WriteData(num/(unsigned long int)(pow(10,i-1))+'0');
  223.                 num=num%(unsigned long int)(pow(10,i-1));
  224.                 i--;
  225.         }   
  226. }
  227. /********************************
  228. 名称:delayms  
  229. 功能:延时函数
  230. *********************************/   
  231. void delayms(uint z)
  232. {
  233.   uint x,y;
  234.   for(x=z;x>0;x--)
  235.     for(y=110;y>0;y--);
  236. }

  237. void delayus(uint w)
  238. {
  239.   uint x,y;
  240.   for(x=w;x>0;x--)
  241.     for(y=10;y>0;y--);
  242. }

  243. /*void T0init()
  244. {

  245.    
  246. }
  247. */

  248. void AD()
  249. {
  250.   STR = 0;
  251.         OE  = 0;    //ad初始化
  252.         
  253.         STR = 1;
  254.         STR = 0;          //启动ad转?
  255.         //ALE=1;
  256.         while(!EOC);
  257.         OE=1;
  258.         ad_data=P1;
  259.         delayms(20);
  260.         OE = 0;

  261. }



  262. void ADC_change()
  263. {
  264.         double v;
  265.         uchar val_integer;
  266.         uint val_decimal;
  267.         v=ad_data*0.0196078;
  268.         val_integer=(uchar)v;
  269.         val_decimal=(uint)((v-val_integer)*1000);
  270.   ad_data=val_decimal;
  271. }

  272. void Lcd_Write(unsigned char *dat)//*********************<LCD写数组>
  273. {
  274.         do{
  275.                 CS = 1;
  276.                 SID = 0;
  277.                 SCK = 0;
  278.                 s= *dat;
  279.                 delayms(5);
  280.                 SCK = 1;
  281.                 delayms(5);
  282.                 SCK = 0;
  283.         }while(*(dat++) != '\0');
  284. }

  285. void main( void )         
  286. {   
  287.                  LcmInit();             //液晶初始化
  288.      LcmClearTXT();          //清屏        
  289.                  TMOD = 0x02; //设置定时器T0工作方式
  290.             TH0 = 254;  //
  291.            TL0 = 254;  //
  292.      EA = 1;      //中断总开关打开
  293.            ET0 =1;    //  定时器分开关打开
  294.            TR0 =1;      //启动定时器
  295.            //T0init();
  296.                  ADDA = 1;
  297.            ADDB = 0;
  298.            ADDC = 0;
  299.                  Lcd_Write(dat);
  300.                 // write_str(3,0,dav);
  301.                 // write_str(0,0,dav);
  302.                 // write_str(3,2,d);
  303.                  //write_str(2,0,dad);
  304.                 // write_str(1,0,dab);
  305.                 // write_str(1,5,daz);
  306.                 // write_str(0,2,daw);
  307.      while(1)  
  308.      {  
  309.            
  310.                             AD();
  311.                                  adc=ad_data;
  312.                          delayms(10);
  313.                          write_num(1,3,521);
  314.                          write_num(2,3,adc);
  315.                         
  316.                         
  317.                                  /*tmp=adc*196.3125*5;
  318.                                  dat[0]=tmp/10000;
  319.                                  dat[2]=tmp/1000%10;
  320.                                  dat[3]=tmp/100%10        ;
  321.                                  dat[4]=tmp/10%10        ;
  322.                                 
  323.                                         //电压
  324.                            sum2=(dat[2]*10+dat[3]);//电压小数
  325.                                         // sprintf((char*)s,"%f",sum2);
  326.                                  
  327.                                 //电阻
  328.                                          sum1=(dat[0]+dat[2]*0.1+dat[3]*0.01+dat[4]*0.01);
  329.                                          sum=120*sum1/(5-sum1);
  330.                                  
  331.                                  //电流
  332.                                          
  333.                                  dianliu=sum1*10;
  334.                
  335.                                         //电阻
  336. //#include <REGX51.H>
  337.                                                                                 
  338.                if(KEY1==1)
  339.                                          {                        write_str(1,3,d);               
  340.                                                            //if(dat[0]<5){
  341.                                                          write_num(1,3,sum);
  342.                                                                         //        }
  343.                                                 }
  344.                                                 if(KEY1==0){
  345.                         write_str(1,3,d);
  346.                                                                                                 }               


  347.                                                                                                 
  348.                                      ///电压
  349.                                      if(KEY2==0){        

  350. ……………………

  351. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
万用表.rar (97.73 KB, 下载次数: 18)
万用表2.doc (87 KB, 下载次数: 9)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:606339 发表于 2019-9-2 12:21 | 只看该作者
这个能够实现电流电压和电阻的检测吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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