假如你是一位资深的嵌入式工程师,请你用PB00和PB01模拟IIC,实现温度采集数据显示到LCD,请你写出思路流程和C语言代码
时间: 2024-02-23 22:01:41 浏览: 134
思路流程:
1. 初始化PB00和PB01为输出模式
2. 发送IIC起始信号
3. 发送IIC设备地址和寄存器地址
4. 发送IIC读取命令
5. 接收温度数据
6. 发送IIC停止信号
7. 将温度数据转换为实际温度值
8. 将温度值转化为字符串
9. 在LCD上显示温度值
C语言代码:
```c
#include <reg52.h>
#include <intrins.h>
#define SDA P1_0
#define SCL P1_1
#define ADDR 0x90 // IIC设备地址
#define REG 0x00 // IIC设备寄存器地址
void delay(unsigned int n) {
unsigned int i;
while (n--) {
for (i = 0; i < 125; i++);
}
}
void IIC_Start() {
SDA = 1;
SCL = 1;
delay(1);
SDA = 0;
delay(1);
SCL = 0;
}
void IIC_Stop() {
SDA = 0;
SCL = 1;
delay(1);
SDA = 1;
delay(1);
}
void IIC_SendByte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
SDA = dat & 0x80;
dat <<= 1;
SCL = 1;
delay(1);
SCL = 0;
delay(1);
}
}
unsigned char IIC_ReadByte() {
unsigned char i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++) {
SCL = 1;
dat <<= 1;
dat |= SDA;
SCL = 0;
}
return dat;
}
void IIC_Write(unsigned char addr, unsigned char reg) {
IIC_Start();
IIC_SendByte(addr);
IIC_SendByte(reg);
IIC_Stop();
}
unsigned char IIC_Read(unsigned char addr) {
unsigned char dat;
IIC_Start();
IIC_SendByte(addr + 1);
dat = IIC_ReadByte();
IIC_Stop();
return dat;
}
void ADC_Init() {
P1ASF = 0x01; // P1.0设置为模拟输入
ADC_RES = 0;
ADC_CONTR = 0x80 | 0x00 | 0x00 | 0x01;
}
unsigned int ADC_Read() {
unsigned char i;
unsigned int adc = 0;
ADC_CONTR |= 0x40;
_nop_();
_nop_();
_nop_();
_nop_();
for (i = 0; i < 8; i++) {
adc += ADC_RES;
ADC_CONTR |= 0x40;
_nop_();
_nop_();
_nop_();
_nop_();
}
adc >>= 3;
return adc;
}
void LCD_Init() {
LCD_CMD(0x38);
LCD_CMD(0x0c);
LCD_CMD(0x06);
LCD_CMD(0x01);
delay(5);
}
void LCD_CMD(unsigned char cmd) {
LCD_RS = 0;
LCD_RW = 0;
P0 = cmd;
delay(1);
LCD_EN = 1;
delay(1);
LCD_EN = 0;
}
void LCD_DAT(unsigned char dat) {
LCD_RS = 1;
LCD_RW = 0;
P0 = dat;
delay(1);
LCD_EN = 1;
delay(1);
LCD_EN = 0;
}
void LCD_ShowString(unsigned char x, unsigned char y, unsigned char *str) {
unsigned char i = 0;
if (x > 15) {
x = 0;
y++;
}
if (y > 1) {
y = 0;
}
while (str[i] != '\0') {
LCD_SetCursor(x, y);
LCD_DAT(str[i]);
i++;
x++;
if (x > 15) {
x = 0;
y++;
}
if (y > 1) {
y = 0;
}
}
}
void main() {
unsigned char buf[16];
unsigned int adc;
float temp;
ADC_Init();
LCD_Init();
IIC_Write(ADDR, REG);
while (1) {
adc = ADC_Read();
temp = (float)adc * 5.0 / 1024.0;
temp = (temp - 0.5) * 100.0;
sprintf(buf, "Temp: %.1f C", temp);
LCD_ShowString(0, 0, buf);
delay(1000);
}
}
```
阅读全文
相关推荐














