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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機學習:利用ADC0804模數轉換器采集電壓

[復制鏈接]
跳轉到指定樓層
樓主
ID:161768 發表于 2017-2-9 22:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
電位器調節待檢測電壓值,在數碼管上顯示出來,
代碼大多從書上搬過來的,書上例5.3.1要求前3個數碼管顯示AD轉換后的8位數字量(即0~255)
我這里讓前4個數碼管顯示具體電壓值,比如1.352
  1.     #include <reg52.h>  
  2.     #include "MY51.H"  
  3.       
  4.     void initSMG()      //數碼管初始化信息  
  5.     {  
  6.         //上電時,都為高電平  
  7.         P0=0xff;  
  8.         wela=open;  
  9.         P0=0xff;  
  10.         wela=lock;  
  11.       
  12.         P0=0;  
  13.         dula=open;  
  14.         P0=0;  
  15.         dula=lock;  
  16.     }  
  17.       
  18.     void ADC0804_csToLow()  //cs置低電平  
  19.     {  
  20.         wela=open;  //打開鎖存器  
  21.         P0=0x7f;        //鎖存器最高位送0,也就是CSAD置0  
  22.         wela=lock;  
  23.     }  
  24.       
  25.     void ADC0804_startConvert() //P3.6口是wr,由高到底,再拉高后,ad開始轉換  
  26.     {  
  27.         adwr=high;  //雖然原本就是高的,但我們要養成好習慣,該是什么就是什么  
  28.         _nop_();  
  29.         adwr=low;   //wr置低后,過小會后AD內部開始執行轉換,轉換完成后INTR自動置低觸發中斷  
  30.         _nop_();  
  31.         adwr=high;  
  32.         //由于我們用的不是150pF電容,而是104pF,所以轉換比較慢,在調用本函數后最好延時10毫秒以上  
  33.     }  
  34.       
  35.     uint8 ADC0804_readResult()  //讀轉換結果  
  36.     {  
  37.         uint8 result=0;  
  38.         //延時一會兒,轉換就完成了,由于我們將INTR和CS都拉低了,直接操作RD后就可以讀了  
  39.         P1=0xff;    //防止由于轉換未完成原因引起的誤讀  
  40.         adrd=high;  
  41.         _nop_();  
  42.         adrd=low; //rd置低電平后數據總線P1口得到數據,并由led顯示現象  
  43.         _nop_();  
  44.         result=P1;  
  45.         adrd=high;  
  46.         //讀完以后,如果ad芯片不用了,就把cs拉高,注銷片選  
  47.         return result;  
  48.     }   
  49.       
  50.     void show(uint8 value)   //基準電壓是2.5V 為了計算方便擴大到2500  
  51.     {  
  52.         uint16 temp=value*(2500/255.0); //擴大到4位整數,小數點另外附加顯示  
  53.         uint8 oneWela,twoWela,threeWela,fourWela; //oneWela是最左邊的數碼管  
  54.         oneWela=temp/1000;  
  55.         twoWela=temp%1000/100;  
  56.         threeWela=temp%100/10;  
  57.         fourWela=temp%10;  
  58.         displaySMG(oneWela,twoWela,threeWela,fourWela,dark,dark,dotTable[1]); //最左邊的數碼管顯示小數點  
  59.     }  
  60.       
  61.     void main()  
  62.     {  
  63.       
  64.         uchar i=0;  
  65.         uchar adTemp=0;  
  66.         initSMG();          //數碼管數據初始化  
  67.         ADC0804_csToLow();   //cs置低  
  68.         while(1)  
  69.         {  
  70.             ADC0804_startConvert(); //開始將電壓數據轉換成數字信號      
  71.             for(i=5;i>0;i--)   //主要是延時一段時間,讓ad完成轉換  
  72.             {  
  73.                 delayms(1);  
  74.                 show(adTemp);   //延時的時候,數碼管繼續動態顯示   
  75.             }  
  76.             adTemp=ADC0804_readResult(); //讀取數據  
  77.             show(adTemp);  
  78.         }  
  79.     }  
復制代碼
  1.     #ifndef _MY51_H_  
  2.     #define _MY51_H_  
  3.     #include <math.h>  
  4.     #include <intrins.h>  
  5.       
  6.     typedef int                 int16  ;  
  7.     typedef int                 INT16  ;  
  8.     typedef unsigned int    uint16 ;  
  9.     typedef unsigned int    UINT16 ;  
  10.     typedef unsigned short  uint ;  
  11.     typedef unsigned short  UINT ;  
  12.     typedef unsigned short  word ;  
  13.     typedef unsigned short  WORD ;  
  14.     typedef unsigned long   uint32 ;  
  15.     typedef unsigned long   UINT32 ;  
  16.     typedef unsigned long   DWORD ;  
  17.     typedef unsigned long   dword ;  
  18.     typedef signed long    int32     ;  
  19.     typedef signed long    INT32  ;  
  20.     typedef float                   float32  ;  
  21.     typedef double              double64  ;  
  22.     typedef signed char     int8 ;  
  23.     typedef signed char         INT8 ;  
  24.     typedef unsigned char   byte ;  
  25.     typedef unsigned char    BYTE    ;      //WINDOWS的windef.h里面是這么定義的  
  26.     typedef unsigned char   uchar ;  
  27.     typedef unsigned char   UCHAR ;  
  28.     typedef unsigned char   UINT8 ;  
  29.     typedef unsigned char   uint8 ;  
  30.     typedef unsigned char   BOOL     ;      //windows中定義BOOL為int  
  31.     typedef unsigned char   bool     ;          //bool是c++的內置類型  
  32.       
  33.     #define TRUE     1  
  34.     #define true     1  
  35.     #define FALSE    0  
  36.     #define false    0  
  37.       
  38.     #define open     1    //open和close用于 標志打開和關閉狀態  
  39.     #define OPEN     1  
  40.     #define close    0  
  41.     #define CLOSE    0  
  42.     #define lock     0  
  43.     #define start    1  
  44.     #define START    1  
  45.     #define stop     0  
  46.     #define STOP     0  
  47.     #define keyDown  0  
  48.     #define keyUp    1  
  49.     #define gnd       0  //接地  
  50.     #define GND       0  //接地  
  51.     #define high    1  //高電平  
  52.     #define low     0   //低電平  
  53.     #define yes     1  
  54.     #define YES     1  
  55.     #define no      0  
  56.     #define NO      0  
  57.       
  58.     sbit dula =P2^6;  //段選鎖存器控制  控制筆段  
  59.     sbit wela =P2^7;  //位選鎖存器控制  控制位置  
  60.       
  61.     #define led P1    //燈總線控制  
  62.     sbit led0=P1^0;   //8個led燈,陰極送低電平點亮  
  63.     sbit led1=P1^1;  
  64.     sbit led2=P1^2;  
  65.     sbit led3=P1^3;  
  66.     sbit led4=P1^4;  
  67.     sbit led5=P1^5;  
  68.     sbit led6=P1^6;  
  69.     sbit led7=P1^7;  
  70.       
  71.     sbit keyS2=P3^4;    //4個獨立按鍵  
  72.     sbit keyS3=P3^5;  
  73.     sbit keyS4=P3^6;  
  74.     sbit keyS5=P3^7;  
  75.       
  76.     sbit csda=P3^2;  //DAC0832模數轉換cs口  
  77.     sbit adwr=P3^6; //ADC0804這個同DAC0832  
  78.     sbit dawr=P3^6;  
  79.     sbit adrd=P3^7;  //ADC0804  
  80.     sbit beep=P2^3;  //蜂鳴器  
  81.     void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);   
  82.     void delayms(uint16 ms);  
  83.     void T0_Work();  
  84.       
  85.     void delayms(uint16 ms)  //軟延時函數  
  86.     {  
  87.         uint16 i,j;  
  88.         for(i=ms;i>0;i--)  
  89.         {  
  90.             for(j=113;j>0;j--)  
  91.             {}  
  92.         }  
  93.     }  
  94.     ///////////////////////////////////////////////////////////////////////////  
  95.     #define dark    0x11  //在段中,0x11是第17號元素,為0是低電平,數碼管不亮  
  96.     #define dotDark 0xff //小數點全暗時  
  97.     uint8 code table[]= {           //0~F外加小數點和空輸出的數碼管編碼  
  98.         0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3  
  99.         0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7  
  100.         0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B  
  101.         0x39 , 0x5e , 0x79 , 0x71 , // C D E F  
  102.         0x80 , 0x00 ,0x40           // . 空  負號    空時是第0x11號也就是第17號元素  
  103.      };  
  104.       
  105.     uint8 dotTable[]={         //小數點位置  
  106.         0xff ,                 //全暗  
  107.         0xfe , 0xfd , 0xfb ,   //1 2 3  
  108.         0xf7 , 0xef , 0xdf     //4 5 6                     
  109.     };  
  110.     /////////////////////////////////////////////////////////////////////////////  
  111.     uint8   TH0Cout=0 ;     //初值      
  112.     uint8   TL0Cout=0 ;      
  113.     uint16  T0IntCout=0;     //中斷計數  
  114.     uint16  T0IntCountAll=0; //(N-1)/65536+1;  //總中斷次數  
  115.     bool    bT0Delay=false;  //使用延時函數標志,初始未用  
  116.     bool    bT0Over=false;   //中斷處理函數執行結果之一  
  117.       
  118.     void startT0(uint32 ms)  //開啟定時器  
  119.     {     
  120.         float32     t=ms/1000.0;                 //定時時間  
  121.         double64    fox =11.0592*(pow(10,6));   //晶振頻率  
  122.         uint32      N=(t*fox)/12 ;               //定時器總計數值  
  123.       
  124.         TH0Cout =(65536-N%65536)/256;        //裝入計時值零頭計數初值  
  125.         TL0Cout =(65536-N%65536)%256;  
  126.         T0IntCountAll=(N-1)/65536+1;             //總中斷次數  
  127.         TMOD=TMOD | 0x01;                        //設置定時器0的工作方式為1  
  128.          
  129.         EA =open;   //打開總中斷  
  130.         ET0=open;   //打開定時器中斷  
  131.       
  132.         TH0=TH0Cout;  //定時器裝入初值  
  133.         TL0=TL0Cout;  
  134.         TR0=start;   //啟動定時器  
  135.     }  
  136.       
  137.     void delayT0(uint32 ms)     //硬延時函數,自己亂寫的不好用,求指點  
  138.     {  
  139.         startT0(ms);                //啟動定時器  
  140.         bT0Delay=true;          //告訴T0定時器,起用延時模式  
  141.         while(bT0Over==false);  //時間沒到的話繼續檢測  
  142.         bT0Over=false;              //時間到了,讓標志復位  
  143.     }  
  144.       
  145.     void T0_times() interrupt 1 //T0定時器中斷函數  
  146.     {  
  147.         T0IntCout++;  
  148.         if(T0IntCout==T0IntCountAll)  //達到總中斷次數值  
  149.         {     
  150.             T0IntCout=0;         //中斷次數清零,重新計時  
  151.             bT0Over=true;     //時間真的到了  
  152.             if(bT0Delay)        //本次中斷是用來延時的嗎  
  153.             {  
  154.                 TR0=stop;        //如果是由延時函數開啟T0的話,關閉T0  
  155.                 return;  
  156.             }  
  157.       
  158.             TH0=TH0Cout;        //循環定時的話要重裝初值,每次定時1秒,重裝一次  
  159.             TL0=TL0Cout;  
  160.             T0_Work();          //工作函數  
  161.         }  
  162.     }  
  163.       
  164.     ////////////////////////////////////////////////////////////////////////////////  
  165.     void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  
  166.     {     
  167.         //控制6位數碼管顯示函數,不顯示的位用參數dark,保留ADC0804的片選信號  
  168.         uint8 csadState=0x80&P0;                //提取最高位,即ADC0804的片選信號  
  169.         uint8 tempP0=((csadState==0)?0x7f:0xff); //數碼管位選初始信號,陰極全置高電平  
  170.         P0=tempP0;      //0x7f表示數碼管不亮,同時ADC0804片選有效  
  171.         wela=1;         //注:wela和dula上電默認為1  
  172.         P0=tempP0;  
  173.         wela=0;  
  174.       
  175.         P0=0;               //由于數碼管是共陰極的,陽極送低電平,燈不亮,防止燈誤亮  
  176.         dula=1;  
  177.         P0=0;  
  178.         dula=0;             //段選數據清空并鎖定  
  179.     //////////////////////////oneWela  
  180.         {  //消除疊影,數碼管陰極置高電平,并鎖存  
  181.             P0=tempP0;  
  182.             wela=1;           
  183.             P0=tempP0;  
  184.             wela=0;  
  185.         }  
  186.         P0=0;           //低電平送到數碼管陽極,避免數碼管誤亮  
  187.         dula=1;  
  188.         P0=table[oneWela]|((0x01&dot)?0x00:0x80);   //送段數據,疊加小數點的顯示  
  189.         dula=0;  
  190.          
  191.       
  192.         P0=tempP0;          //送位數據前關閉所有顯示,并保持csad信號  
  193.         wela=1;  
  194.         P0=tempP0 & 0xfe;   //0111 1110最高位是AD片選,低6位是數碼管位選,低電平有效  
  195.         wela=0;  
  196.         delayms(2);  
  197.       
  198.     /////////////////////////twoWela  
  199.         {  //消除疊影  
  200.             P0=tempP0;  
  201.             wela=1;           
  202.             P0=tempP0;  
  203.             wela=0;  
  204.         }  
  205.         P0=0;  
  206.         dula=1;  
  207.         P0=table[twoWela]|((0x02&dot)?0x00:0x80);  
  208.         dula=0;  
  209.          
  210.         P0=tempP0;  
  211.         wela=1;  
  212.         P0=tempP0 & 0xfd;    //0111 1101  
  213.         wela=0;  
  214.         delayms(2);  
  215.       
  216.     /////////////////////////threeWela  
  217.         {  //消除疊影  
  218.             P0=tempP0;  
  219.             wela=1;           
  220.             P0=tempP0;  
  221.             wela=0;  
  222.         }  
  223.         P0=0;  
  224.         dula=1;  
  225.         P0=table[threeWela]|((0x04&dot)?0x00:0x80);  
  226.         dula=0;  
  227.       
  228.         P0=tempP0;  
  229.         wela=1;  
  230.         P0=tempP0 & 0xfb;    //0111 1011  
  231.         wela=0;  
  232.         delayms(2);  
  233.       
  234.     /////////////////////////fourWela  
  235.         {  //消除疊影  
  236.             P0=tempP0;  
  237.             wela=1;           
  238.             P0=tempP0;  
  239.             wela=0;  
  240.         }  
  241.         P0=0;  
  242.         dula=1;  
  243.         P0=table[fourWela]|((0x08&dot)?0x00:0x80);  
  244.         dula=0;  
  245.       
  246.         P0=tempP0;  
  247.         wela=1;  
  248.         P0=tempP0 & 0xf7;   //0111 0111  
  249.         wela=0;  
  250.         delayms(2);  
  251.       
  252.     /////////////////////////fiveWela  
  253.         {  //消除疊影  
  254.             P0=tempP0;  
  255.             wela=1;           
  256.             P0=tempP0;  
  257.             wela=0;  
  258.         }  
  259.         P0=0;  
  260.         dula=1;  
  261.         P0=table[fiveWela]|((0x10&dot)?0x00:0x80);  
  262.         dula=0;  
  263.       
  264.         P0=tempP0;  
  265.         wela=1;  
  266.         P0=tempP0 & 0xef;       //0110 1111  
  267.         wela=0;  
  268.         delayms(2);  
  269.       
  270.     /////////////////////////sixWela  
  271.         {  //消除疊影  
  272.             P0=tempP0;  
  273.             wela=1;           
  274.             P0=tempP0;  
  275.             wela=0;  
  276.         }  
  277.         P0=0;  
  278.         dula=1;  
  279.         P0=table[sixWela]|((0x20&dot)?0x00:0x80);  
  280.         dula=0;  
  281.       
  282.         P0=tempP0;  
  283.         wela=1;  
  284.         P0=tempP0 & 0xdf;   //0101 1111  
  285.         wela=0;  
  286.         delayms(2);  
  287.     }  
  288.       
  289.     #endif  
復制代碼




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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久 | 国产欧美在线 | 午夜激情小视频 | 少妇精品久久久久久久久久 | 亚洲视频在线免费观看 | 午夜国产一级 | 日日夜夜av | 成人在线精品 | 福利视频日韩 | 国产黄视频在线播放 | 男人天堂久久 | 欧美大片一区 | 久久综合一区二区 | 欧美久久精品一级c片 | 伊人导航 | 人人鲁人人莫人人爱精品 | 亚洲精品成人在线 | 性欧美精品一区二区三区在线播放 | 欧美精品1区2区 | 亚洲一区二区三区 | 成人在线视频免费看 | 自拍偷拍中文字幕 | 一级全黄少妇性色生活免费看 | 毛色毛片免费看 | 亚洲高清三级 | 激情五月婷婷综合 | www天天操| 国产专区在线 | 亚洲精品一区二区三区中文字幕 | 精品久久久久久久久久久久 | 自拍第1页| 欧美一区二区三区久久精品 | 欧美综合国产精品久久丁香 | 日韩不卡在线观看 | 99视频网站 | 91精品国产色综合久久 | 亚洲视频中文字幕 | 九九在线精品视频 | 免费午夜剧场 | 久久午夜精品 | 超碰在线播|