#include "1602dr.c" ////2008/04/27
#include "0832dr.c"
#include "htos.c"
//#include "18B20Dr.c"
#include "intrins.h"
sbit k1=P0^4;
sbit k2=P0^3;
uchar tt=0,ttt=1; //读值暂存
uchar k=0;
bit chan=0; //通道选择位
sbit DQ=P2^0; //DS18B20数据接口
bit DS18B20; //18B20存在标志,1---存在 0---不存在
/*******************************延时函数*********************************/
void delay2(unsigned int delay_time)
{
for(;delay_time>0;delay_time--);
}
/****************************DS18B20写数据函数**********************
调用模块:_cror_() */
void DS18B20_write(uchar in_data) //写DS18B20的子程序(有具体的时序要求)
{
uchar i,out_data,k;
out_data=in_data;
for(i=1;i<9;i++) //串行发送数据
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=out_data&0x01;
if(k==0x01) //判断数据 写1
{
DQ=1;
}
else //写0
{
DQ=0;
}
delay2(4); //延时62us
DQ=1;
out_data=_cror_(out_data,1); //循环左移1位
}
}
/**************************DS18B20读函数**************************/
/*输出参数:读到的一字节内容
/******************************************************************/
uchar DS18B20_read()
{
uchar i,in_data,k;
in_data=0;
for(i=1;i<9;i++) //串行发送数据
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=DQ; //读DQ端
if(k==1) //读到的数据是1
{
in_data=in_data|0x01;
}
else
{
in_data=in_data|0x00;
}
delay2(3); //延时51us
DQ=1;
in_data=_cror_(in_data,1); //循环左移1位
}
return(in_data);
}
/**************************DS18B20初始化函数**************************/
void DS18B20_init(void)
{
uchar a;
DQ=1; //主机发出复位低脉冲
DQ=0;
delay2(44); //延时540US
DQ=1;
for(a=0;a<0x36&&DQ==1;a++)
a++;a--; //等待DS18B20回应
if(DQ)
DS18B20=0; //18B20不存在
else
{
DS18B20=1; // 18B20存在
// speaker=0;
delay2(120); //复位成功!延时240US
}
}
/****************************DS18B20读取温度函数**************************/
/*函数原型:void get_temper(void)
/*函数功能:DS18B20读取温度
/**********************************************************************/
uchar get_temper(void)
{
uchar k,T_sign,T_L,T_H;
uchar temp=0;
DS18B20_init(); //DS18B20初始化
if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
{
DS18B20_write(0xcc); // 跳过ROM匹配
DS18B20_write(0x44); //发出温度转换命令
DS18B20_init(); //DS18B20初始化
if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
{
DS18B20_write(0xcc); //跳过ROM匹配
DS18B20_write(0xbe); //发出读温度命令
T_L=DS18B20_read(); //数据读出
T_H=DS18B20_read();
k=T_H&0xf8;
if(k==0xf8)
T_sign=1; //温度是负数
else
T_sign=0; //温度是正数
T_H=T_H&0x07;
temp=(T_H*256+T_L)*0.0625; //温度转换常数
}
}
return temp;
}
void logo(void)
{
print(" Designed by Xiao_gui");
delayms(2);
print(" --Date-- 2008/04/27");
Writecmd(0x01);
}
uchar keyscan(void) //简单的扫描 2 个键函数,对应P0^4, P0^3 ,低电平有效,表示对应的键按下
{
uchar temp1=0,temp2=0;
uchar i=0;
temp1=(P0&0x18);
P0=0xff;
for(i=12;i>0;i--);//去抖,延时确认
temp2=(P0&0x18); //两次采值确认
if(temp1==temp2)
{
// while((P0&0x18)==0x18);//等待按键松开
switch(temp2) //返回值为对应键的键号 0,1,2
{
case 0x00:return 0;break; //表示两个键同时被按下
case 0x10:return 1;break; //k1被按下
case 0x08:return 2;break; //k2被按下
default:break;
}
}
}
void menu(void)
{
do
{
k=keyscan(); //取键值
switch(k)
{
case 0:
{
Writecmd(0x01);
line0(" k0<-->CH0");
line1(" k1<-->CH1");
delayms(5);
Writecmd(0x01);
chan=0; //默认取CH0通道
tab00("CH0:");
tab01("0000");
tab02(" mV ");
tab03(">on<");
tab10("CH1:");
tab11("0000");
tab12(" mV ");
goto loop;
}break;
case 1:
{
chan=0; //通道 0 被选中
tab03(">on<");
tab13(" ");
goto loop;
}break;
case 2:
{
chan=1; //通道 1 被选中
tab03(" ");
tab13(">on<");
goto loop;
}break;
default:goto loop;break;
}
}while(1);
loop:;
}
void main(void)
{
uchar i=0,a=0;
chan=0;
lcm_init();
logo();
Writecmd(0x01);
tab00("CH0:");
tab01("0000");
tab02(" mV ");
tab03(">on<");
tab10("CH1:");
tab11("0000");
tab12(" mV ");
delayms(5);
while(1)
{
menu();
get_temper();
tt=ReadADC(chan); //开始 A/D 转换
hex_to_str(tt); //开始由数值转换为字符串
if(chan==0)tab01(str);
if(chan==1)tab11(str);
delayms(2);
}
}