1、 /收到起始标志位unsigned char Sensor_ErrorFlag; /读取传感器错误标志unsigned int Sys_CNT;unsigned int Tmp;unsigned char *String;/字符串定义#define S_Temp Temp:#define S_RH RH:#define S_CRCT Check: True#define S_CRCF Wrong#define S_Data Data: #define S_NotS Sensor Not Connected/*|* 功能: 延时 晶振为12M时 *|* t = 1 为 20us 然后成倍增加10
2、us左右 *|*/void Delay_N10us(unsigned char t) while(t-) _nop_(); 延时 晶振为12M时 *|* 延时大约 1ms *|*/ void Delay_N1ms(unsigned int t) unsigned int i; unsigned int j; for(j=t;j0;j-) for(i=124;ii-); /延时大约 1ms 初始化串口 *|void InitUART(void) unsigned int iTmpBaud; unsigned long lTmpBaud; iTmpBaud = 0; /首先选定定时器2作为波特率发
3、生器,16位定时器,自动装载 SCON = 0x50; /SM0 SM1 SM2 REN TB8 RB8 TI RI /0 1 0 1 0 0 0 0 PCON = 0x00; /PCON的地址是87H,这里SMOD =0 T2CON = 0x30; /TF2 EXF2 RCLK TCLK EXEN2 TR2 C(/T2) CP(/RL2) /0 0 1 1 0 0 0 0 T2MOD = 0x00; / / / / / / / T2OE DCEN /0 0 0 0 0 0 0 0 lTmpBaud = FOSC/BAUD; lTmpBaud /= 32; /12T-mode iTmpBaud
4、 = lTmpBaud & 0xFFFF; iTmpBaud = 65536 - iTmpBaud; RCAP2H = (iTmpBaud8) & 0x0FF; RCAP2L = iTmpBaud & RI = 0; /清除接收中断标志 REN = 1; /允许串行接收 ES = 1; /允许串行中断 TR2 = 1; /启动定时器1 EA=1;/开总中断 串口发送函数 *|void UARTSend(char UCHAR) SBUF=UCHAR; while(TI=0); TI=0; 串口中断函数 *|void UARTRead(void) interrupt 4 char temp; if
5、(RI) RI=0; temp = SBUF; /* 串口发送子函数 *|void UART_PutString(unsigned char *buf) while(*buf) UARTSend(*buf+);void UART_PutStringAndNum(unsigned char *buf ,unsigned int num) unsigned char a3,i; a3 = 0+num%10; a2 = .; a1 = +num/10%10; a0 = +num/100%10; UARTSend( ); for(i=0;i4;i+) UARTSend(ai);void UART_Pu
6、tStringAnd_Data(unsigned char *buf ,unsigned char *bufdata) unsigned char a2,i,j;5; a0 = bufdatai/16; a1 = bufdatai%16; for(j=0;j9) aj = (aj-10)+A else aj = aj+ UARTSend(aj); UARTSend( 串口发送传感器数据函数 *|void UARTSend_Nbyte(void) if(Sensor_AnswerFlag = 1) Sensor_Check = Sensor_Data0+Sensor_Data1+Sensor_D
7、ata2+Sensor_Data3; /校验成功 if(Sensor_Check =Sensor_Data4) String = S_RH;/ Tmp = Sensor_Data0*256+Sensor_Data1; UART_PutStringAndNum(String,Tmp); UARTSend( String = S_Temp;/ Tmp = Sensor_Data2*256+Sensor_Data3; String = S_CRCT; UART_PutString(String); else /校验失败 送上读到数据 String = S_Data; UART_PutStringAn
8、d_Data(String,Sensor_Data); String = S_CRCF; / 传感器未连接 String = S_NotS; / UART_PutString(String); UARTSend(0x0A);void Clear_Data (void) int i; Sensor_Datai = 0x00; /接收数据清零 读传感器发送的单个字节 *|unsigned char Read_SensorData(void) unsigned char i,cnt; unsigned char buffer,tmp; buffer = 0;8; cnt=0; while(!Sens
9、or_SDA) /检测上次低电平是否结束 if(+cnt = 300) break; /延时Min=26us Max50us 跳过数据0 的高电平 Delay_N10us(2); /延时30us /判断传感器发送数据位 tmp =0; if(Sensor_SDA) tmp = 1; cnt =0; while(Sensor_SDA) /等待高电平 结束 if(+cnt = 200) buffer 300) /防止进入死循环 Sensor_ErrorFlag = 1; return 0; /判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while(Sensor_SDA) / 数
10、据接收 传感器共发送40位数据 / 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和 / 校验和为:湿度高位+湿度低位+温度高位+温度低位 Sensor_Datai = Read_SensorData(); else / 未收到传感器响应 return 1;void main(void) Sensor_SCL = 0; InitUART(); /初始串口发送函数 while(1) Clear_Data(); / 清除收到数据 Read_Sensor(); / 读取传感器数据 UARTSend_Nbyte(); / 串口发送读到传感器数据 Delay_N1ms(2000); / 延时 2S(两次读取间隔至少2S)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1