久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3700|回復: 1
收起左側

雙端輸入萬用表Proteus仿真設計+單片機代碼

[復制鏈接]
ID:299784 發表于 2018-12-16 11:59 | 顯示全部樓層 |閱讀模式
注釋是亂碼,源碼不是,下載看一下
雙端輸入萬用表仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png

單片機源程序如下:
  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)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:606339 發表于 2019-9-2 12:21 | 顯示全部樓層
這個能夠實現電流電壓和電阻的檢測嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品国产免费网站 | 中文字幕一区二区三区精彩视频 | 男女羞羞视频在线 | 亚洲性综合网 | 亚洲欧美视频 | 伊人网伊人| 欧美一区二区视频 | 国产男人的天堂 | 欧美一区二区三区四区视频 | 国产99久久| 中文字幕 国产精品 | 免费视频一区 | 超碰成人免费 | 精品国产1区2区3区 在线国产视频 | 亚洲精品日韩一区二区电影 | 国产欧美一区二区在线观看 | 精品欧美一区二区三区久久久小说 | 欧美一区二区三区大片 | 精品国产91乱码一区二区三区 | 精品国产一区二区三区久久狼黑人 | 久久噜噜噜精品国产亚洲综合 | 欧美一级免费 | 欧美在线看片 | 中文字幕高清视频 | 欧美精品一区二区三区四区五区 | 久久婷婷国产麻豆91 | 国产亚洲一区二区三区 | 亚洲国产成人av好男人在线观看 | 亚洲综合区| 嫩呦国产一区二区三区av | 综合色在线 | 中文字幕一区在线 | 91社区在线观看高清 | 日本精品久久久久久久 | 国产毛片久久久 | 中文字幕一区二区三区四区五区 | 久久精品91久久久久久再现 | 女同av亚洲女人天堂 | 婷婷色网| 中日韩av| 久久精品国产免费看久久精品 |