- 首页
-
- 问答
-
-
-
-
-
-
-
-
727f2fa02853
这是我之前写的一个程序 希望能帮到你 有问题可以探讨下#include<reg52.h>#include<intrins.h>#define data P0#define uchar unsigned char#define uint unsigned intuchar TEMP;// 温度值的变量;uchar flag1;sbit RS=P2^0;sbit RW=P2^1;sbit LCDE=P2^2;sbit DQ=P2^3;sbit bflag=ACC^7;uchar tab1[]={'0','1','2','3','4','5','6','7','8','9'};uchar idata tab2[2][16]={{"Be careful "},{"temperature: "}};uchar buf[2];void delay1(uchar i){while(--i);}void delay3 (unsigned int count){unsigned int i;while (count){i =200;while (i>0) i--;count--; }}void tmreset (void)// 发送复位和初始化{unsigned int i;DQ = 0;i = 103;while (i>0) i--; // 延时DQ = 1;i = 4;while (i>0) i--;}bit tmpread (void)// 读取数据的一位{ unsigned int i;bit dat;DQ = 0; i++;DQ = 1; i++; i++;//延时dat =DQ;i = 8; while (i>0) i--;// 延时return (dat);}unsigned char tmpread2 (void)//读一个字节{unsigned char i,j,dat;dat = 0;for (i=1;i<=8;i++){j = tmpread ();dat = (j << 7) | (dat >> 1);}return (dat);}void tmpwrite (unsigned char dat)//写一个字节{ unsigned int i;unsigned char j;bit testb;for (j=1;j<=8;j++){testb = dat & 0x01;dat = dat >> 1;if (testb){DQ = 0;// 写0 i++; i++; DQ = 1;i = 8; while (i>0) i--; }else{DQ = 0;// 写0 i = 8; while (i>0) i--; DQ = 1;i++; i++; }}}void tmpchange(void)// ds1820 开始转换{ tmreset ();// 复位//tmpre ();// 等待存在脉冲delay3 (1);// 延时tmpwrite (0xcc);// 跳过序列号命令tmpwrite (0x44);// 发转换命令 44H,}uchar tmp (void)// 读取温度{ unsigned int a,b,t;tmreset ();// 复位delay3 (1);// 延时tmpwrite (0xcc);// 跳过序列号命令tmpwrite (0xbe);a=tmpread2();b=tmpread2();// 发送读取命令b<<=4; b+=(a&0xf0)>>4; t=b;return(t);/*buf[0] = tmpread2 ();// 读取低位温度buf[1] = tmpread2 (); //读取高位温度flag1=buf[1]&0xf8;//若b为1则为负温if(flag1){buf[0]=~buf[0];buf[1]=~buf[1];//如果为负温则去除其补码}buf[0]=(buf[0]>>4);buf[0]=(buf[0]&0x0f);buf[1]=buf[1]<<4;buf[1]=buf[1]&0xf0;TEMP=(buf[0]|buf[1]);if(flag1){TEMP++;}buf[0]=TEMP%10;buf[1]=TEMP/10;*/}rom()// 读取器件序列号子程序{tmreset ();//复位delay3 (1);//延时tmpwrite(0x33);//发送读序列号子程序} busy_check() //忙检查询{ register uchar lcd_start;RS=0;RW=1;LCDE=1;delay1(30);lcd_start=data;LCDE=0;return(lcd_start&0x80);}wr_com(uchar comm) //写控制字命令{ while(busy_check());RS=0;RW=0;LCDE=1;data=comm;LCDE=0;} wr_dat(uchar dat) //写字符到LCD{while(busy_check());RS=1;RW=0;LCDE=1;data=dat;LCDE=0; }void init()//led 初始化{wr_com(0x38); //设置显示模式:8位子行5×7点阵wr_com(0x80); //关闭显示屏wr_com(0x0c); //显示器开、光标开、光标允许闪烁wr_com(0x06); //文字不动,光标自动右移wr_com(0x01);//清屏光标复位}void display1()//温度显示函数{uchar j,k;wr_com(0x80);for(j=0;j<16;j++){wr_dat(tab2[0][j]);}wr_com(0xc0);for(k=0;k<16;k++){wr_dat(tab2[1][k]);}}void main(){uchar temp;delay1(10);init();while(1){tmpchange();// 开始温度转temp=tmp();tab2[1][14]=tab1[temp/10];//读取温度tab2[1][15]=tab1[temp%10];/*tab2[1][14]=tab1[buf[1]];tab2[1][15]=tab1[buf[0]]; */display1();}}
-
-
求购