ZigBee入門-CC2530-實驗(八)-ADC採集-串口通信-代碼

ADC採集是MCU感知外界的唯一途徑,將外界的模擬信號轉換成MCU可識別的數字信號,進而實現感知,控制。咱們zigbee網絡中,終端節點的角色就是用來採集各種模擬量,例如:光照、溫溼度、可燃氣體濃度、等等,然後將採集的數據通過天線發送給協調器,或路由器,進行下一步的數據處理。
/*本次實驗實現:
  光照採集模塊:
       			根據不同的光照引起光敏電阻阻值的變化,
       			用ADC採集電壓值,
       			然後將電壓值通過串行口給上位機,
        		上位機在串口調試助手上顯示數值*/
// 話不多說~直接上代碼
#include <ioCC2530.h>

#define uchar unsigned char  //宏定義uchar爲unsigned char
#define uint unsigned int    //宏定義uint爲unsigned int

#define LED P1_0             //宏定義LED爲P1_0腳

uint ADC_value=0;            //定義ADC轉換值
float ADC_result=0;          //定義ADC最終值

char ADC_data[6]=" 0.0V ";    //定義串口數組

void Init_LED();             //聲明LED 初始化函數
void Init_ADC();             //聲明ADC初始化函數
void Init_UART0();           //聲明串口0初始化函數
void UR0_SendString(char *str,char len);//聲明字符串發送函數
void LED_RUN();              //聲明LED閃爍函數
void Delay(uint ms);         //聲明延時函數
/*======================主程序入口==================*/
void main(void)              
{ 
  Init_LED();                //LED 初始化
  Init_ADC();                //ADC初始化
  Init_UART0();              //串口0初始化
  
  while(1)                   //死循環
  {
    if(ADCIF)                //是否轉換完畢
    {
      ADCIF = 0;             //採樣標誌位清零
      //讀取adc數值
      ADC_value = ADCH;      //讀取高8位
      ADC_value <<= 8;       //將ADCH移到高位
      ADC_value |= ADCL;     //讀取低8位
      ADC_value >>= 3;       //去掉空位
      
      // 0 表示 0V ,3.3V--4096
      // 電壓值 = (ADC_value*3.3)/4096 (V)
      ADC_result = ADC_value*3.3/4096;
      
      ADC_data[1]=(char)(ADC_result)%10+'0';//取結果第一位轉數值
      ADC_data[3]=(char)(ADC_result)*10%10+'0';//取結果的第二位轉數值
      
      UR0_SendString(ADC_data,6);//將結果通過串口發送給上位機
      LED_RUN();//發送完一次LED狀態改變一次
      Delay(120);//延時一段時間
      Init_ADC();//繼續開啓ADC採集
    }
  }
}
/*==================聲明函數的具體實現===============*/
void Delay(uint ms)             //ms級延時函數
{
  uint i,j;
  for(i=0; i<ms; i++)
    for(j=0; j<535;j++);
}
void Init_LED()            //初始化LED 
{
  P1SEL &= ~0x01;          //LED P1.0爲普通IO口
  P1DIR |= 0x01;           //LED P1.0爲輸出
  LED = 0;                 //LED P1.0 置低
}
void LED_RUN()
{
  LED ^=1;//LED狀態改變
}
void Init_ADC()
{
  ADCH &= 0x00;
  ADCL &= 0x00;       //清空ADC數據寄存器
  
  APCFG |= 0x02;      //P0.1配置爲模擬I/O口
  ADCCON3 = 0xB1;     //參考電壓:VDD5 引腳;512 抽取率(12 位 );通道1
  
}
void Init_UART0()
{
  PERCFG = 0x00;     //選串口0的備用位置1;即(P0.2和P0.3)
  P0SEL |= 0x0c;     //將P0_2和P0_3管腳設置成外設功能
  U0CSR |= 0x80;     //1: UART模式
  //查手冊,配置爲115200波特率
  U0BAUD = 216;
  U0GCR = 11;      
  U0UCR |=0x80;      //禁止流控,無校驗,8位數據,1位停止位,清除緩衝器
  UTX0IF = 0;        //串口0發送中斷標誌位清零
  EA = 1;            //開總中斷
}
void UR0_SendString(char *str,char len)
{
  while(len--)
  {
    U0DBUF = *str++;//將要發送的1字節數據寫入U0DBUF數據緩衝區
    while(!UTX0IF); //等待數據發送完成
    UTX0IF = 0;     //TX中斷標誌位清零,以便下一次發送
  }
}
如果大家覺得實驗中一些寄存器的配置不是很明白,大家就拿出咱們吃飯的傢伙CC2530的數據手冊來把實驗中出現的寄存器在手冊中查找,去理解。
這也是咱們zigbee入門-CC2530的最後一個實驗,接下來我會帶領大家走進Z-stack協議棧的世界,感謝~那些一路看過來的小夥伴們,你們的觀看和支持就是筆者最大的動力!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章