/* 包含头文件 */ #include <ioCC2530.h> #include "hal_defs.h" #include "sh10.h"
/*宏定义*/ #define LED1 P1_0 #define LED2 P1_1 #define SW1 P1_2
/*定义变量*/ uint8 counter = 0; //统计定时器溢出次数 uint8 flag_auto = 0;//自动工作模式标志位,0为手动模式,1为自动模式 int16 tem,hum;//温湿度数值,tem为温度,hum为湿度 uint8 buff[10]; uint8 flag=0;
char tt; /*声明函数*/ void Delay1Ms(uint8 time);//延时函数,32MHz系统时钟下,约1ms延时函数 void InitCLK(void);//系统时钟初始化函数,为32MHz void InitTime1(void);//定时器1初始化函数,数据溢出周期为50ms void InitUart0(void);//串口0初始化函数 void UART0SendByte(unsigned char c);//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 InitTime1(void) { T1CC0L = 50000 & 0xff; T1CC0H = (50000 &0xff00)>>8; T1CCTL0 |= 0x04;//设定定时器1通道0比较模式 T1CTL = 0x0a;//设置定时器1为32分频、模模式,并开始运行 TIMIF &= ~0x40;//不产生定时器1的溢出中断 T1IE = 1;//使能定时器1中断 }
void InitUart0(void) { PERCFG = 0x00; P0SEL = 0x3c; U0CSR |= 0xC0; U0BAUD = 216; U0GCR = 11; U0UCR |= 0x80; UTX0IF = 0; // 清零UART0 TX中断标志 URX0IF = 0;// 清零UART0 RX中断标志 URX0IE = 1;//使能UART0 RX中断 }
void UART0SendByte(unsigned char c) { U0DBUF = c;// 将要发送的1字节数据写入U0DBUF while (!UTX0IF) ;// 等待TX中断标志,即U0DBUF就绪 UTX0IF = 0;// 清零TX中断标志 }
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(); InitTime1(); InitUart0(); /*.......答题区1开始:LED灯初始状态设置...........*/ P1SEL &= ~0x07;//设置P1_0、P1_1、P1_2为GPIO口 P1DIR |= 0x03;//设置P1_0和P1_1为输出
LED1=LED2=0; /*.......答题区1结束...........*/ /*.......答题区2开始:SW1按键中断输入功能初始化...........*/ P1DIR &= ~0x04; //设置P1_2为输入 P1INP &= ~0x04; //设置P1_2端口为“上拉/下拉”模式 P2INP &= ~0x40; //设置所有P1端口为“上拉” PICTL |= 0x02; //设置P1_2端口中断触发方式为:下降沿触发 IEN2 |=0x10; //使能P1端口中断 P1IEN |=0x04; //使能P1_2端口中断 /*.......答题区2结束...........*/ EA = 1;//使能总中断 while(1) { /*..答题区3开始:自动工作模式下,每隔2s采集温湿度数据并通过串口发送,根据湿度值控制LED2的亮灭..*/ if(flag_auto==1){ call_sht11(&tem,&hum); if(counter>=40){ buff[0]=tem/10; buff[1]=hum/10; UART0SendData(buff,2); counter=0; } if(hum>=500){ LED2=1; } else{ LED2=0; } } /*.......答题区3结束...........*/ } }
/*中断服务函数*/ #pragma vector = P1INT_VECTOR __interrupt void P1_ISR(void) { if(P1IF == 1) { /*.......答题区4开始:实现SW1按键控制LED2...........*/ if(P1IFG&0x04){ if(flag==0) { LED2=1; flag=1; } else { LED2=0; flag=0; } } /*.......答题区4结束...........*/ P1IF = 0; P1IFG = 0x00; } }
#pragma vector = T1_VECTOR __interrupt void T1_ISR(void) { counter++; T1STAT &= ~0x01; //清除通道0中断标志 }
#pragma vector = URX0_VECTOR __interrupt void UART0_ISR(void) { /*.......答题区5开始:接收数据0xAF时进入自动工作方式、点亮LED1、禁止SW1中断; 接收数据0xBF时退出自动工作方式、熄灭LED1、使能SW1中断。...........*/ tt=U0DBUF; if(tt==0xAF){ flag_auto=1; LED1=1; P1IEN &=~0x04; } if(tt==0xBF){ flag_auto=0; LED1=0; P1IEN |=0x04; } /*.......答题区5结束...........*/ URX0IF = 0;// 清零UART0 RX中断标志 }