<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STC89C52單片機(jī)UART AD DA測試實驗

          STC89C52單片機(jī)UART AD DA測試實驗

          作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
          ///////////////////////////////////////////////////////////////////////////

          實現(xiàn)功能: 調(diào)節(jié)實驗板上的標(biāo)號為AD0的電位器改變電壓,通過PCF8591的采集,把
          數(shù)據(jù)傳輸給單片機(jī),單片機(jī)通過處理把采集到的電壓值,顯示在數(shù)碼管
          上,同時把通過AD0采集到的數(shù)據(jù)重新寫入PCF8591,讓其轉(zhuǎn)換成模擬信
          號,改變開發(fā)板上D11的亮暗程度,而且把采集到的數(shù)據(jù)通過串口發(fā)送到
          電腦上。注意所采用的通道為第0通道,也就
          是說調(diào)節(jié)的是AD0電位器
          實驗板型號:KBL-XYD-C52
          實驗名稱:UART AD DA測試實驗
          編寫人:謝應(yīng)東
          編寫日期: 2012-4-30
          ///////////////////////////////////////////////////////////////////////////
          #include //包含52單片機(jī)頭文件
          #include //包含標(biāo)準(zhǔn)輸入輸出文件

          本文引用地址:http://www.ex-cimer.com/article/201611/319238.htm

          #define uchar unsigned char//宏定義這個誰都知道的
          #define uint unsigned int

          uchar code table[]={
          0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共陰數(shù)碼管1至F數(shù)字編碼

          sbit duan=P2^6; //573鎖存器段鎖存端
          sbit wei=P2^7; //位鎖存端

          sbit sda=P2^0; //定義模擬IIC總線的數(shù)據(jù)線
          sbit scl=P2^1; //定義模擬IIC總線的時鐘線

          float fValue;

          #define FOSC 11059200L
          #define TIMS (65535-FOSC/12/1000) //在12T模式下定時器中斷1毫秒的計算方法

          uint cCount,cFlag=0;
          ///////////////////////////////////////////////////////////////////////////
          函數(shù)名稱:毫秒延時函數(shù)
          函數(shù)功能:實現(xiàn)毫秒級的延時
          參數(shù)介紹:Delay_MS: 定義需要延時的毫秒的數(shù)值
          iNumber: 記錄Delay_MS的數(shù)值,以for語句實現(xiàn)所要求的延時
          iValue: 要延時毫秒所要進(jìn)行的循環(huán)數(shù)值,本數(shù)值為實際測得
          返回值:
          注意事項:本實驗是在所用晶振為12M的前提下實現(xiàn)的毫秒延時,本函數(shù)是通過循環(huán)的形
          式完成,所以如果改變了晶振的頻率,請做相應(yīng)的改變
          ///////////////////////////////////////////////////////////////////////////

          void DelayMs(uint Delay_MS)
          {
          uint iNumber,iValue;
          for(iNumber=0;iNumber{
          iValue=107;
          while(iValue--);
          }
          }
          ///////////////////////////////////////////////////////////////////////////
          函數(shù)名稱:DelayUs
          函數(shù)功能:延時幾個微秒(us),用來IIC總線延時
          參數(shù)介紹:無
          返回值:
          注意事項:無
          ///////////////////////////////////////////////////////////////////////////

          void DelayUs()
          {;;}
          ///////////////////////////////////////////////////////////////////////////
          函數(shù)名稱:Display_V
          函數(shù)功能:把通過PCF8591采集到的數(shù)據(jù),在單片機(jī)處理完之后,顯示在數(shù)碼管上
          參數(shù)介紹:cBai:要顯示在第一個數(shù)碼管上的數(shù)字
          cShi:要顯示在第二個數(shù)碼管上的數(shù)字
          cGe:要顯示在第三個數(shù)碼管上的數(shù)字
          返回值:
          注意事項:注意實驗板上所要用到底的數(shù)碼管為共陰極的數(shù)碼管
          ///////////////////////////////////////////////////////////////////////////
          void Display_V(uchar cBai,uchar cShi,uchar cGe)
          {
          duan=1; //打開數(shù)碼管的段選
          P0=table[cBai]|0x80;//送入相應(yīng)的段選0x80是為了點(diǎn)亮數(shù)碼管小數(shù)點(diǎn)(dp端)
          duan=0;//關(guān)閉數(shù)碼管的段選
          P0=0xff;
          wei=1;//打開數(shù)碼管的位選
          P0=0xfe; //給要點(diǎn)亮數(shù)碼管的公共極低電平
          wei=0;//關(guān)閉數(shù)碼管的位選
          DelayMs(5);//穩(wěn)定時序

          duan=1;//打開數(shù)碼管的段選
          P0=table[cShi];//送入相應(yīng)的段選
          duan=0;//關(guān)閉數(shù)碼管的段選
          P0=0xff;
          wei=1; //打開數(shù)碼管的位選
          P0=0xfd; //給要點(diǎn)亮數(shù)碼管的公共極低電平
          wei=0; //打開數(shù)碼管的位選
          DelayMs(5); //穩(wěn)定時序

          duan=1; //打開數(shù)碼管的段選
          P0=table[cGe]; //送入相應(yīng)的段選
          duan=0; //關(guān)閉數(shù)碼管的段選
          P0=0xff;
          wei=1; //打開數(shù)碼管的位選
          P0=0xfb; //給要點(diǎn)亮數(shù)碼管的公共極低電平
          wei=0; //打開數(shù)碼管的位選
          DelayMs(5); //穩(wěn)定時序
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:Init_IIC
          函數(shù)功能:完成對IIC總線數(shù)據(jù)線時鐘線初始化
          參數(shù)介紹:無
          返回值:
          注意事項:無
          ///////////////////////////////////////////////////////////////////////////
          void Init_IIC()
          {
          sda=1;
          scl=1;
          }
          ///////////////////////////////////////////////////////////////////////////
          函數(shù)名稱:Start_IIC
          函數(shù)功能:IIC總線的開始條件
          參數(shù)介紹:無
          返回值:
          注意事項:具體請參考相關(guān)的文檔
          ///////////////////////////////////////////////////////////////////////////
          void Start_IIC()//開始條件
          {
          sda=1;
          DelayUs();
          scl=1;
          DelayUs();
          sda=0;
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:Stop_IIC
          函數(shù)功能:IIC總線的終止條件
          參數(shù)介紹:無
          返回值:
          注意事項:具體請參考相關(guān)的文檔
          ///////////////////////////////////////////////////////////////////////////

          void Stop_IIC()
          {
          sda=0;
          DelayUs();
          scl=1;
          DelayUs();
          sda=1;
          DelayUs();
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:Response_IIC
          函數(shù)功能:IIC總線的應(yīng)答條件
          參數(shù)介紹:cNumber: 定義一個延時的變量
          返回值:
          注意事項:具體請參考相關(guān)的文檔
          ///////////////////////////////////////////////////////////////////////////
          void Response_IIC()//
          {
          uchar cNumber=0;
          scl=1;
          DelayUs();
          while((sda==1)&&(cNumber<255))
          cNumber++; //加一個等待時間防止程序一直處在檢測狀態(tài)
          scl=0;//這個是應(yīng)答和非應(yīng)答綜合的應(yīng)答條件
          DelayUs();
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:Write_byte
          函數(shù)功能:通過IIC總線向PCF8591寫入一個字節(jié)
          參數(shù)介紹:cData:要寫入的字節(jié)的值
          cNumber: 定義for語句中用到的變量,因為IIC總線是一位一位寫入的,所
          以需要循環(huán)8次
          cTempValue: 臨時的一個變量
          返回值:
          注意事項:具體請參考相關(guān)IIC文檔
          ///////////////////////////////////////////////////////////////////////////
          void Write_byte(uchar cData)
          {
          uchar cNumber,cTempValue;
          cTempValue=cData;
          for(cNumber=0;cNumber<8;cNumber++) //循環(huán)8次,完成一個字節(jié)的寫入
          {
          cTempValue=cTempValue<<1; //CY=cTempValue^7;
          scl=0;
          DelayUs();
          sda=CY; //CY 進(jìn)位標(biāo)志位
          DelayUs();
          scl=1;
          DelayUs();
          }
          scl=0;
          DelayUs();
          sda=1;
          DelayUs();
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:Read_byte
          函數(shù)功能:通過IIC總線,從器件里讀取一個字節(jié),因為必須是一位一位讀,所以需要
          循環(huán)8次
          參數(shù)介紹:cNumber:for句用到的循環(huán)變量
          返回值: cValue:返回讀取到的字節(jié)
          注意事項:請參考相應(yīng)的文檔
          ///////////////////////////////////////////////////////////////////////////

          uchar Read_byte()
          {
          uchar cNumber=0,cValue=0;
          scl=0;
          DelayUs();
          sda=1;
          DelayUs();
          for(cNumber=0;cNumber<8;cNumber++) //完成對一個字節(jié)的讀取
          {
          scl=1;
          DelayUs();
          cValue=(cValue<<1)|sda; //通過循環(huán)得到一個字節(jié)
          scl=0;
          DelayUs();
          }
          return cValue; //返回讀取到的字節(jié)
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:Read_channel
          函數(shù)功能:選取PCF8591的AD輸入通道,然后再讀出采集到數(shù)值,即電壓值
          參數(shù)介紹:無
          返回值: cValue:返回采集到的數(shù)據(jù)
          注意事項:無
          ///////////////////////////////////////////////////////////////////////////
          uchar Read_channel(uchar cChannel)//PCF通道選擇函數(shù)
          {
          uchar cValue; //從這個通道讀出數(shù)據(jù)是大多數(shù)學(xué)習(xí)者
          Start_IIC(); //比較模糊的地方
          Write_byte(0x90); //這個時序請按照AT24C02的任意讀時序圖進(jìn)行操作
          Response_IIC();
          Write_byte(0x40|cChannel);
          Response_IIC();
          Start_IIC();
          Write_byte(0x91); //給IIC器件寫入相應(yīng)的命令
          Response_IIC();
          cValue=Read_byte(); //讀取采集到的數(shù)據(jù)
          Stop_IIC();

          return cValue; //返回采集到的數(shù)據(jù)
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:Write_Data
          函數(shù)功能:把要寫入的數(shù)據(jù)寫入PCF8591,讓其開始轉(zhuǎn)換,然后輸出相應(yīng)的模擬值
          參數(shù)介紹:cData:要寫入PCF8591的數(shù)據(jù)
          返回值:
          注意事項:無
          ///////////////////////////////////////////////////////////////////////////
          void Write_Data(uchar cData)
          {
          Start_IIC();//以下嚴(yán)格按照PCF8591寫時序圖
          Write_byte(0x90);//進(jìn)行操作
          Response_IIC();
          Write_byte(0x40);
          Response_IIC();
          Write_byte(cData);
          Response_IIC();
          Stop_IIC();
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:Init_UART
          函數(shù)功能:設(shè)定UART的波特率,配置定時器0每一毫秒鐘中斷一次,打開相應(yīng)的中斷
          定時器1產(chǎn)生波特率,讓定時器0開始中斷計時
          參數(shù)介紹:無
          返回值:
          注意事項:無
          ///////////////////////////////////////////////////////////////////////////
          void Init_UART()
          {
          TMOD=0x21;//定時器1工作方式2,8位自動充裝
          TH1=0xfd; //通信波特率定為9600bps
          TL1=0xfd; //晶振為11.0592M的

          TL0=TIMS;
          TH0=TIMS>>8; //定時1秒所要裝的初值
          SM0=0; //選擇串行口工作方式1
          SM1=1;

          EA=1; //打開全局中斷
          ET0=1; //打開定時器0中斷
          TR0=1; //讓定時器0開始工作
          TR1=1; //波特率的產(chǎn)生依靠是定時器1的溢出率
          }
          ///////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:main
          函數(shù)功能:完成對采集到的電壓值的處理,然后顯示到前三個數(shù)碼管上,把采集到的
          數(shù)據(jù)同時寫入PCF8591里,讓其轉(zhuǎn)換成模擬信號,改變發(fā)光二極管D11的亮
          暗程度
          參數(shù)介紹:cBai:因為把數(shù)分離,才能顯示到數(shù)碼管上,作為分離后顯示在第一個數(shù)
          碼管上的數(shù)
          cShi:顯示在第二個數(shù)碼管上的數(shù)
          cGe:顯示在第三個數(shù)碼管上的數(shù)
          iTempValue:臨時變量,賦予從PCF8591通道0讀出來的數(shù)值
          返回值:
          注意事項:無
          ///////////////////////////////////////////////////////////////////////////

          void main()
          {
          uchar cBai,cShi,cGe;
          int iTempValue;
          DelayMs(50);//穩(wěn)定系統(tǒng)
          Init_UART();//初始化串口
          Init_IIC();//IIC總線初始化
          while(1) //大循環(huán)是用來不停地掃描PCF8591的數(shù)據(jù)變換
          {
          iTempValue=Read_channel(0);//從PCF8591通道0讀出來的數(shù)值
          fValue=(float)iTempValue/51; //要把num強(qiáng)制轉(zhuǎn)換為float型進(jìn)行計算
          cBai=iTempValue/51;//下面這三個分離是把從通道讀取到的數(shù)值轉(zhuǎn)換為電壓
          cShi=iTempValueQ*10/51; //想一下5V為255那么1v是不是代表51
          cGe=iTempValueQ*10Q*10/51;//1.8v是不是數(shù)值92
          Display_V(cBai,cShi,cGe);//把電壓值顯示到數(shù)碼管上
          Write_Data(iTempValue);//把采集到數(shù)據(jù)寫到PCF8591,讓其轉(zhuǎn)換成模擬信號
          if(cFlag==1)
          {
          cFlag=0;//對標(biāo)志位清零,以便下次再發(fā)送
          TI=1; //這一點(diǎn)至關(guān)重要
          printf("The Volatage is %f Vn",fValue); //頭文件stdio.h的標(biāo)準(zhǔn)函數(shù)
          printf("The Num is %d nn",iTempValue);
          while(!TI);//判斷是否發(fā)送完畢
          TI=0;//發(fā)送完成后記住要清零,為了下次發(fā)送
          }
          }
          }

          void Timer0_Routine() interrupt 1
          {
          TL0=TIMS;
          TH0=TIMS>>8; //定時1毫秒所要裝的初值
          cCount++;
          if(cCount==1000)
          {
          cCount=0;
          cFlag=1;
          }
          }



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();