基于at89c52编制能使LCD12864显示max6675测的温度的程序
时间: 2024-03-21 22:41:25 浏览: 37
基于89c52的温度显示程序
好的,下面是基于at89c52编制的能够让LCD12864显示max6675测得温度的程序:
```
#include<reg52.h>
#include<intrins.h> //需要使用函数 _nop_()
#define uchar unsigned char
#define uint unsigned int
#define LCD_Data_Port P2 //LCD 数据端口
sbit RS=P0^0; //寄存器选择信号
sbit RW=P0^1; //读写选择信号
sbit E=P0^2; //使能信号
sbit CS=P1^0; //SPI 从机选择信号
sbit SO=P1^1; //SPI 数据输出信号
sbit SCK=P1^2; //SPI 时钟信号
float temperature; //存储温度值
//函数声明
void InitLcd(); //LCD 初始化函数
void WriteCommand(uchar com); //LCD 写命令函数
void WriteData(uchar dat); //LCD 写数据函数
void DelayMs(uint ms); //延时函数
void InitSpi(); //SPI 初始化函数
uchar SpiRead(); //SPI 读函数
void main()
{
InitLcd(); //初始化 LCD
InitSpi(); //初始化 SPI
while(1)
{
CS=0; //SPI 选择 MAX6675
_nop_();
_nop_();
temperature=SpiRead(); //读取高8位温度
temperature=temperature<<8;
temperature+=SpiRead(); //读取低8位温度
CS=1; //SPI 取消选择 MAX6675
temperature=temperature*0.25; //计算温度值
WriteCommand(0x80); //设置光标位置为第一行第一列
WriteData('T');
WriteData('e');
WriteData('m');
WriteData('p');
WriteData(':');
WriteData(' ');
WriteData(' ');
WriteData((uchar)(temperature/100)+'0'); //显示百位数
WriteData((uchar)(temperature%100/10)+'0'); //显示十位数
WriteData('.'); //显示小数点
WriteData((uchar)(temperature%10)+'0'); //显示个位数
WriteData(0xdf); //显示单位℃
}
}
//LCD 初始化函数
void InitLcd()
{
WriteCommand(0x38); //设置16×2字符显示,5×7点阵,8位数据接口
WriteCommand(0x0c); //开显示,光标不显示,不闪烁
WriteCommand(0x06); //读写一个字符后地址自动加1,光标自动右移
WriteCommand(0x01); //清屏
}
//LCD 写命令函数
void WriteCommand(uchar com)
{
RS=0; //选择写命令
RW=0; //选择写入
LCD_Data_Port=com; //将命令送入数据口
E=1; //置高脉冲
_nop_(); //延时
_nop_();
_nop_();
E=0; //置低脉冲
}
//LCD 写数据函数
void WriteData(uchar dat)
{
RS=1; //选择写数据
RW=0; //选择写入
LCD_Data_Port=dat; //将数据送入数据口
E=1; //置高脉冲
_nop_(); //延时
_nop_();
_nop_();
E=0; //置低脉冲
}
//延时函数
void DelayMs(uint ms)
{
uchar i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
//SPI 初始化函数
void InitSpi()
{
CS=1; //SPI 取消选择 MAX6675
SO=1; //SPI 数据输出引脚初始化
SCK=0; //SPI 时钟引脚初始化
}
//SPI 读函数
uchar SpiRead()
{
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
SCK=0; //SPI 时钟置低
_nop_(); //延时
_nop_();
dat<<=1; //数据左移一位
dat|=SO; //读取数据
SCK=1; //SPI 时钟置高
_nop_(); //延时
_nop_();
}
return dat;
}
```
需要注意的是,此程序中使用的是 MAX6675 温度传感器,如果您使用的是其他型号的传感器,则需要进行相应的修改。此外,此程序中使用的 LCD12864 的数据端口为 P2,如果您使用的是其他的端口,则需要进行相应的修改。
阅读全文