利用学习板上的热敏电阻作为温度传感器,将其测量的温度转换为电压信号,单片机A/D转换模块将该电压信号转换成相应的温度值并在数码管上显示出来,要求A/D转换的参考电压值为基准参考电压源的输出电压。
时间: 2024-03-24 18:40:43 浏览: 57
以下是51单片机的程序设计:
```c
#include <reg51.h>
#define FOSC 11059200L //晶振频率
#define BAUD 9600 //串口波特率
#define TIMER1_RELOAD (65536UL - (FOSC / 4 / BAUD))
sbit DQ = P3 ^ 7; //DS18B20数据线
sbit LATCH1 = P2 ^ 0; //74HC595锁存控制引脚
sbit LATCH2 = P2 ^ 1;
sbit SPI_CLK = P2 ^ 2; //74HC595串行时钟引脚
sbit SPI_DAT = P2 ^ 3; //74HC595串行数据引脚
unsigned char NUM_TABLE[] = { //数码管显示表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
void UART_Init()
{
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器1为模式2
TMOD |= 0x20;
TH1 = TIMER1_RELOAD / 256; //设置定时器1重载值
TL1 = TIMER1_RELOAD % 256;
TR1 = 1; //启动定时器1
}
void UART_SendByte(unsigned char dat)
{
SBUF = dat;
while (!TI); //等待发送完成
TI = 0; //清除发送完成标志
}
void SPI_SendByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SPI_DAT = (dat & 0x80) ? 1 : 0; //发送最高位
SPI_CLK = 1;
SPI_CLK = 0;
dat <<= 1;
}
}
void Display_Num(unsigned char num)
{
SPI_SendByte(NUM_TABLE[num % 10]); //发送个位数
SPI_SendByte(NUM_TABLE[num / 10]); //发送十位数
LATCH1 = 1;
LATCH1 = 0;
LATCH2 = 1;
LATCH2 = 0;
}
unsigned char DS18B20_Init()
{
unsigned char presence;
DQ = 1;
DQ = 0;
DQ = 1;
presence = DQ;
while (!DQ); //等待DS18B20响应
return presence;
}
void DS18B20_WriteByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
DQ = (dat & 0x01);
dat >>= 1;
DQ = 1;
}
}
unsigned char DS18B20_ReadByte()
{
unsigned char i, dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
DQ = 1;
dat >>= 1;
if (DQ)
dat |= 0x80;
}
return dat;
}
void DS18B20_StartConvert()
{
DS18B20_Init();
DS18B20_WriteByte(0xCC); //跳过ROM操作
DS18B20_WriteByte(0x44); //启动温度转换
}
int DS18B20_ReadTemp()
{
unsigned char lsb, msb;
int temp;
DS18B20_Init();
DS18B20_WriteByte(0xCC); //跳过ROM操作
DS18B20_WriteByte(0xBE); //读取温度寄存器
lsb = DS18B20_ReadByte();
msb = DS18B20_ReadByte();
temp = msb;
temp <<= 8;
temp |= lsb;
if (temp & 0x8000) //判断温度正负
{
temp = (~temp) + 1;
temp *= -1;
}
return temp;
}
void main()
{
float voltage, temp;
unsigned char temp_int, temp_frac;
UART_Init(); //初始化串口
while (1)
{
DS18B20_StartConvert(); //启动温度转换
voltage = (float)DS18B20_ReadTemp() / 16.0 * 0.0048828125; //计算电压值
temp = voltage / 3.3 * 100 - 50; //计算温度值
temp_int = (unsigned char)temp; //取整数部分
temp_frac = (unsigned char)((temp - temp_int) * 100); //取小数部分
Display_Num(temp_int); //显示整数部分
UART_SendByte(temp_int + '0'); //通过串口发送整数部分
UART_SendByte('.'); //通过串口发送小数点
Display_Num(temp_frac); //显示小数部分
UART_SendByte(temp_frac / 10 + '0'); //通过串口发送小数部分的十位数
UART_SendByte(temp_frac % 10 + '0'); //通过串口发送小数部分的个位数
}
}
```
程序中使用了DS18B20温度传感器,通过DS18B20_Init()函数进行初始化,DS18B20_StartConvert()函数启动温度转换,并通过DS18B20_ReadTemp()函数读取温度值。将温度转换成电压值后,再通过电压值计算得到对应的温度值,并通过数码管显示出来。注意参考电压源的输出电压需要通过电位器进行调整,以保证A/D转换的准确性。
阅读全文