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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8062|回復: 5
打印 上一主題 下一主題
收起左側

基于單片機AT89C52+ADC0832的數(shù)字電壓表仿真設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:442669 發(fā)表于 2018-12-26 18:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于單片機AT89C52的數(shù)字電壓表設計
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


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

  3. #define     uchar                  unsigned char
  4. #define     uint                   unsigned int





  5. #define   SMG_NUM   4
  6. uchar code DisplayNum[16]={
  7. 0xc0,                //0
  8. 0xf9,                //1
  9. 0xa4,                //2
  10. 0xb0,                //3
  11. 0x99,                //4
  12. 0x92,                //5
  13. 0x82,                //6
  14. 0xf8,                //7
  15. 0x80,                //8
  16. 0x90,                //9
  17. 0x88,                //A
  18. 0x83,                //b
  19. 0xc6,                //C
  20. 0xa1,                //d
  21. 0x86,                //E
  22. 0x8e                //F
  23. };
  24. //對應關系取字:        dp g f e    d c b a
  25. //例如  U             1  1 0 0    0 0 0 1
  26. uchar code DisplayOther[]={
  27. 0xff,                 //0                空
  28. 0x7f,                 //1                "."
  29. 0xbf,                        //2                "-"
  30. 0xa7,                        //3                c
  31. 0xC1                        //3                U  1100 0001
  32. };

  33. /***********************************************************************************************************
  34. 數(shù)碼管顯示相關函數(shù)
  35. ***********************************************************************************************************/

  36. //數(shù)碼管位選定義
  37. sbit smg_we1 = P2^0;            //數(shù)碼管1
  38. sbit smg_we2 = P2^1;                        //數(shù)碼管2
  39. sbit smg_we3 = P2^2;                        //數(shù)碼管3
  40. sbit smg_we4 = P2^3;                        //數(shù)碼管4


  41. /***********************數(shù)碼位選函數(shù)*****************************/

  42. void smg_we_switch(uchar i)
  43. {
  44.         smg_we1 = 1;
  45.   smg_we2 = 1;
  46.         smg_we3 = 1;
  47.   smg_we4 = 1;
  48.         switch(i)
  49.         {
  50.                 case 0: smg_we1 = 0;   break;
  51.                 case 1: smg_we2 = 0;   break;
  52.                 case 2: smg_we3 = 0;   break;
  53.                 case 3: smg_we4 = 0;   break;
  54.         }       
  55. }



  56. /********************************************************************
  57. * 名稱 : uchar ChangeFor(uchar dat)
  58. * 功能 : 交換一個字節(jié)位的位置,用于數(shù)碼管顯示
  59. * 輸入 : 需要改變的數(shù)
  60. * 輸出 : 改變后的數(shù)
  61. ***********************************************************************/
  62. #define LED_a                0        //數(shù)碼管段選的a段接在段選IO口的第0位
  63. #define LED_b                2
  64. #define LED_c                6
  65. #define LED_d                4
  66. #define LED_e                3
  67. #define LED_f                1
  68. #define LED_g                7
  69. #define LED_dp        5

  70. uchar ChangeFor(uchar dat)
  71. {
  72.         uchar temp=0;
  73.         if(dat&0x01)                //判斷數(shù)據(jù)的第一位是否為1
  74.                 temp|=0x01<<LED_a;//如果為1,放到控制數(shù)碼管a段的位置
  75.         if(dat&0x02)
  76.                 temp|=0x01<<LED_b;
  77.         if(dat&0x04)
  78.                 temp|=0x01<<LED_c;
  79.         if(dat&0x08)
  80.                 temp|=0x01<<LED_d;
  81.         if(dat&0x10)
  82.                 temp|=0x01<<LED_e;
  83.         if(dat&0x20)
  84.                 temp|=0x01<<LED_f;
  85.         if(dat&0x40)
  86.                 temp|=0x01<<LED_g;
  87.         if(dat&0x80)
  88.                 temp|=0x01<<LED_dp;
  89.         return temp;
  90. }
  91. uchar dis_smg[SMG_NUM];                                                //顯示緩存數(shù)組

  92. /********************************************************************
  93. * 名稱 : display()
  94. * 功能 : 數(shù)碼管顯示
  95. * 輸入 : 無
  96. * 輸出 : 無
  97. ***********************************************************************/
  98. void DisplayScan()
  99. {
  100.         static uchar i;
  101.         P0 = 0xff;                  //消隱
  102.                 smg_we_switch(i);                                    //位選
  103.         P0 =        ChangeFor(dis_smg[i]);                  //段選          
  104.         i++;
  105.         if(i>=SMG_NUM)
  106.                 i=0;
  107. }
  108. /***********************************************************************************************************
  109. ADC0832相關函數(shù)
  110. ***********************************************************************************************************/
  111. sbit AD0832_CS   = P1^2 ;   //片選信號
  112. sbit AD0832_CLK  = P1^0;    //時鐘接口
  113. sbit AD0832_DI   = P1^1;    //數(shù)據(jù)接口  /*因為單片機的管腳是雙向的,且ADC0832的數(shù)據(jù)輸入輸出不同時進行,為節(jié)省單片機引腳,簡化電路所以輸入輸出連接在同一個引腳上*/
  114. uchar GetAD0832(bit Channel)
  115. {     
  116.         uchar  i=0 , Data1 =0 , Data2 = 0 ;     
  117.         AD0832_CLK = 0 ;        //時鐘置低平//時鐘12Mhz, 整個轉換時間為224us  
  118.         //使用芯片準備(參考PDF時序圖)      
  119.         AD0832_DI  = 1 ;        //開始信號為高電平     
  120.         AD0832_CS  = 0 ;        //片選信號置低,啟動AD轉換芯片            
  121.         AD0832_CLK = 1 ;        //輸入開始信號(構成一個正脈沖),時鐘上升沿,輸入開始信號     
  122.         AD0832_CLK = 0 ;        //時鐘下降沿   
  123.         //模擬信號輸入模式選擇(1:單模信號,0:雙模差分信號)   
  124.         AD0832_DI  = 1 ;     
  125.         AD0832_CLK = 1 ;        //時鐘上升沿,輸入開始信號     
  126.         AD0832_CLK = 0 ;        //時鐘下降沿     
  127.         //模擬信號輸入通道選擇(1:通道CH1,0:通道CH0)   
  128.         AD0832_DI  = Channel ;  //選擇通道0     
  129.         AD0832_CLK = 1;         //時鐘上升沿,輸入開始信號
  130.         AD0832_CLK = 0;         //時鐘下降沿         
  131.         AD0832_DI  = 1;                      //數(shù)據(jù)線置高,準備接收數(shù)據(jù)  
  132.         for(i=0;i<8;i++)                          //從高位移入數(shù)據(jù)   
  133.         {      
  134.                 AD0832_CLK = 1 ;              
  135.                 AD0832_CLK = 0 ;      //時鐘下降沿,AD0832輸出數(shù)據(jù),高位(MSB)先         
  136.                 Data1 = Data1<<1;     //數(shù)據(jù)左移位,補0     
  137.                 if(AD0832_DI ==1)      
  138.                 {
  139.                         Data1 = Data1 | 0x01;
  140.                 }                                                    //如果數(shù)據(jù)為“1”,移入1,   
  141.         }                              //如果數(shù)據(jù)為“0”,移入0,        
  142.         for(i=0;i<8;i++)                     //從低位移入數(shù)據(jù)  
  143.         {      
  144.                 Data2 = Data2>>1;   //數(shù)據(jù)左移位,補0     
  145.                 if(AD0832_DI ==1)        
  146.                 {
  147.                         Data2 = Data2 | 0x80;
  148.                 }   //如果數(shù)據(jù)為“1”,移入1如果數(shù)據(jù)為“0”,移入0,         
  149.                 AD0832_CLK = 1;            
  150.                 AD0832_CLK = 0;          //時鐘下降沿,AD0832輸出數(shù)據(jù),高位(MSB)先  
  151.         }     
  152.         //數(shù)據(jù)線置高,釋放總線,完成一次轉換     
  153.         AD0832_CLK = 1 ;            
  154.         AD0832_DI  = 1;              
  155.         AD0832_CS  = 1;                     
  156.         if(Data1==Data2)     //輸出   
  157.         {
  158.                 return Data2;
  159.         }  
  160.         return 0;
  161. }


  162. /***********************************************************************************************************
  163. 主函數(shù)
  164. ***********************************************************************************************************/
  165. void main (void)
  166. {
  167.         uchar Read_AD;        //用于讀取ADC數(shù)據(jù)
  168.         uint VIN;                        //電壓值變量
  169.         while (1)                                      //主循環(huán)
  170.         {               
  171.                 Read_AD=GetAD0832(0);                                //讀取AD值
  172.                 //電壓模式
  173.                 VIN=Read_AD*7.84;                                                                                //換算出電壓值
  174.                 dis_smg[0]=DisplayNum[VIN/1000%10];                        //顯示電壓標志
  175.                 dis_smg[1]=DisplayNum[VIN/100%10]&0x7f;                        //電壓十位
  176.                 dis_smg[2]=DisplayNum[VIN/10%10];        //電壓個位
  177.                 dis_smg[3]=DisplayNum[VIN%10];                                        //電壓十分位
  178.                 DisplayScan();                //數(shù)碼管動態(tài)掃描
  179.         }
  180. }
復制代碼

所有資料51hei提供下載:
數(shù)字電壓表設計.zip (24.34 KB, 下載次數(shù): 122)


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

使用道具 舉報

沙發(fā)
ID:407566 發(fā)表于 2019-1-4 23:31 | 只看該作者
  VIN=Read_AD*7.84;   為什么是乘以7.84?
回復

使用道具 舉報

板凳
ID:570252 發(fā)表于 2019-6-23 20:32 | 只看該作者
如果我想對電壓進行非線性補償,請問有辦法嗎?
回復

使用道具 舉報

地板
ID:576039 發(fā)表于 2019-7-2 00:17 | 只看該作者
ok,收藏了
回復

使用道具 舉報

5#
ID:56665 發(fā)表于 2019-7-2 08:44 | 只看該作者
過過過兒 發(fā)表于 2019-1-4 23:31
VIN=Read_AD*7.84;   為什么是乘以7.84?

沒有人回復,我認為這個值是輸入電壓的比值,輸入電壓一般不會直接到IO端口,要通過電阻分壓后才進入單片機IO端口,這樣可以擴大測量的量程,如果沒有分壓VIN = Read_AD*5/256
回復

使用道具 舉報

6#
ID:704637 發(fā)表于 2020-4-11 10:23 | 只看該作者
最近也在研究如何應用ADC0832,謝謝樓主的分享啦
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲日日操 | 好姑娘高清在线观看电影 | 国产精品中文字幕一区二区三区 | 古典武侠第一页久久777 | 日韩午夜一区二区三区 | 成人免费视频网站在线看 | 亚洲最色网站 | 欧美在线不卡 | 精品一区二区三 | 日本一区二区三区四区 | 亚洲精品日日夜夜 | 久久久久久综合 | 亚洲欧美视频一区 | 久久国产婷婷国产香蕉 | 亚洲 自拍 另类 欧美 丝袜 | 久久久久亚洲精品 | 欧美一区成人 | 国产精品影视在线观看 | 日本精品视频一区二区 | 在线欧美亚洲 | 欧美色性 | 亚洲精品在线看 | 国产三区在线观看视频 | 色性av | 成人免费视频观看视频 | 国产欧美精品一区二区三区 | 最新免费视频 | 老头搡老女人毛片视频在线看 | 羞羞免费网站 | 少妇一区二区三区 | 自拍偷拍亚洲欧美 | 九九热热九九 | 国产成人免费网站 | 在线看亚洲 | 九九久久在线看 | 成人免费视频网站 | 九九热在线免费观看 | 免费视频一区二区三区在线观看 | 久久激情网 | 日日人人| 日日操av |