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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2287|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)ADC0832萬用表仿真程序設(shè)計(jì) 可以測(cè)量電壓電阻電流

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
可以隨便使用
請(qǐng)大家多多指教 ADC0832芯片
1、本設(shè)計(jì)基于STC89C51/52(與AT89S51/52、AT89C51/52通用)。
2、支持電壓,電流,電阻測(cè)量,通過數(shù)碼管顯示它們的數(shù)值
3、開關(guān)切換測(cè)量電壓、電流、電阻。通過調(diào)節(jié)滑動(dòng)變阻器來改變它們的大小。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include <reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  2. #include "intrins.h"                                                                                          

  3. #define     u8                          unsigned char
  4. #define     u16                   unsigned int
  5. #define     uchar                          unsigned char
  6. #define     uint                   unsigned int




  7. //按鍵                 
  8. sbit Key_V=P3^0;                                 //電壓模式鍵
  9. sbit Key_R=P1^4;                                 //電阻模式鍵
  10. sbit Key_I=P3^5;                                 //電流模式鍵

  11. sbit Speak=P3^1;                                 //電流模式鍵

  12. #define KEY_V                 1                //電壓模式
  13. #define KEY_R                        2                //電阻模式
  14. #define KEY_I                        3                //電流模式

  15. /***********************************************************************************************************
  16. 數(shù)碼管顯示相關(guān)函數(shù)
  17. ***********************************************************************************************************/



  18. #define   SMG_NUM   4
  19. u8 code DisplayNum[16]={
  20. 0xc0,                //0
  21. 0x8e                //F
  22. };
  23. //
  24. u8 code DisplayOther[]={
  25. 0xff,                 //0                空
  26. 0x7f,                 //1                "."
  27. 0xbf,                        //2                "-"
  28. 0xa7                        //3                c
  29. };

  30. /********************************************************************
  31. * 名稱 : delay_1ms()
  32. * 功能 : 延時(shí)1ms函數(shù)
  33. * 輸入 : q
  34. * 輸出 : 無
  35. ***********************************************************************/
  36. void delay_ms(uint q)
  37. {
  38.         uint i,j;
  39.         for(i=0;i<q;i++)
  40.                 for(j=0;j<110;j++);
  41. }
  42. //數(shù)碼管位選定義
  43. sbit smg_we1 = P2^0;            //數(shù)碼管1
  44. sbit smg_we2 = P2^1;                        //數(shù)碼管2
  45. sbit smg_we3 = P2^2;                        //數(shù)碼管3
  46. sbit smg_we4 = P2^3;                        //數(shù)碼管4


  47. /***********************數(shù)碼位選函數(shù)*****************************/
  48. //i:        0,數(shù)碼管1
  49. //                1,數(shù)碼管2
  50. //                2,數(shù)碼管3
  51. //                3,數(shù)碼管4
  52. void smg_we_switch(uchar i)
  53. {
  54.         switch(i)
  55.         {
  56.                 case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  57.                 case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  58.                 case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  59.                 case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  60.         }        
  61. }


  62. /********************************************************************
  63. * 名稱 : delay_1ms()
  64. * 功能 : 延時(shí)1ms函數(shù)
  65. * 輸入 : q
  66. * 輸出 : 無
  67. ***********************************************************************/
  68. void delay_1ms(uint q)
  69. {
  70.         uint i,j;
  71.         for(i=0;i<q;i++)
  72.                 for(j=0;j<110;j++);
  73. }

  74. /********************************************************************
  75. * 名稱 : u8 ChangeFor(u8 dat)
  76. * 功能 : 交換一個(gè)字節(jié)位的位置,用于數(shù)碼管顯示
  77. * 輸入 : 需要改變的數(shù)
  78. * 輸出 : 改變后的數(shù)
  79. ***********************************************************************/
  80. #define LED_a                0        //數(shù)碼管段選的a段接在段選IO口的第0位
  81. #define LED_b                2
  82. #define LED_c                6
  83. #define LED_d                4
  84. #define LED_e                3
  85. #define LED_f                1
  86. #define LED_g                7
  87. #define LED_dp        5

  88. u8 ChangeFor(u8 dat)
  89. {
  90.         u8 temp=0;
  91.         if(dat&0x01)                //判斷數(shù)據(jù)的第一位是否為1
  92.                 temp|=0x01<<LED_a;//如果為1,放到控制數(shù)碼管a段的位置
  93.         if(dat&0x02)
  94.                 temp|=0x01<<LED_b;
  95.         if(dat&0x04)
  96.                 temp|=0x01<<LED_c;
  97.         if(dat&0x08)
  98.                 temp|=0x01<<LED_d;
  99.         if(dat&0x10)
  100.                 temp|=0x01<<LED_e;
  101.         if(dat&0x20)
  102.                 temp|=0x01<<LED_f;
  103.         if(dat&0x40)
  104.                 temp|=0x01<<LED_g;
  105.         if(dat&0x80)
  106.                 temp|=0x01<<LED_dp;
  107.         return temp;
  108. }
  109. uchar dis_smg[SMG_NUM];                                                //顯示緩存數(shù)組

  110. /********************************************************************
  111. * 名稱 : display()
  112. * 功能 : 數(shù)碼管顯示
  113. * 輸入 : 無
  114. * 輸出 : 無
  115. ***********************************************************************/
  116. void DisplayScan()
  117. {
  118.         static uchar i;
  119.         P0 = 0xff;                  //消隱
  120.                 smg_we_switch(i);                                    //位選
  121.         P0 =        ChangeFor(dis_smg[i]);                  //段選         
  122.         i++;
  123.         if(i>=SMG_NUM)
  124.                 i=0;
  125. }


  126. /***********************************************************************************************************
  127. ADC0832相關(guān)函數(shù)
  128. ***********************************************************************************************************/
  129. sbit ADCS         =P1^2; //ADC0832 片選
  130. sbit ADCLK  =P1^0; //ADC0832 時(shí)鐘
  131. sbit ADDI         =P1^1; //ADC0832 數(shù)據(jù)輸入                /*因?yàn)閱纹瑱C(jī)的管腳是雙向的,且ADC0832的數(shù)據(jù)輸入輸出不同時(shí)進(jìn)行,
  132. sbit ADDO         =P1^1; //ADC0832 數(shù)據(jù)輸出                /*為節(jié)省單片機(jī)引腳,簡(jiǎn)化電路所以輸入輸出連接在同一個(gè)引腳上

  133. //========================================================================
  134. // 函數(shù): unsigned int Adc0832(unsigned char channel)
  135. // 應(yīng)用:                 temp=Adc0832(0);
  136. // 描述: 讀取0通道的AD值
  137. // 參數(shù): channel:通道0和通道1選擇
  138. // 返回: 選取通道的AD值
  139. // 版本: VER1.0
  140. // 日期: 2015-05-29
  141. // 備注:
  142. //========================================================================
  143. unsigned int Adc0832(unsigned char channel)
  144. {
  145.         uchar i=0;
  146.         uchar j;
  147.         uint dat=0;
  148.         uchar ndat=0;
  149.         uchar  Vot=0;

  150.         if(channel==0)channel=2;
  151.         if(channel==1)channel=3;
  152.         ADDI=1;
  153.         _nop_();
  154.         _nop_();
  155.         ADCS=0;//拉低CS端
  156.         _nop_();
  157.         _nop_();
  158.         ADCLK=1;//拉高CLK端
  159.         _nop_();
  160.         _nop_();
  161.         ADCLK=0;//拉低CLK端,形成下降沿1
  162.         _nop_();
  163.         _nop_();
  164.         ADCLK=1;//拉高CLK端
  165.         ADDI=channel&0x1;
  166.         _nop_();
  167.         _nop_();
  168.         ADCLK=0;//拉低CLK端,形成下降沿2
  169.         _nop_();
  170.         _nop_();
  171.         ADCLK=1;//拉高CLK端
  172.         ADDI=(channel>>1)&0x1;
  173.         _nop_();
  174.         _nop_();
  175.         ADCLK=0;//拉低CLK端,形成下降沿3
  176.         ADDI=1;//控制命令結(jié)束
  177.         _nop_();
  178.         _nop_();
  179.         dat=0;
  180.         for(i=0;i<8;i++)
  181.         {
  182.                 dat|=ADDO;//收數(shù)據(jù)
  183.                 ADCLK=1;
  184.                 _nop_();
  185.                 _nop_();
  186.                 ADCLK=0;//形成一次時(shí)鐘脈沖
  187.                 _nop_();
  188.                 _nop_();
  189.                 dat<<=1;
  190.                 if(i==7)dat|=ADDO;
  191.         }
  192.         for(i=0;i<8;i++)
  193.         {
  194.                 j=0;
  195.                 j=j|ADDO;//收數(shù)據(jù)
  196.                 ADCLK=1;
  197.                 _nop_();
  198.                 _nop_();
  199.                 ADCLK=0;//形成一次時(shí)鐘脈沖
  200.                 _nop_();
  201.                 _nop_();
  202.                 j=j<<7;
  203.                 ndat=ndat|j;
  204.                 if(i<7)ndat>>=1;
  205.         }
  206.         ADCS=1;//拉低CS端
  207.         ADCLK=0;//拉低CLK端
  208.         ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
  209.         dat<<=8;
  210.         dat|=ndat;

  211.         return(dat);            //return ad data
  212. }



  213. /***********************************************************************************************************
  214. 主函數(shù)
  215. ***********************************************************************************************************/
  216. void main (void)
  217. {
  218.         u8 Mode;
  219.         uchar Read_AD;        //用于讀取ADC數(shù)據(jù)
  220.         uchar VIN;                        //電壓值變量
  221.         u16 RIN;                                //電阻值變量
  222.         u16 IIN;                                //電流值變量
  223.         u16 i=0;;
  224.         while (1)                                      //主循環(huán)
  225.         {               
  226.                 if(Key_V==0)                                //電壓按鍵按下
  227.                 {
  228.                         Key_V=1;                                        //清除按下標(biāo)記
  229.                         if((Key_R==0)||(Key_I==0))//電阻電流按鍵也有按下
  230.                         {
  231.                                 Key_I=1;
  232.                                 Key_R=1;
  233.                                 Key_V=1;
  234.                                 Mode=4;                                        //標(biāo)記為錯(cuò)誤模式
  235.                         }
  236.                         else                                                        //電阻電流鍵都沒有按下
  237.                         Mode=1;                                                //標(biāo)記為電壓模式
  238.                 }
  239.                 if(Key_R==0)                                //同電壓鍵
  240.                 {
  241.                         Key_R=1;
  242.                         if((Key_V==0)||(Key_I==0))
  243.                         {
  244.                                 Key_I=1;
  245.                                 Key_R=1;
  246.                                 Key_V=1;
  247.                                 Mode=4;
  248.                         }
  249.                         else
  250.                         Mode=2;
  251.                 }
  252.                 if(Key_I==0)                                //同電壓鍵
  253.                 {
  254.                         Key_I=1;
  255.                         if((Key_V==0)||(Key_R==0))
  256.                         {
  257.                                 Key_I=1;
  258.                                 Key_R=1;
  259.                                 Key_V=1;
  260.                                 Mode=4;
  261.                         }
  262.                         else
  263.                         Mode=3;
  264.                 }
  265.                 if((Key_V==1)&&(Key_R==1)&&(Key_I==1))//都沒有按下
  266.                 {
  267.                         Mode=0;                        //標(biāo)記為空閑模式
  268.                 }
  269.                 if(i==0)
  270.                 {
  271.                 Read_AD=Adc0832(0);                                //讀取AD值
  272.                 }
  273.                 i++;
  274.                 if(i>300)
  275.                         i=0;
  276.                         switch(Mode)
  277.                 {
  278.                         case 0:
  279.                                                 //空閑模式
  280.                                                                 dis_smg[0]=DisplayOther[2];//關(guān)閉數(shù)碼管顯示
  281.                                                                 dis_smg[1]=DisplayOther[2];
  282.                                                                 dis_smg[2]=DisplayOther[2];
  283.                                                                 dis_smg[3]=DisplayOther[2];
  284.                         break;
  285.                         case 1:
  286.                                                 //電壓模式
  287.                                                                 VIN=Read_AD*200/255;                                                                                //換算出電壓值
  288.                                                                 dis_smg[0]=DisplayNum[0xa];                                                        //顯示電壓標(biāo)志
  289.                                                                 dis_smg[1]=DisplayNum[VIN/100%10];                        //電壓十位
  290.                                                                 dis_smg[2]=DisplayNum[VIN/10%10]&0x7f;        //電壓個(gè)位
  291.                                                                 dis_smg[3]=DisplayNum[VIN%10];                                        //電壓十分位
  292.                                                                
  293.                                                                 if(VIN > 100)
  294.                                                                         Speak = 0;
  295.                                                                 else
  296.                                                                         Speak = 1;
  297.                         break;
  298.                         case 2:
  299.                                                 //電阻模式               
  300.                                                                 RIN=Read_AD*100/(255-Read_AD);                                //換算出電阻值
  301.                                                                 dis_smg[0]=DisplayNum[0xb];                       //顯示電阻標(biāo)志
  302.                                                                 dis_smg[1]=DisplayNum[RIN/100%10];    //電阻百位
  303.                                                                 dis_smg[2]=DisplayNum[RIN/10%10];     //電阻十位
  304.                                                                 dis_smg[3]=DisplayNum[RIN%10];        //電阻個(gè)位
  305.                                                                 if(RIN>=1000)                                                                                                        //超過或等于1000;
  306.                                                                 {
  307.                                                                         dis_smg[1]=DisplayOther[2];                                        //顯示"-"
  308.                                                                         dis_smg[2]=DisplayOther[2];                                        //顯示"-"
  309.                                                                         dis_smg[3]=DisplayOther[2];                                        //顯示"-"
  310.                                                                 }
  311.                                                                
  312.                                                                 if(RIN > 500)
  313.                                                                         Speak = 0;
  314.                                                                 else
  315.                                                                         Speak = 1;
  316.                         break;
  317.                         case 3:
  318.                                                 //電流模式               
  319.                                                                 IIN=4*Read_AD;//單位mA                                                                //換算出電流值
  320.                                                                 dis_smg[0]=DisplayNum[0xc];           //顯示電流標(biāo)志
  321.                                                                 if(IIN<=200)                                                                                                        //沒有超過范圍
  322.                                                                 {
  323.                                                                         dis_smg[1]=DisplayNum[IIN/100%10];        //電流百位
  324.                                                                         dis_smg[2]=DisplayNum[IIN/10%10];         //電流十位
  325.                                                                         dis_smg[3]=DisplayNum[IIN%10];            //電流個(gè)位
  326.                                                                 }
  327.                                                                 else
  328.                                                                 {
  329.                                                                         dis_smg[1]=DisplayOther[2];                                        //顯示"-"
  330. .....代碼詳見附件.....
復(fù)制代碼

Keil代碼與Proteus7.8與8.13仿真和文檔下載:
基于51單片機(jī)數(shù)字萬用表測(cè)電壓電流電阻仿真設(shè)計(jì).7z (1.02 MB, 下載次數(shù): 81)

評(píng)分

參與人數(shù) 2黑幣 +65 收起 理由
lyxxzrb + 15 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产视频1区 | 天堂中文资源在线 | 91九色视频| 成人性视频免费网站 | 高清欧美性猛交xxxx黑人猛交 | 久久久久久久国产 | 国产三区视频在线观看 | 欧美性网| 中文字幕一区二区三区乱码在线 | 有码在线| 国产精品亚洲一区二区三区在线观看 | 亚洲一区二区视频 | 亚洲女优在线播放 | 波多野结衣一二三区 | 欧美日韩在线免费观看 | 精品一区二区三区在线视频 | 久久久一区二区三区 | 国产97视频在线观看 | 人妖无码 | 日日日操| 久久久久久久久91 | 国产成人精品av | 久久久免费毛片 | 国产日韩精品一区二区 | 国产中文字幕av | 一区二区三区视频 | 国产精品日韩一区二区 | 国产欧美日韩精品一区 | 日韩欧美视频网站 | 黄免费观看视频 | 亚洲视频免费在线观看 | 毛片毛片毛片毛片毛片 | 91国产精品 | 日本久久精品 | 久久久国产一区二区三区 | 色男人的天堂 | 精品麻豆剧传媒av国产九九九 | 一区二区三区四区电影视频在线观看 | 91aiai| 国产亚洲久 | 午夜精品一区二区三区在线观看 |