1602液晶显示成功程序:
- #include<reg52.h> //头文件
- #include<intrins.h>
- #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); //返回读出的数据
- }
- /*=======================================
- 返回值 :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_write(1,0x30+temp/1000%10);
- LCD1602_write(1,0x30+temp/100%10);
- LCD1602_write(1,0x30+temp/10%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,3950.0,0,10000.0) * 0.5)*10);//求出当前系统的当前温度
- show(); //显示函数
- }
- }
复制代码
段码屏程序(不能显示对应的温度):
- #include <reg52.h>
- //#include <intrins.h> //为了使用NOP
- #define NOP _nop_()
- #define uchar unsigned char
- #define uint unsigned int
- #define ComMode 0x52 //4COM,1/3bias 1000 010 1001 0
- #define RCosc 0x30 //内部RC振荡器(上电默认)1000 0011 0000
- #define LCD_on 0x06 //打开LCD显示 偏压发生器1000 0000 0 11 0
- #define LCD_off 0x04 //关闭LCD显示(上电默认)
- #define Sys_en 0x02 //系统振荡器开 1000 0000 0010
- #define Ctrl_cmd 0x80 //写控制命令 1000
- #define Data_cmd 0xa0 //写数据命令 1010
- //定义HT1621端口
- #define SEG_NUM 27 //段码数字个数,即Seg数量/2
- sbit CS1=P1^0;
- sbit WR1=P1^1;
- sbit DATA1=P1^2;
- /**-------------------------------------------------------------------------
- Name: SendBit_1621(送数据程序)
- ---------------------------------------------------------------------------*/
- void SendBit_1621(uchar sdata,uchar cnt) //sdata 的高cnt 位写入HT1621,高位在前
- {
- uchar i;
- for(i=0;i<cnt;i++)
- {
- WR1=0;
- if(sdata&0x80) DATA1=1;
- else DATA1=0;
- WR1=1;
- sdata<<=1;
- }
- }
- /**-------------------------------------------------------------------------
- Name: SendCmd(送命令)
- ---------------------------------------------------------------------------*/
- void SendCmd_1621(uchar command)
- {
- CS1=0;
- SendBit_1621(0x80,4); //写入标志码“100”和9 位command 命令,由于
- SendBit_1621(command,8); //没有使有到更改时钟输出等命令,为了编程方便
- CS1=1; //直接将command 的最高位写“0”
- }
- /**-------------------------------------------------------------------------
- Name: Write_1621(送数据和命令程序)
- ---------------------------------------------------------------------------*/
- void Write_1621(uchar addr,uchar sdata,uchar len)
- {
- addr<<=2;
- CS1=0;
- SendBit_1621(0xa0,3); //写入标志码“101”
- SendBit_1621(addr,6); //写入addr 的高6位
- SendBit_1621(sdata,len); //写入data 的高len位
- CS1=1;
- }
- /**-------------------------------------------------------------------------
- Name: all_off(清除1621显示)
- ---------------------------------------------------------------------------*/
- void HT1621_all_off(void)
- {
- uchar i;
- uchar addr=0;
- for(i=0;i<SEG_NUM;i++)
- {
- Write_1621(addr,0x00,8);
- addr+=2;
- }
- }
- /**-------------------------------------------------------------------------
- Name: Init_1621(初始化1621)
- -------------------------------------------------------------------------*/
- void Init_1621(void)
- {
- SendCmd_1621(Sys_en);
- SendCmd_1621(RCosc);
- SendCmd_1621(ComMode);
- SendCmd_1621(LCD_on);
- }
- 主程序:
- #include<reg52.h> //头文件
- #include<intrins.h>
- #include "math.h"
- #include "HT1621.h"
- #define uchar unsigned char //宏定义
- #define uint unsigned int //宏定义
- sbit DIN = P2^0; //串行数据输入端
- sbit DCLK = P2^1; //I/O时钟输入
- sbit DOUT = P2^5; //串行数据输出端
- sbit CS = P3^7; //片选脚IO
- uchar code tab1[10]= {0xF0,0x00,0xD0,0x90,0x20,0xB0,0xF0,0x10,0xF0,0xB0};
- uchar code tab2[10]= {0xA0,0xA0,0x60,0xE0,0xE0,0xC0,0xC0,0xA0,0xE0,0xE0};
- #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); //返回读出数据
- }
- /********************************************************************
- * 名称 : show()
- * 功能 : 液晶段码屏显示程序
- ***********************************************************************/
- void show() //显示数据
- {
- Write_1621(15,tab1[temp/100],4);
- Write_1621(16,tab2[temp/100],4);
- Write_1621(17,tab1[temp/10%10],4);
- Write_1621(18,tab2[temp/10%10],4);
- Write_1621(19,tab1[temp%10],4);
- Write_1621(20,tab2[temp%10],4);
- }
- /********************************************************************
- * 名称 : 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; //生成运算暂存变量
- Init_1621();
- HT1621_all_off();
- while(1)
- {
- zhi=(float)ReadAD(AD_CH3)/819.0; //计算电压值
- Rad=zhi/((5.0-zhi)/10000.0); //计算热敏电阻当前阻值
- temp=(int)((temp * 0.5) + (TempCalculate(Rad,3950.0,0,10000.0) * 0.5)*10);//求出当前系统的当前温度
- show(); //显示函数
- }
- }
复制代码
|