//1602 可以显示英文字符和数字,两行,每行可以显示16个字符,第一行地址为0X80~0X9F
//第二行地址为 0XC0~0XDF
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;//ds18b20与单片机连接口
sbit RS=P2^1;
sbit RW=P1^5;
sbit EN=P1^6;
sbit Add=P3^2;
sbit Sub=P3^3;
sbit Set=P3^4;
sbit Cut=P3^5;
sbit Beep=P1^2;
sbit H_LED=P3^0;
sbit L_LED=P3^1;
uchar t=0;
void key();
void wr_com(unsigned char com);//1602写指令
void wr_dat(unsigned char dat);//1602写数据
void lcd_init();//初始化设置//
void delay1ms(unsigned int ms);//延时1毫秒(不够精确的)
void puts(unsigned char *p);//显示//
void puts_xy(char x,char y,unsigned char *p);//在x 行 y 列 显示指定内容
void delay_18B20(unsigned int i);//延时1微秒
void disp_temp();//温度值显示
void ds1820rst();/*ds1820复位*/
uchar ds1820rd();/*读数据*/
void ds1820wr(uchar wdata);/*写数据*/
uint read_temp();/*读取温度值并转换*/
uchar data disdata[6];
uint tvalue;//温度值
uchar tflag;//温度正负标志
char cnt,state,run_state;
int low,high,old;
bit sec,flash_flag,key_mark;
void time0() interrupt 1
{
if(++cnt==7)
flash_flag=1;
if(cnt>15)
{
cnt=0;
sec=1;
}
}
void init_time0()
{
IE=0X82;
TMOD=0X01;
TR0=1;
}
/******************在x 行 y 列 显示指定内容*************************/
void puts_xy(char x,char y,unsigned char *p)
{
//x 取值 0,1 y 取值0~15 p指向的内容每次不能超过16个字符
if(x==0)
wr_com(0x80+y);
else
wr_com(0xc0+y);
puts(p);
}
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void wr_com(unsigned char com)//1602写指令//
{
delay1ms(1);
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(unsigned char dat)//1602写数据//
{ delay1ms(1);;
RS=1;
RW=0;
EN=0;
P0=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init()//初始化设置//
{
delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void puts(unsigned char *p)//显示//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
/******************************ds18B20程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
uint read_temp()/*读取温度值并转换*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void disp_temp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
wr_com(0x84);
wr_dat(flagdat);//显示符号位
wr_com(0x85);
wr_dat(disdata[0]);//显示百位
wr_com(0x86);
wr_dat(disdata[1]);//显示十位
wr_com(0x87);
wr_dat(disdata[2]);//显示个位
wr_com(0x88);
wr_dat(0x2e);//显示小数点
wr_com(0x89);
wr_dat(disdata[3]);//显示小数位
}
/********************主程序***********************************/
void disp_num(char x,char y,int tvalue)
{
disdata[0]=tvalue%1000/100+0x30;//十位数
disdata[1]=tvalue%100/10+0x30;//个位数
disdata[2]='.';
disdata[3]=tvalue%10+0x30;//小数位
disdata[4]='\0';
if(x==0)
wr_com(0x80+y);
else
wr_com(0xc0+y);
puts(disdata);
}
void key()
{
if(!Sub)
{
if(run_state==0)
{
if(++state>2)
state=0;
}
else if(run_state==1)
{
if(++state>5)
state=3;
}
}
else if(!Add)
{
if(state==0)
low+=100;
else if(state==1)
low+=10;
else if(state==2)
low++;
else if(state==3)
high+=100;
else if(state==4)
high+=10;
else if(state==5)
high++;
low%=1000;
high%=1000;
}
else if(!Cut)
{
if(state==0)
low-=100;
else if(state==1)
low-=10;
else if(state==2)
low--;
else if(state==3)
high-=100;
else if(state==4)
high-=10;
else if(state==5)
high--;
low%=1000;
high%=1000;
}
else if(!Set)
{
if(++run_state>3)
run_state=0;
if(run_state==0)
state=0;
else if(run_state==1)
state=3;
else if(run_state==2)
state=6;
}
}
void Alarm(uchar t)
{
uchar i,j;
for(i=0;i<200;i++)
{
Beep = ~Beep;
for(j=0;j<t;j++);
}
}
void main()
{
TMOD=18;
TH0=245;
TL0=0;
TH1=(65536-1000)/256;
TL1=(65536-1000)/256;
TR0=1;
H_LED=L_LED=1;
lcd_init();
puts_xy(0,0,"state:setting...");
puts_xy(1,0,"L:00.0 H:00.0");
init_time0();
while(1)
{
if((!Add || !Cut || !Sub || !Set) && !key_mark)
{
delay1ms(10);
if(!Add || !Cut || !Sub || !Set)
{
key_mark=1;
key();
}
}
else if(Add && Sub && Set && Cut)
key_mark=0;
if(sec)
{
sec=0;
if(state==6)
{
puts_xy(0,0,"run ");
read_temp();//读取温度
if(tvalue>high )
{
TR1=1;H_LED=!L_LED;
Alarm(90);
}
else
if(tvalue<low)
{
TR1=1;L_LED=!H_LED;
Alarm(90);
}
else{
TR1=0;H_LED=L_LED=1;
t=0;
}
disp_temp();//显示
}
disp_num(1,2,low);
disp_num(1,12,high);
}
if(flash_flag)
{
flash_flag=0;
if(state==0)
{
puts_xy(1,2," ");
}
else if(state==1)
{
puts_xy(1,3," ");
}
else if(state==2)
{
puts_xy(1,5," ");
}
else if(state==3)
{
puts_xy(1,12," ");
}
else if(state==4)
{
puts_xy(1,13," ");
}
else if(state==5)
{
puts_xy(1,15," ");
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
DS18B20按键调控范围报警系统.zip (18个子文件)
DS18B20按键调控范围报警系统
温度检测.plg 208B
STARTUP.OBJ 750B
ds1820.OBJ 20KB
ds1820.LST 18KB
温度检测 18KB
温度检测.Opt 1KB
STARTUP.A51 6KB
ds1820.c 8KB
Last Loaded ds1820.DBK 103KB
温度检测.hex 6KB
温度检测.Uv2 2KB
STARTUP.LST 10KB
温度检测.M51 25KB
ds1820.PWI 2KB
温度检测.lnp 47B
温度检测_Uv2.Bak 2KB
ds1820.DSN 103KB
温度检测_Opt.Bak 1KB
共 18 条
- 1
资源评论
zachary091
- 粉丝: 0
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功