- #include<reg52.h> //头文件
- #include<intrins.h>
- #include"eeprom52.h" //调用STC89C52单片机的EEPROM控制程序
- #include "math.h"
- #define uchar unsigned char //宏定义
- #define uint unsigned int //宏定义
- #define LCD1602_dat P0 //LCD1602的数据传输IO口
- sbit LCD1602_rs=P3^5;//LCD1602命令数据控制IO
- sbit LCD1602_rw=P3^6; //LCD1602读写IO控制
- sbit LCD1602_e=P3^4; //数据脉冲输入
- sbit DIN = P2^0; //串行数据输入端
- sbit DCLK = P2^1; //I/O时钟输入
- sbit DOUT = P2^5; //串行数据输出端
- sbit CS = P3^7; //片选脚IO
- #define AD_CH3 0xe4
- float zhi; //暂存读取的输入变量
- int temp; //读取热敏温度计的温度数据
- void delay(uint T) //系统延时程序
- {
- while(T--);
- }
- /*=========================================
- 函数 :SPI_Write(uchar DAT)
- 参数 :DAT需要发送的数据
- 返回值 :无
- 描述 :发送一个字节数据
- ==========================================*/
- void SPI_Write(uchar DAT)
- {
- uchar i;
- for(i=0;i<8;i++) //分别写8次,每次写一位
- {
- DCLK = 0; //拉低时钟总,允许DIN变化
- if(DAT & 0x80) //先写数据最高位
- DIN = 1; //写1
- else
- DIN = 0; //写0
- DCLK = 1; //拉高时钟,让从位机读取DIN
- DAT <<=1;
- }
- }
- /*========================================
- 函数 :ReadByte()
- 参数 :无
- 返回值 :返回读出的数据
- =========================================*/
- uint SPI_Read()
- {
- uchar i;
- uint DAT;
- for(i=0;i<12;i++) //分别读12次,每次读一位
- {
- DAT <<=1; //数据左移一位,准备接收一位
- DCLK = 1; //拉高时钟总线,读取SDA上的数据
- DCLK = 0; //拉低时钟总线,允许从机控制SDA变化
- if(DOUT)
- DAT |= 0x01; //为1则写1,否则不执行写1,通过左移补零
- }
- return(DAT); //返回读出的数据
- }
- /*=======================================
- 函数 :PCF8591Read(uchar cmd)
- 参数 :cmd XPT2046控制字节
- 返回值 :AD转出的数字量
- 描述 :读指定通道的输入的模拟量转为数字量
- ========================================*/
- uint ReadAD(uchar cmd)
- {
- uint DAT;
- CS = 0;
- SPI_Write(cmd);
- DCLK = 0; //拉低时钟总线
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- DAT = SPI_Read();
- CS = 1;
- return(DAT); //返回读出数据
- }
- /********************************************************************
- * 名称 : LCD1602_write(uchar order,dat)
- * 功能 : 1602写如数据函数
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- void LCD1602_write(uchar order,dat) //1602 一个字节 处理
- {
- LCD1602_e=0;
- LCD1602_rs=order;
- LCD1602_dat=dat;
- LCD1602_rw=0;
- LCD1602_e=1;
- delay(1);
- LCD1602_e=0;
- }
- /********************************************************************
- * 名称 : LCD1602_writebye(uchar *prointer)
- * 功能 : 1602写入数据函数 指针式
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- void LCD1602_writebyte(uchar *prointer) //1602 字符串 处理
- {
- while(*prointer!='\0')
- {
- LCD1602_write(1,*prointer);
- prointer++;
- }
- }
- /********************************************************************
- * 名称 : LCD1602_cls()
- * 功能 : 初始化1602液晶
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void LCD1602_cls() //1602 初始化
- {
- LCD1602_write(0,0x01); //1602 清屏 指令
- delay(1500);
- LCD1602_write(0,0x38); // 功能设置 8位、5*7点阵
- delay(1500);
- LCD1602_write(0,0x0c); //设置 光标 不显示开关、不显示光标、字符不闪烁
- LCD1602_write(0,0x06);
- LCD1602_write(0,0xd0);
- delay(1500);
- }
- /********************************************************************
- * 名称 : show()
- * 功能 : LCD1602液晶显示程序
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void show() //显示数据
- {
- LCD1602_write(0,0x80); //显示位置设定
- LCD1602_writebyte("Temp:"); //显示当前温度值
- if(temp>=0) //显示温度整数部分
- {
- if(temp>999)LCD1602_write(1,0x30+temp/1000%10);
- else LCD1602_writebyte(" ");
- if(temp>99)LCD1602_write(1,0x30+temp/100%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+temp/10%10);
- LCD1602_writebyte(".");
- LCD1602_write(1,0x30+temp%10);
- }else
- {
- LCD1602_writebyte("-"); //显示温度负数部分
- if(temp*-1>99)LCD1602_write(1,0x30+(temp*-1)/10%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+(temp*-1)%10);
- LCD1602_writebyte(".");
- LCD1602_write(1,0x30+temp%10);
- }
- LCD1602_write(1,0xdf);
- LCD1602_writebyte("C ");
- }
- /********************************************************************
- * 名称 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- * 功能 : 根据当前热敏电阻的阻值、以及参数、通过Sin曲线求出当前系统的温度值 并返回浮点型的温度值
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- {
- /*
- Rx: 热敏电阻当前阻值
- B: 热敏电阻参数B值
- Revise: 校正温度
- BasicRx: 热敏电阻25度时电阻(标称电阻数值)
- 返回: 摄氏度
- */
- Rx = Rx / BasicRx;
- Rx = log(Rx);
- Rx = (Rx) / B;
- Rx = Rx + 0.003356;
- Rx = 1 / Rx;
- Rx = Rx - 273.13;
- Rx = Rx + Revise;
- return Rx;
- }
- /********************************************************************
- * 名称 : void main()
- * 功能 : 系统主程序
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void main()
- {
- float Rad; //生成运算暂存变量
- LCD1602_cls(); //LCD1602初始化程序调用
- while(1)
- {
- zhi=(float)ReadAD(AD_CH3)/819.0; //计算电压值
- Rad=zhi/((5.0-zhi)/10000.0); //计算热敏电阻当前阻值
- temp=(int)((temp * 0.5) + (TempCalculate(Rad,4200.0,0,10000.0) * 0.5)*10);//求出当前系统的当前温度
- show(); //显示函数
- }
- }
复制代码 |