当前位置:首页 > 万年历课程设计报告
{
DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期
DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 dat>>=1;
_nop_(); //等待一个机器周期
DQ = 1; //将数据线\人为\拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++)
; //延时约6us,使主机在15us内采样 if(DQ==1)
dat|=0x80; //如果读到的数据是1,则将1存入dat else
dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time=0;time<8;time++)
; //延时3us,两个读时序之间必须有大于1us的恢复期 }
return(dat); //返回读出的十进制数据 }
/***************************************************** 函数功能:向DS18B20写入一个字节数据 入口参数:dat
***************************************************/ void WriteOneChar(uchar dat) {
uchar i=0;
for (i=0; i<8; i++) {
DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期
DQ=0; //将数据线从高拉低时即启动写时序 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1; //释放数据线 for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; //将dat中的各二进制位数据右移1位 }
for(time=0;time<4;time++)
; //稍作延时,给硬件一点反应时间 }
25
/***************************************************** 函数功能:显示没有检测到DS18B20
***************************************************/ void display_error(void) {
uchar i;
WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示 i = 0; //从第一个字符开始显示
while(Error[i] != '\\0') //只要没有写到结束标志,就继续写 {
WriteData(Error[i]); //将字符常量写入LCD i++; //指向下一个字符
delaynms(100); //延时100ms较长时间,以看清关于显示的说明 }
while(1) //进入死循环,等待查明原因 ; }
/***************************************************** 函数功能:显示温度的小数点
***************************************************/ void display_dot(void) {
WriteAddress(0x80+0x40+0x03); //写显示地址,将在第2行第10列开始显示
WriteData('.'); //将小数点的字符常量写入LCD
delaynms(50); //延时1ms给硬件一点反应时间 }
/***************************************************** 函数功能:显示温度的单位(Cent)
***************************************************/ void display_cent(void) {
WriteAddress(0x80+0x40+0x05); //写显示地址,将在第2行第13列开始显示
WriteData(0xdf);
WriteAddress(0x80+0x40+0x06); WriteData('C'); }
/***************************************************** 函数功能:显示温度的整数部分 入口参数:x
***************************************************/ void display_temp1(unsigned char x) {
26
uchar j,k,l; //j,k,l分别储存温度的百位、十位和个位 j=x/100; //取百位 k=(x0)/10; //取十位
l=x; //取个位
WriteAddress(0x80+0x40); //写显示地址,将在第2行第7列开始显示 WriteData(digit[j]); //将百位数字的字符常量写入LCD WriteData(digit[k]); //将十位数字的字符常量写入LCD WriteData(digit[l]); //将个位数字的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间 }
/***************************************************** 函数功能:显示温度的小数数部分 入口参数:x
***************************************************/ void display_temp2(uchar x) {
WriteAddress(0x80+0x40+0x04); //写显示地址,将在第2行第11列开始显示 WriteData(digit[x]); //将小数部分的第一位数字字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间 }
/***************************************************** 函数功能:做好读温度的准备
***************************************************/ void ReadyReadTemp(void) {
Init_DS18B20(); //将DS18B20初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 for(time=0;time<100;time++)
; //温度转换需要一点时间 Init_DS18B20(); //将DS18B20初始化 WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位 }
/******************************************* 向1302写一个字节
*******************************************/ void input_BYTE(uchar dat) {
uchar i; ACC=dat;
for(i=8;i>0;i--) {
27
T_IO=ACC0; T_CLK=1; T_CLK=0;
ACC=(ACC>>1); } }
/******************************************* 1302读出一个字节
*******************************************/ uchar output_BYTE() {
uchar i;
for(i=8;i>0;i--) {
ACC=(ACC>>1); ACC7=T_IO; T_CLK=1; T_CLK=0; }
return (ACC); }
/******************************************* 写数据
*******************************************/ void write_1302(uchar add,uchar dat) {
T_RST=0; T_CLK=0; T_RST=1;
input_BYTE(add); input_BYTE(dat); T_CLK=1; T_RST=0; }
/******************************************* 读数据
*******************************************/ uchar read_1302(uchar add) {
uchar inf; T_RST=0; T_CLK=0; T_RST=1;
input_BYTE(add);
28
共分享92篇相关文档