上述上述设计方案用keil编写
时间: 2023-07-02 20:19:18 浏览: 79
好的,以下是使用Keil编写STMC8T6控制器与DS18B20模块的代码示例。这个代码示例使用1-Wire协议与DS18B20通信,并将读取到的温度值通过串口发送出来。
```c
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>
#include <string.h>
// 定义控制器引脚
#define OW_DQ P3_7
// 定义DS18B20命令
#define CMD_CONVERT_T 0x44
#define CMD_READ_SCRATCHPAD 0xBE
// 定义串口参数
#define BAUDRATE 9600
#define UART_TX P1_1
// 定义延时函数
void DelayUs(unsigned int us)
{
unsigned char i;
for(i = 0; i < us; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
// 定义1-Wire总线操作函数
void OW_Reset(void)
{
OW_DQ = 1;
DelayUs(5);
OW_DQ = 0;
DelayUs(500);
OW_DQ = 1;
DelayUs(60);
}
unsigned char OW_ReadBit(void)
{
unsigned char bit_data = 0;
OW_DQ = 1;
DelayUs(2);
OW_DQ = 0;
DelayUs(5);
OW_DQ = 1;
DelayUs(5);
bit_data = OW_DQ;
DelayUs(50);
return bit_data;
}
void OW_WriteBit(unsigned char bit_data)
{
OW_DQ = 1;
DelayUs(5);
OW_DQ = 0;
DelayUs(5);
OW_DQ = bit_data;
DelayUs(60);
OW_DQ = 1;
DelayUs(5);
}
void OW_WriteByte(unsigned char byte_data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
OW_WriteBit(byte_data & 0x01);
byte_data >>= 1;
}
}
unsigned char OW_ReadByte(void)
{
unsigned char i;
unsigned char byte_data = 0;
for(i = 0; i < 8; i++)
{
byte_data >>= 1;
if(OW_ReadBit())
{
byte_data |= 0x80;
}
}
return byte_data;
}
// 定义DS18B20读取函数
float DS18B20_ReadTemperature(void)
{
unsigned char i;
unsigned char temp[2];
float temperature;
OW_Reset();
OW_WriteByte(CMD_CONVERT_T);
DelayUs(750);
OW_Reset();
OW_WriteByte(CMD_READ_SCRATCHPAD);
for(i = 0; i < 2; i++)
{
temp[i] = OW_ReadByte();
}
temperature = (float)(temp[1] << 8 | temp[0]) / 16.0;
return temperature;
}
// 定义串口发送函数
void UART_SendByte(unsigned char dat)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
if(dat & 0x01)
{
UART_TX = 1;
}
else
{
UART_TX = 0;
}
dat >>= 1;
DelayUs(100);
}
}
void UART_SendString(char *str)
{
unsigned char i;
for(i = 0; i < strlen(str); i++)
{
UART_SendByte(str[i]);
}
}
// 主函数
void main()
{
float temperature;
char temp_str[10];
// 初始化串口
TMOD = 0x20;
TH1 = 256 - FOSC / 32 / BAUDRATE;
TL1 = TH1;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
while(1)
{
temperature = DS18B20_ReadTemperature();
sprintf(temp_str, "%.2f", temperature);
UART_SendString(temp_str);
UART_SendString("\r\n");
DelayUs(1000000);
}
}
```
这个代码示例分为三个部分:
1. 1-Wire总线操作函数,用于与DS18B20进行通信。
2. DS18B20读取函数,用于读取DS18B20的温度值。
3. 串口发送函数,用于将温度值发送到PC端。
在主函数中,我们先初始化串口,然后不断读取DS18B20的温度值,并将其发送到PC端。需要注意的是,这个代码示例中并没有加入控制逻辑,你需要根据你的具体应用场景,加入相应的控制指令和判断语句。
你可以将这个代码示例复制到Keil中,进行编译和调试。需要注意的是,在实际应用中,还需要考虑到硬件连接和软件优化等问题,以确保系统的稳定性和可靠性。
阅读全文