zig4

    技术2022-07-14  59

    /* 包含头文件 */ #include "ioCC2530.h" #include <stdio.h> #define LED1 P1_0     // P1_0定义为P1_0  led灯端口 #define uint16 unsigned short #define uint32 unsigned long

    unsigned char SprintfAsciiResult[20];//存放转换后的ASCII字符串 unsigned char ProtocolBuff[9];//推送到网关的协议帧 uint16  counter=0; //统计溢出次数 unsigned char AsciiStr[8];//定义一个数组大小为8 unsigned char CHK(unsigned char *buf,int len);

    void InitLED() { //考生完成LED的初始化 //=====》空白处开始     P1SEL&=~0x01;     P1DIR|=0x01;     LED1=0; //《=====空白处结束 }

    void adc_Init(void) {   APCFG  |=0x01;        //使能P0模拟外设功能,指定P0_0   P0SEL  |=0x01;    //设置P0_0 为外设口   P0DIR  &=~0x01;    //设置p0_0 为输入口 }

    /************************************************************ * 名称       get_adc * 功能       读取ADC通道0电压值 * 入口参数   无 * 出口参数   16位电压值,分辨率为10mV ***************获取ADC通道0电压值************************/

    uint16 get_adc(void) {     uint32 value;     ADCIF = 0;   //清ADC 中断标志     //采用基准电压avdd5:3.3V,通道0,启动AD转化     //考生完成ADC的初始化 //=====》空白处开始     ADCCON3= 0x90;     while(!ADCIF);     value=ADCH;     value=value<<8;     value|=ADCL;           //《=====空白处结束     // AD值转化成电压值     // 0 表示 0V ,32768 表示 3.3V     // 电压值 = (value*3.3)/32768 (V)     value = (value * 330);// 返回分辨率为10mV的电压值     value = value >> 15;   // 除以32768     // 返回分辨率为0.01V的电压值     return (uint16)value; }

    /**********串口通信初始化************************/ void initUART0(void) {     PERCFG = 0x00;         P0SEL = 0x3c;         //由考生设置串口相关参数,要求波特率115200     //=====》空白处开始         U0CSR|=0x80;         U0BAUD=216;         U0GCR=11;         U0UCR|=0x80;               //《=====空白处结束     UTX0IF = 0;  // 清零UART0 TX中断标志     EA = 1;   //使能全局中断 }

    /************************************************* * 函数名称:initTimer1 * 功    能:初始化定时器T1控制状态寄存器 ******************定时器初始化*****************************/ void initTimer1() { //考生完成定时器的初始化 //=====》空白处开始     CLKCONCMD&=0x80;     T1CTL|=0x0E;     T1CCTL0|=0x04;     T1CC0L=50000&0x00ff;     T1CC0H=(50000&0xff00)>>8;           //《=====空白处结束          T1IF=0;           //清除timer1中断标志(同IRCON &= ~0x02)     T1STAT &= ~0x01;  //清除通道0中断标志     TIMIF &= ~0x40;  //不产生定时器1的溢出中断    //定时器1的通道0的中断使能T1CCTL0.IM默认使能     IEN1 |= 0x02;    //使能定时器1的中断     EA = 1;        //使能全局中断 }

    /**************单片机发送协议帧数据到串口******************/ void UART0SendData(unsigned char *str,int len ) {   for(int i=0;i<=len;i++)   {     U0DBUF = str[i];   // 将要发送的1字节数据写入U0DBUF     while (!UTX0IF) ;  // 等待TX中断标志,即U0DBUF就绪     UTX0IF = 0;        // 清零TX中断标志UART0SendByte(*str++);    } }

    /**************构建发送电压值到物联网网关的协议帧******************/ void BuildProtocolFrame(uint16 voltage) {   ProtocolBuff[0]=0xDD;   ProtocolBuff[1]=0x03;   ProtocolBuff[2]=0x00;   ProtocolBuff[3]=0x01;   ProtocolBuff[4]=0x09;   ProtocolBuff[5]=0x04;   ProtocolBuff[6]=voltage>>8;   ProtocolBuff[7]=voltage&0xFF;   ProtocolBuff[8]=CHK(ProtocolBuff,8); }

    /**************和校验函数******************/  unsigned char CHK(unsigned char *buf,int len) {     unsigned char  RX_CHX=0;      while(len--) {         RX_CHX+= *buf;         buf++;     }

        return RX_CHX&=0xff; }

    /**************获取电压值并处理数据******************/ void Get_AsciiValue() {   uint16 sensor_val;   sensor_val=get_adc();   AsciiStr[0]=sensor_val/100+'0';   AsciiStr[1]='.';   AsciiStr[2]=sensor_val/10+'0';   AsciiStr[3]=sensor_val+'0';   AsciiStr[4]='V';   AsciiStr[5]='\n';  }

    /****************************************** * 功    能:定时器T1中断服务子程序 ************************************/ #pragma vector = T1_VECTOR //中断服务子程序 __interrupt void T1_ISR(void) {     EA = 0;   //禁止全局中断     counter++;     T1STAT &= ~0x01;  //清除通道0中断标志     EA = 1;   //使能全局中断 } //LED1闪烁时间延迟 void delay(int time) {    for(int i=0;i<=time;i++)    {      for(int j=0;j<=240;j++);    }

    } /****************************************** * 函数名称:main * 功    能:main函数入口 * 入口参数:无 * 出口参数:无 * 返 回 值:无 **************************************************/ void main(void) {     InitLED();     initTimer1();  //初始化Timer1     initUART0();  // UART0初始化     adc_Init(); // ADC初始化    while(1)     {     if(counter>=10)     //定时器每0.2S溢出中断计次     {       counter=0;       //清标志位       LED1 = 1;    //指示灯点亮       Get_AsciiValue(); #ifdef debug     //由考生完成向串口发送可燃气体值ASCII字符串     //=====》空白处开始           sprintf(SprintfAsciiResult,"传感器电压值:%s",AsciiStr);           UART0SendData(SprintfAsciiResult,sizeof(SprintfAsciiResult));                    //《=====空白处结束 #else      //由考生完成向串口发送可燃气体协议帧     //=====》空白处开始     BuildProtocolFrame(get_adc());     UART0SendData(ProtocolBuff,8);               //《=====空白处结束      delay(500);                          #endif                              LED1 = 0;    //指示灯熄灭       }   } }  

    Processed: 0.015, SQL: 9