单片机学习小组
直播中

李春梅

7年用户 1765经验值
私信 关注

如何根据不同的光照引起光敏电阻阻值的变化?

如何根据不同的光照引起光敏电阻阻值的变化?

回帖(1)

李小波

2022-1-25 11:31:15
ADC采集是MCU感知外界的唯一途径,将外界的模拟信号转换成MCU可识别的数字信号,进而实现感知,控制。咱们zigbee网络中,终端节点的角色就是用来采集各种模拟量,例如:光照、温湿度、可燃气体浓度、等等,然后将采集的数据通过天线发送给协调器,或路由器,进行下一步的数据处理。
/*本次实验实现:
  光照采集模块:
                               根据不同的光照引起光敏电阻阻值的变化,
                               用ADC采集电压值,
                               然后将电压值通过串行口给上位机,
                        上位机在串口调试助手上显示数值*/


// 话不多说~直接上代码
#include


#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     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协议栈的世界,感谢~那些一路看过来的小伙伴们,你们的观看和支持就是笔者最大的动力!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分