微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 电子温度计1602液晶显示或数码管显示

电子温度计1602液晶显示或数码管显示

时间:11-28 来源:互联网 点击:
#include

#define uchar unsigned char

#defineuint unsigned int

sbit DS=P2^2; //define interface

uint temp; // variable of temperature

uchar flag1; // sign of the result positive or negative

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

//unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

// 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

// 0x87,0xff,0xef};

sbit lcden=P3^4;//液晶en端口

sbit lcdrs=P3^5;//液晶rs端口

void delay(uint count) //delay

{

uint i;

while(count)

{

i=200;

while(i>0)

i--;

count--;

}

}

void dsreset() //DS18B20复位

{

uint i;

DS=0;

i=103;

while(i>0)i--;

DS=1;

i=4;

while(i>0)i--;

}

bit tmpreadbit() //DS18B20复读取一位

{

uint i;

bit dat;

DS=0;i++; //i++ 用于延时

DS=1;i++;i++;

dat=DS;

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

return (dat);

}

uchar tmpread() //DS18B20复读取一字节

{

uchar i,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tmpreadbit();

dat=(j<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里

}

return(dat);

}

void tmpwritebyte(uchar dat) //DS18B20写一字节到单片机

{

uint i;

uchar j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb) //写1

{

DS=0;

i++;i++;

DS=1;

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

}

else

{

DS=0; //写0

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

DS=1;

i++;i++;

}

}

}

void tmpchange() //DS18B20数据转换

{

dsreset();//复位

delay(1);

tmpwritebyte(0xcc);

tmpwritebyte(0x44); // 启动温度转换指令

}

uint tmp() //获取温度值

{

float tt;

uchar a,b;

dsreset();

delay(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe);

a=tmpread();

b=tmpread();

temp=b;

temp<=8; //两个8位的字节合并为一个16位的整型数据

temp=temp|a;

tt=temp*0.0625;

temp=tt*10+0.5;

return temp;

}

void write_com(uchar com)//带个参数子函数,此段为写指令子函数

{

lcdrs=0;//rs=1的时候写数据,rs=0的时候写指令

P0=com;//送指令

delay(5);//在EN=1送高脉冲的时候要在指令和rs之后延时TSP1时间(液晶见芯片时序图)

lcden=1;//EN高脉冲,开始送数据

delay(5);//高电平持续TPW时间

lcden=0;//持续后拉低电平

}

void write_data(uchar date)//带个参数子函数,此段为写数据子函数

{

lcdrs=1;//rs=1的时候写数据,rs=0的时候写指令

P0=date;//送指令

delay(5);//在EN=1送高脉冲的时候要在指令和rs之后延时TSP1时间(液晶见芯片时序图)

lcden=1;//EN高脉冲,开始送数据

delay(5);//高电平持续TPW时间

lcden=0;//持续后拉低电平

}

void write_1602(uchar add,uchar dat)//将写指令,写数据两个子函数放在一个总的1602函数中,调用起来方便

{

write_com(0x80+0x40+add);//写指令,也就是写一个要写数据的地址,指明写数据的地址

write_data(dat);//写数据,写进去要写的东西

}

void init()//初始化函数

{

dula=0;

wela=0;

lcden=0;//因为EN高脉冲时才读写数据,所以初始化EN=0

write_com(0x38);

write_com(0x0c);//液晶初始化显示模式设置,调用子函数,写进去初始化指令码设置其功能

write_com(0x06);//写完一个字符后光标地址加1

write_com(0x80);//地址指针指向第一行第一个位置

write_com(0x01);//初始化清除屏幕

}

void display(uint temp) //显示程序

{

uchar A1,A2,A2t,A3;

A1=temp/100;

A2t=temp0;

A2=A2t/10;

A3=A2t;

write_1602(1,A1+0x30);

write_1602(2,A2+0x30);

write_1602(3,0x2e);

write_1602(4,A3+0x30);

write_1602(6,C);

}

void main()

{

uchar a;

init();

while(1)

{

tmpchange();

for(a=10;a>0;a--)

{

display(tmp());

}

if(temp>=310) //当温度超过31度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。

{

P1=0x00;

beep=0;

}

else

{

beep=1;

P1=0xff;

}

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top