鲁东大学本科毕业设计
图6 CAT1640写周期时序
CAT1640的读操作分为当前地址读取和选择地址读取两种,具体读取时序跟写操作类似,在此不再赘述。
4.2.2 CAT1640操作函数介绍
主要的操作函数如下:
uint8_t I2C_Read(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t *buf,uint16_t num) //通过指定I2C接口读取多个字节数据,成功返回0 uint8_t I2C_Write(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t *buf,uint16_t num); //通过指定I2C接口写入多个字节数据,成功返回0
4.3 USART通讯部分
Usart 通讯部分主要是微处理器与电脑、U10手机模块的通讯。STM32F103系列MCU拥有3个USART,在本系统中Usart2用于MCU与U10通讯模块之间的通讯,Usart3用于MCU与电脑之间的通讯。
Usart的主要操作函数如下:
4.3.1对USART进行基本配置的函数
USART_Init(USARTx, &USART_InitStructure) //初始化串口 USART_Cmd(USARTx, ENABLE) //使能串口
USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE) //开启串口接
9
鲁东大学本科毕业设计
收中断
USART_ClearFlag(USARTx, USART_FLAG_TC) //清除串口发送完成中断
4.3.2串口的读写操作的函数
void Uartx_PutChar(u8 ch) //串口写单个字符函数 void Uartx_PutStr(char *str) //串口写字符串函数 void USARTx_IRQHandler(void) //串口读函数 {
while(USART_GetITStatus(USART2, USART_IT_RXNE) !=SET); TIM_Cmd(TIM2, ENABLE);
str2[x2]= USART_ReceiveData(USART2); x2++; }
4.4 温度检测函数
4.4.1 计算温度值程序
DS18B20存储的温度是16 位的带符号扩展的二进制补码形式
当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位 |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----| 低字节 | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |
|-----符号位:0->正 1->负-------|-----------整数-----------|
高字节 | s | s | s | s | s | 2^6 | 2^5 | 2^4 | 温度 = 符号位 + 整数 + 小数*0.0625 计算温度的程序如下:
float DS18B20_Get_Temp(void) {
uint8_t tpmsb, tplsb; short s_tem; float f_tem;
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC); /* 跳过 ROM */
10
鲁东大学本科毕业设计
}
DS18B20_Write_Byte(0X44);
/* 开始转换 */
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC); DS18B20_Write_Byte(0XBE);
tplsb = DS18B20_Read_Byte(); tpmsb = DS18B20_Read_Byte();
s_tem = tpmsb<<8; s_tem = s_tem | tplsb;
if( s_tem < 0 ) /* 负温度*/ f_tem = (~s_tem+1) * 0.0625; else f_tem = s_tem * 0.0625;
return f_tem;
/*跳过ROM */ /* 读温度值*/
4.4.2 DS18B20检测和初始化函数
static uint8_t DS18B20_Presence(void) {
uint8_t pulse_time = 0;
/* 主机设置为上拉输入 */ DS18B20_Mode_IPU();
/* 等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号 ,如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/
while( DS18B20_DATA_IN() && pulse_time<100 ) { pulse_time++; delay_us(1); }
/* 经过100us后,存在脉冲都还没有到来*/ if( pulse_time >=100 ) return 1; else pulse_time = 0;
/* 存在脉冲到来,且存在的时间不能超过240us */ while( !DS18B20_DATA_IN() && pulse_time<240 ) {
11
鲁东大学本科毕业设计
pulse_time++; delay_us(1); }
if( pulse_time >=240 ) return 1; else return 0; }
uint8_t DS18B20_Init(void) {
DS18B20_GPIO_Config(); DS18B20_Rst();
return DS18B20_Presence(); }
5 主要部分源程序
5.1 主函数部分
主函数中首先进行各个模块进行初始化,然后在循环函数中反复查询各个模块的状态,若状态有变化,则执行相应的操作。程序如下:
#include \#include
u8 AlarmWriteBuffer[16]={17,30,1+2,4+8+16, 9,30,1+2+4+8+16,0, 3,0,0,1+2+4+8+16}; {
12
7,0,4+8+16,1+2,
// [0][1]conrelay1 [2][3] marks1 [4][5]conrelay2 [6][7] mars2 //[8][9]conrelay3 [10][11] marks3 [12][13]conrelay4 [14][15] mars4
int main(void)
鲁东大学本科毕业设计
RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); USART3_Configuration(); USART2_Configuration(); I2C_Configuration(); Timer2_Configuration(); Timer3_Configuration(); delay_init(72); RTC_init();
//I2C_Write(I2C1,CAT1640,128,AlarmWriteBuffer,16 ); }
Start_U10(str2); delay_ms(2000); Check_10086(str2);
Uart2_PutStr(\delay_ms(50);
Uart2_PutStr(\delay_ms(50);
GPIO_Close_Relay(1+2+4+8+16); Check_Start(); while(1)
Check_sec(); Check_Data2(str2); Check_Data(str3); Check_Alarm(); Check_NewDay();
{
}
5.2 分析手机模块传来的数据的函数
void Check_Data2(char *str)
13