admin管理员组

文章数量:1530842

2024年7月19日发(作者:)

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define WENDU 40

sbit deng = P1^1; //发光二极管

sbit DQ = P1^2; //温度传送数据IO口

sbit guang = P1^3; //光电传感器检测口

sbit beep = P1^5; //蜂鸣器

sbit anjian = P2^0; //控制按键

char done,count,temp,flag,up_flag,down_flag; //

uchar temp_value,biaozhi; //温度值

uchar TempBuffer[7];

uchar LCDyanwu[7];

uchar lcdsx[5];

sbit sw3=P1^0;

sbit sw1=P1^6;

sbit sw2=P1^7;

uchar num1;

uchar yanwu;

uchar getdata=55;//检测值

uint shangxian=100;//设定上限

uint getdate;

void kongzhi();//

void show_time(); //液晶显示程序

/***********1602液晶显示部分子程序****************/

//Port Definitions**********************************************************

sbit LcdRs = P2^3;

sbit LcdRw = P2^2;

sbit LcdEn = P2^1;

sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

/****************内部等待函数*******************************/

unsigned char LCD_Wait(void)

{

LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

LcdEn=0;

return DBPort;

}

/**************向lcd写入命令或数据****************/

#define LCD_COMMAND 0 // Command

#define LCD_DATA 1 // Data

#define LCD_CLEAR_SCREEN 0x01 // 清屏

#define LCD_HOMING 0x02 // 光标返回原点

void LCD_Write(bit style, unsigned char input)

{

LcdEn=0;

LcdRs=style;

LcdRw=0; _nop_();

DBPort=input; _nop_();//注意顺序

LcdEn=1; _nop_();//注意顺序

LcdEn=0; _nop_();

LCD_Wait();

}

//设置显示模式************************************************************

#define LCD_SHOW 0x04 //显示开

#define LCD_HIDE 0x00 //显示关

#define LCD_CURSOR 0x02 //显示光标

#define LCD_NO_CURSOR 0x00 //无光标

#define LCD_FLASH 0x01 //光标闪动

#define LCD_NO_FLASH 0x00 //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)

{

LCD_Write(LCD_COMMAND, 0x08|DisplayMode);

}

//设置输入模式************************************************************

#define LCD_AC_UP 0x02

#define LCD_AC_DOWN 0x00 // default

#define LCD_MOVE 0x01 // 画面可平移

#define LCD_NO_MOVE 0x00 //default

void LCD_SetInput(unsigned char InputMode)

{

LCD_Write(LCD_COMMAND, 0x04|InputMode);

}

//初始化LCD************************************************************

void LCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动

}

//液晶字符输入的位置************************

void GotoXY(unsigned char x, unsigned char y)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

//将字符输出到液晶显示

void Print(unsigned char *str)

{

while(*str!='0')//while(*str!='0')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

/***********ds18b20子程序*************************/

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i)

{

while(i--);

}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay_18B20(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay_18B20(80); //精确延时 大于 480us

DQ = 1; //拉高总线

delay_18B20(14);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay_18B20(20);

}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 给脉冲信号

dat>>=1; //数据右移一位

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80; //按位或,取最高位

delay_18B20(4);

}

return(dat);

}

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01; //取最低位

delay_18B20(5);

DQ = 1; //上升沿将数据送入

dat>>=1;

}

}

/**************读取ds18b20当前温度************/

void ReadTemp(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay_18B20(100); // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

delay_18B20(100);

a=ReadOneChar(); //读取温度值低位

b=ReadOneChar(); //读取温度值高位

temp_value=b<<4; //左移四位,扩大16倍,变为一个字节的高四位

temp_value+=(a&0xf0)>>4;//取温度值的地位的高四位,右移四位后与温度的高四位相加

得到温度值

}

void temp_to_str() //温度数据转换成液晶字符显示

{

TempBuffer[0]=temp_value/10+'0'; //十位

TempBuffer[1]=temp_value%10+'0'; //个位

TempBuffer[2]='.';

TempBuffer[3]='0';

TempBuffer[4]=0xdf; //温度符号

TempBuffer[5]='C';

TempBuffer[6]='0';

}

void shangxiang_to_str() //烟雾上限数据转换成液晶字符显示

{

lcdsx[0]=shangxian/100+'0'; //百位

lcdsx[1]=shangxian/10+'0'; //十位

lcdsx[2]=shangxian%10+'0'; //个位

lcdsx[3]='0';

}

void Delay1ms(unsigned int count)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<120;j++);

}

/*延时子程序*/

void mdelay(uint delay)

{ uint i;

for(;delay>0;delay--)

{for(i=0;i<20;i++) //1ms延时.

{;}

}

}

/*************按键模块程序设计*********************/

void key() //按键检测程序

{

if(sw3==0) //上限设置

{

if(sw1==0) //上限减功能

{

if(shangxian>0) shangxian--;

else( shangxian=255);

}

if(sw2==0) //上限加功能

{

if(shangxian<255) shangxian++;

else( shangxian=0);

}

}

}

/*************ad转换子程序******************/

//防止头文件被重复调用

#ifndef __TLC549_ADC_H__

#define __TLC549_ADC_H__

#include //包含头文件

//TLC549管脚定义与开发板硬件对应

sbit CLK = P2^5; //时钟

sbit DO = P2^4; //数据输出

sbit CS = P2^6; //片选

//数据定义

unsigned int Volt;

unsigned char LCDyanwu[7]; //电压数据转化成液晶字符显示

unsigned char TLC549_ADC(void); //获得数据

void Data_Conversion(void); //电压换算并扩大1000倍

void Volt_To_LCDyanwu(void); //数据转化成液晶字符显示

//获得数据

unsigned char TLC549_ADC(void)

{

unsigned char i, tmp;

CS = 1; //CS 置高,片选无效

CLK = 0;

CS = 0; //CS 置低,片选有效,同时DO 输出最高位

_nop_();

_nop_(); //适当延迟时间1.4us Setup Time

for(i = 0; i < 8; i++) //串行数据移位输入

{

tmp <<= 1;

tmp |= DO;

CLK = 1; //0.4us

_nop_(); //CLK transition time Max 0.1us

CLK = 0; //0.4us

}

CS = 1; //CS 置高,片选无效

for(i = 17; i != 0; i--) _nop_(); //需要延迟时间17us

return (tmp);

}

//电压换算并扩大1000倍

void Data_Conversion(void)

{

unsigned char AD_Data;

AD_Data = TLC549_ADC();

Volt = 5.0 / 256 * AD_Data * 1000;

}

//数据转化成液晶字符显示

void Volt_To_LCDyanwu(void)

{

Data_Conversion(); //电压换算并扩大1000倍

LCDyanwu[0] = Volt / 1000 + '0'; //千位

LCDyanwu[1] = '.'; //小数点

LCDyanwu[2] = Volt / 100 % 10 + '0'; //百位

LCDyanwu[3] = Volt / 10 % 10 + '0'; //十位

LCDyanwu[4] = Volt % 10 + '0'; //个位

LCDyanwu[5] = '0'; //字符串结束标志符

}

#endif

/*********烟雾比较子程序**************/

void kongzhi()

{ if(getdate>=shangxian)

{

num1++;

if(num1>=20)

{

num1=0;

yanwu=0;//烟雾异常

}

}

else {yanwu=1;

}

}

void show_time() //液晶显示程序

{

GotoXY(0,0);

Print("wd:");

ReadTemp(); //开启温度采集程序

temp_to_str(); //温度数据转换成液晶字符

GotoXY(3,0); //液晶字符显示位置

Print(TempBuffer); //显示温度

GotoXY(0,1);

Print("yan:");

TLC549_ADC();

Data_Conversion();

Volt_To_LCDyanwu();

GotoXY(5,0);

Print("Lcdyanwu");

GotoXY(12,0);

Print(";");

shangxiang_to_str() ;

GotoXY(13,0);

Print(lcdsx);

if(biaozhi==1)

{

biaozhi=0;

beep=~beep;

deng=0;

GotoXY(11,0);

Print("yichang");

}

else{

beep=1;

deng=1;

GotoXY(11,0);

Print("zhengchang ");

}

}

//主程序***********************

main()

{ getdate=TLC549_ADC();

Data_Conversion();

key();

// 按键检测

kongzhi();

LCD_Initial(); //液晶初始化

Init_DS18B20( ) ; //DS18B20初始化

while(1)

{

if(((temp_value>=WENDU)&&(yanwu==0))||((temp_value>=WENDU)&&(guang==0))||((guang

==0)&&(yanwu==0))||((temp_value>=WENDU)&&(yanwu==0)&&(guang==0))||( anjian==0))

{

biaozhi=1;

}

else

biaozhi=0;

show_time(); //液晶显示数据

}

}

本文标签: 数据温度字符液晶显示