⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1820.c

📁 51单片机控制18B20传感器
💻 C
字号:
#pragma   SMALL  //   LARGE
#include <absacc.h>
#include <string.h>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
        #define C_ad 5
/*----------------------------------------*/
/*温度值 二进制数据输出 16进制输出
+125℃ 0000011111010000 07D0H
+85℃ 0000010101010000 0550H*
+25.0625℃ 0000000110010001 0191H
+10.125℃ 0000000010100010 00A2H
+0.5℃ 0000000000001000 0008H
0℃ 0000000000000000 0000H
-0.5℃     11111111111111000 FFF8H
-10.125℃  1111111101011110 FF5EH
-25.0625℃ 1111111001101111 FE6FH
-55℃      1111110010010000 FC90H*/
/*----7219----*/
sbit load=P1^1;
sbit clk=P1^2;
sbit din=P1^0;
/* ------------lcd-------*/
#define clear   0x01  //清屏幕,约1.6ms
#define home    0x02   //光标回零(左上角)/
#define f_set   0x30  //并行、基本指令     ?????
#define dis_on  0x0f  //打开显示,光标,闪烁功能
#define in_mode 0x06  //输入方式,地址增1,光标右移
#define C_ad 5
sbit P_RS=P0^7;
sbit P_RW=P0^6;
sbit P_E= P0^5;
/*----5045----*/
sbit  acc=0xe0;
sbit  cy=0xd7;
//sbit  load2=P3^1;
sbit  x25_cs=P1^4;     //5045 1pin
//sbit  dout25=P1^4;
sbit  x25_clk=P1^6;    // 5045 6pin
sbit  x25_din=P1^7;       //5045 5pin    //5045 3pin 接vcc  ,4pin 接 gnd  ,7pin 接 reset ,8pin 接 vcc
sbit  dout=P1^5;        //5045 2pin
/*-----------------*/
data union{

	uchar tp[2];
	uint temp;
	}tt;
//uchar temp[2];
bit f_exit;

bit flag_sign;
sbit Inda=P3^1; //Inda=P1^7;        //数据转换中间变量
bdata uchar ab,bc;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
data uchar str2[6];
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void bit8_serial_input(uchar ix)
{
data uchar i,j,nc;
P_E=0;    //clk=0;   P_E为sclk P_RW为 sid
ab=ix;
for(i=0;i<8;i++){
	P_RW=abit7;    //din=abit7;
	ab<<=1;
	P_E=1;
	for(j=0;j<10;j++)nc=0;  //延时
	P_E=0;
	}
}


void instruct(uchar dat)
{
data uchar ch;
P_RS=1;   //选通
ch=0xf8;       ///1111 1110 按照时序前五位必须为1 六七位任意 八位为0
bit8_serial_input(ch);     //sid前八位
ch=dat&0xf0;     //连接dat与0xf0  取higher data
bit8_serial_input(ch);
ch=dat<<4;    //左移动4位  取lower data
bit8_serial_input(ch);         //80送到液晶里表示什么意义 instruct中无此命令
P_RS=0;  //结束作业        1 byte发完
}


void write_abyte(uchar dat)
{
data uchar ch;
P_RS=1;  //读数据--选通    选通
ch=0xfa;  //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat&0xf0;  //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0;  //结束作业
}


/*
   写一个汉字到x,Y坐标处其中X为8列y为4行
   */
void  write_word(uint w)  //w为双字节变量
{
data  uchar ch,cl;
ch=w>>8;
cl=w;     //w右移8位给ch 那cl直接取 w 低8位
write_abyte(ch);
write_abyte(cl);
}



dis_hz(uchar x, uchar y, uint *p_hz)     //单个汉字、字符显示、两个字母
{
data uchar loc;
data uint hz;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home); //光标home
loc=((x<<3)+y-9)|0x80;  //??"|"
instruct(loc); hz=*p_hz;     //loc 不同导致开始显示层数不同?????
write_word(hz);
}



dis_hz_str(uchar x, uchar y, uint *p_hz)     //功能 汉字字符串显示
{
data uchar loc;
data uint *p;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home);
loc=((x<<3)+y-9)|0x80;
instruct(loc);
p=p_hz;
while(*p){
     write_word(*p++);
     }
}



/*
显示字母数字在x,y处
*/
void dis_str(uchar x, uchar y, uchar *str)           //  多个数字字母 显示
{
data uchar loc,*p;
code uchar xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
instruct(home);
loc=(16*(x-1)+y-1);    //loc=16*(1-1)+10-1=9 如何
if(loc&0x01){
       loc/=2;
       instruct(loc|0x80);
       //ch=' ';   //字符串前加空格(0x20 )
       write_abyte(' ');
       }else{
       loc/=2;
       instruct(loc|0x80);
       }
while(*p){
       write_abyte(*p++);      //str为字符串  p为字符串写的时候一个一个字写
       }
}




void initial(void)                          //光标置左上角
{
data uchar i,j;
P0=0xff;
P_RS=0;           //串行--不选通
//P_PSB=0;
P_E=0;   //串行方式
instruct(f_set);    //0x30;     //8位并行接口 基本指令 用串行方式 这句是不是没用
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}           //等待液晶屏反应
for(i=0;i<250;i++){}
instruct(f_set);    //0x30;     //8位并行接口 基本指令
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(dis_on);     //0x0f);     //开启屏幕 光标 闪烁
for(i=0;i<30;i++){}        //维持高电平 等待液晶反应
instruct(clear);     //0x01);     //清屏幕 clear
for(j=0;j<10;j++){
   for(i=0;i<250;i++){}      //1.6ms
   }
instruct(in_mode);     //0x06);    //光标右移、地址增1 方式  液晶屏接受信息的形式
for(i=0;i<30;i++){}
instruct(home);     //光标复位(行首)
}
/*---------------------------------------------------------*/
//void itoa(int x,unsigned char *str2)
void itoa(int x)
{                                                    //功能   二进制转为ascii码
data unsigned int n;
data unsigned char chn,*p,*p2,str1[5];
data unsigned char i,j;
p2=str2;
if(x<0){
	*p2++='-';
	x=-x;
	}
n=x;
p=&str1;
j=0;
while(n!=0){
	chn=n%10;
	n=n/10;
	*p++=chn+'0';
	j++;
	}
if(j!=0){
	p--;
	for(i=0;i<j;i++)*p2++=*p--;
	}
else    *p2++='0';
*p2=0;
return;
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/

void rst_wdog(void)
{
x25_cs=0;
x25_cs=1;
}
/*----------------------------------------*/
void delay10(uchar j)    /*  time=j*10+7  */
{
uchar ch;
    while(j--)
    {
    ch++; ch++;
    }
    /*
    _nop_();
     _nop_();};
     */
}
/*---------------------------------------*/
uchar inti(void)
{
data uchar i=3;
do{                 //连续检测4次,看是否存在温度传感器
    Inda=0;
    delay10(50);     //发511us复位脉冲
    Inda=1;          //等待应答脉冲
    delay10(6);
    if (!Inda)      //存在应答脉冲返回1
         return(1);
    delay10(250);
    }
while(i--);
return(0); //4次检测失败返回无传感器
}
/*----------------------------------------*/
void  Outwrite(uchar str)
{
data uchar i;
ab=str;
for(i=0;i<8;i++){
    Inda=0;
    delay10(1);
    Inda=abit0;
    ab>>=1;
    delay10(4);
    Inda=1;
    _nop_();
    _nop_();
    }
}
/*----------------------------------------*/
void Outread(void)  /*读失败时 str=[0xff,0xff]*/
{
data uchar i,j;
for (i=0;i<2;i++){
    for(j=0;j<8;j++){
        ab>>=1;
        Inda=1;
        _nop_();
        _nop_();
        Inda=0;
        _nop_();
        _nop_();
        Inda=1;
        delay10(1);
        abit7=Inda;
        }
    tt.tp[1-i]=ab;
    //temp[i]=ab;
    }
}
/*----------------------------------------*/
void Wroutds()
{
  f_exit=inti();
  if(f_exit)
  {
    delay10(250);
    delay10(250);
    Outwrite(0xcc); //省去与ROM的有关操作
    Outwrite(0x44); //启动温度传感器
  }
}
/*----------------------------------------*/
uchar Rdoutds(void)
{
f_exit=inti();
if(f_exit){
    delay10(250);
    delay10(250);
    Outwrite(0xcc);
    Outwrite(0xbe);
    Outread();
    }
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void delay(uchar n)
{
data uchar i,j,k,ch;
for(i=0;i<n;i++){
	for(j=0;j<250;j++){
		for(k=0;k<25;k++){
			rst_wdog();
			}
		}
	}
}
/*---------------------------------------------------------*/
/*void dis_7219(uchar iw,uchar ix,uchar chl,uchar chh)
{
uchar i,j,nc;
clk=0;
load=0;
for(j=0;j<5;j++)nc=0;
ab=iw;
for(i=0;i<8;i++){
	din=abit7;
	ab<<=1;
		//abit0=dout;    dout;
	clk=1;
	for(j=0;j<5;j++)nc=0;
	clk=0; for(j=0;j<5;j++)nc=0;

	}
ab=ix;
for(i=0;i<8;i++){
	din=abit7;
	ab<<=1;
	        //abit0=dout;
	clk=1;
	for(j=0;j<5;j++)nc=0;
	clk=0; for(j=0;j<5;j++)nc=0;

	}
ab=chl;
for(i=0;i<8;i++){
	din=abit7;
	ab<<=1;
		//abit0=dout;    dout;
	clk=1;
	for(j=0;j<5;j++)nc=0;
	clk=0;    for(j=0;j<5;j++)nc=0;

	}
ab=chh;
for(i=0;i<8;i++){
	din=abit7;
	ab<<=1;
	        //abit0=dout;
	clk=1;
	for(j=0;j<5;j++)nc=0;
	clk=0;  for(j=0;j<5;j++)nc=0;

	}

load=1;
}
/*---------------------------------------------------------*/
/*void itoa(int x,unsigned char *str)
{
unsigned int n;
unsigned char chn,*p,str1[5];
data unsigned char i,j;
if(x<0){
	*str++='-';
	x=-x;
	}
n=x;
p=str1;
j=0;
while(n!=0){
	chn=n%10;
	n=n/10;
	*p++=chn+'0';
	j++;
	}
if(j!=0){
	p--;
	for(i=0;i<j;i++)*str++=*p--;
	}
else    *str++='0';
*str=0;
return;
}
/*---------------------------------------------------------*/

/*---------------------------------------------------------*/
/*---------------------------------------------------------*/


/*void dis_7219(uchar iw,uchar ix)                  /*串性数据发送*/
/*{
uchar i,j,nc;
clk=1;
for(j=0;j<10;j++)nc=0;
load=1;
iw=~iw; //~????????????
ab=iw;
for(i=0;i<8;i++){
	din=abit7;
	ab<<=1;
	clk=0;
	for(j=0;j<10;j++)nc=0;
	clk=1;
	}
ix=~ix;
ab=ix;
for(i=0;i<8;i++){
	din=abit7;
	ab<<=1;
	clk=0;
	for(j=0;j<10;j++)nc=0;
	clk=1;
	}
load=0;
}
/*---------------------------------------*/
/*void dis_set(void)
{
data uchar i,j,nc;
	dis_7219(0x0f,0x0); /*不测试*/
	//dis_7219(0x0a,0x04);/*亮度选择*/
	//dis_7219(0x09,0x0f);/*译码选择*/
	//dis_7219(0x0b,0x07);/*扫描LED的个数*/
	//dis_7219(0x0c,0x01);/*启动*/
	//for(i=1;i<5;i++)dis_7219(i,0x0f);
        //for(i=5;i<9;i++)dis_7219(i,0x00);
//}     */
/*----------------------------------------*/
void dis_play(void)
{
uchar qw,sw,gw,y,i;
data long  int xx,bw;
code uint *me={"室内温度是:"};
code uint *lme={"the indoor tempe"} ;
code uint *llme={"rature is : "} ;
data uint str1[10];
code uint *str3={"."};
uint aa;
if(flag_sign)xx=~xx+1;
xx=85*tt.temp;
xx=xx/136;
aa=xx;
//if((!flag_sign)&&(aa>700)|(flag_sign)&&(aa<150))
//i=0;
   // dis_7219(6,0xff);// dis_7219(6,0x4);
//else  i=0; //dis_7219(6,0xff);//dis_7219(6,0x40);
qw=xx/1000;
bw=xx/100;
sw=xx/10%10;
gw=xx%10;
//if(flag_sign){
   // dis_7219(1,0x0a);
  //  flag_sign=0;
    //}
//else //dis_7219(1,0xff,0,0);
     P_RS=0;
     initial();
  //    delay10(250)  ;
      dis_str(1,1,lme);
      delay10(250);
      dis_str(2,1,llme);
      delay10(250);
      delay10(250);
      strcpy(str1,me);
     dis_hz_str(3,1,str1);

      //  delay(250);
      // dis_hz_str(4,1,"美");
      // delay(250);
      bw=bw*100;
      sw=sw*10;
      bw=bw+sw+gw;
        itoa(bw);  //bw
         str2[3]=str2[2]; str2[2]='.'; str2[4]=0;
      //str1[0]=bw;
       dis_str(4,1,str2);
       dis_hz(4,3,"℃");
        //delay(250);
          //itoa(gw);
         //str3[0]="." ;str3[1]=str2;
         //strcat(str3,str2);
        // dis_str(4,3,str2);
          //itoa(gw);
          //dis_str(4,5,str2);
      // itoa(sw); //sw);
      // dis_str(4,3,str2);
      //dis_str(4,3,".");
        //itoa(gw);
       //dis_str(4,4,str2);
       //delay(250);               // dis_7219(2,bw,0,0);
    // for (i=0;i<10;i++) { delay10(250)  ;
                        //  dis_7219(3,0xff,0,0);
      //                    for(y=0;y<0xff;y++){}
        //                   }


  //  dis_7219(3,sw|0x10,0,0);//第二位 和小数点(0x10)
/*    for (i=0;i<10;i++) { delay10(250)  ;
                         // dis_7219(4,0xff,0,0);
                          for(y=0;y<0xff;y++){}
                           }
  //  dis_7219(3,0x80,0,0);
    for (i=0;i<10;i++) { delay10(250)  ;
                       //   dis_7219(4,0xff,0,0);
                          for(y=0;y<0xff;y++){}
                           }
   //  dis_7219(4,gw,0,0);

          */
           i=0;
}
/*----------------------------------------*/
void main(void)
{
uchar ch,n,m,i,y;
flag_sign=0;

//temp[0]=0;
//temp[1]=0;
//dis_set();   //初始化7219
for(;;){
    f_exit=inti();       /*初始化  检测1820是否存在*/
    if(f_exit){
        Wroutds();   //省去ROM操作,启动温度转换
        for(n=0;n<100;n++){        //  延时等待温度转换完成
            for(m=0;m<10;m++){
                delay10(250);
                }
          rst_wdog();
            }
        Rdoutds();
        if((0x7f|tt.tp[0])==0xff)
        flag_sign=1;
      /*         for (i=0;i<10;i++) {
                          dis_7219(i,0xff,0,0);
                          for(y=0;y<0xff;y++){}
                           }

      /*----------------------------------------*/
        dis_play();
       /* ch=9;
        }
  //  else {
    //    dis_7219(1,2);
      //  dis_7219(2,0x0f);
       // dis_7219(3,0x0f);
        //dis_7219(4,0x0f);
      //  }     */
    rst_wdog();
   }
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -