zig1

    技术2022-07-14  79

    /* 包含头文件 */ #include <ioCC2530.h> #include "hal_defs.h"

    /*宏定义*/ #define LED1 P1_0  #define LED2 P1_1 #define SW1 P1_2

    /*定义变量*/ uint8 counter = 0; //统计定时器溢出次数 uint8 flag = 0; //统计定时器溢出次数 uint16 value; uint8 arr[2]; /*声明函数*/ void Delay1Ms(uint8 time);//延时函数,32MHz系统时钟下,约1ms延时函数 void InitCLK(void);//系统时钟初始化函数,为32MHz void InitLED(void);//LED灯IO端口初始化函数 void InitTime1(void);//定时器1初始化函数,数据溢出周期为50ms void InitADC(void);//ADC模块初始化 uint16 get_adc(void);//获取ADC转换结果,返回分辨率为0.01V的电压值 void InitUart0(void);//串口0初始化函数 void UART0SendByte(unsigned char c);//UART0发送一个字节函数 void UART0SendString(unsigned char *str);//UART0发送整个字符串 void UART0SendData(unsigned char *str,int len);//UART0发送指定数量字节数据 /*定义函数*/ void Delay1Ms(uint8 time) {   unsigned int i,j;   for(i=0;i<=time;i++)   {     for(j=0;j<1100;j++);   } }

    void InitCLK(void) {   CLKCONCMD &= 0x80;   while(CLKCONSTA & 0x40); }

    void InitLED(void) {   P1SEL &= ~0x07;//设置P1_0、P1_1、P1_2为GPIO口   P1DIR |= 0x03;//设置P1_0和P1_1为输出 }

    void InitTime1(void) {   T1CC0L = 50000 & 0xff;   T1CC0H = (50000 &0xff00)>>8;   T1CCTL0 |= 0x04;//设定定时器1通道0比较模式   T1CTL = 0x0a;//设置定时器1为32分频、模模式,并开始运行   TIMIF &= ~0x40;//不产生定时器1的溢出中断   T1IE = 1;//使能定时器1中断  }

    void InitADC(void) {   APCFG  |=0x01;   P0SEL  |=0x01;       P0DIR  &=~0x01;     }

    uint16 get_adc(void) {   uint32 value;   ADCIF = 0;   //清ADC 中断标志   //采用基准电压avdd5:3.3V,通道0,启动AD转化   ADCCON3 = (0x80 | 0x10 | 0x00);   while (!ADCIF); //等待AD转化结束   value = ADCH;   value = value<< 8;   value |= ADCL;   // AD值转化成电压值   // 0 表示 0V ,32768 表示 3.3V   // 电压值 = (value*3.3)/32768 (V)   value = (value * 330);   value = value >> 15;   // 除以32768   // 返回分辨率为0.01V的电压值   return (uint16)value; }

    void InitUart0(void) {   PERCFG = 0x00;       P0SEL = 0x3c;       U0CSR |= 0x80;   U0BAUD = 216;   U0GCR = 11;   U0UCR |= 0x80;   UTX0IF = 0;  // 清零UART0 TX中断标志  }

    void UART0SendByte(unsigned char c) {   U0DBUF = c;// 将要发送的1字节数据写入U0DBUF   while (!UTX0IF) ;// 等待TX中断标志,即U0DBUF就绪   UTX0IF = 0;// 清零TX中断标志 }

    void UART0SendString(unsigned char *str) {   while(*str != '\0')   {     UART0SendByte(*str++);   } }

    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 main(void) {   InitCLK();   InitLED();   InitTime1();   InitADC();   InitUart0();      /*.......答题区1开始:LED灯初始状态设置...........*/   LED1=0;   LED2=0;

      /*.......答题区1结束...........*/      /*.......答题区2开始:SW1按键中断输入功能初始化...........*/   P1DIR&=~0x04;//设置P1_2为输入   P1INP &= ~0x04;//设置P1_2端口为“上拉/下拉”模式   P2INP&=~0x40;//设置所有P1端口为“上拉”   PICTL|=0x20;//设置P1_2端口中断触发方式为:下降沿触发   IEN2|=0x10;//使能P1端口中断   P1IEN|=0x04;//使能P1_2端口中断   /*.......答题区2结束...........*/      EA = 1;//使能总中断      while(1)   {     /*..答题区3开始:每隔2s采集光照度数据并通过串口发送,每次采集LED2闪烁..*/   if(counter>=40)   {     counter=0;      if(flag==1)     {       value=get_adc();       arr[0]=value>>8;       arr[1]=value;       UART0SendData(arr,2);       LED2=~LED2;       Delay1Ms(800);       LED2=~LED2;     }   }     /*.......答题区3结束...........*/   } }

    /*中断服务函数*/ /*.......答题区4开始:按键中断服务函数...........*/ #pragma vector = P1INT_VECTOR __interrupt void P1_ISR(void) {   if(P1IFG&0x04)   {     if(flag==0)     {       flag=1;       LED1=1;     }     else     {       flag=0;       LED1=0;     }   }   P1IFG=0x00; }

    /*.......答题区4结束...........*/

    #pragma vector = T1_VECTOR __interrupt void T1_ISR(void) {   counter++;   T1STAT &= ~0x01;  //清除通道0中断标志 }

    Processed: 0.010, SQL: 9