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

📄 主机.c

📁 利用AD7705与热敏电阻来检测实际的温度
💻 C
📖 第 1 页 / 共 5 页
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
data union {float word;struct {uchar hand;uchar ten;uchar several;uchar point;}byte;}union_variary;
//data union {long word;struct {uchar hand;uchar ten;uchar several;uchar point;}byte;}variary;
uchar data m=0,n=0;//分别记录按键的行和列值
uchar code tab[4][4]={{0xee,0xed,0xeb,0xe7},{0xde,0xdd,0xdb,0xd7},{0xbe,0xbd,0xbb,0xb7},{0x7e,0x7d,0x7b,0x77}};//0到15个键值
uchar code www[]={"按键提示"};
uchar code aa[]={"滚屏请按"};//1
uchar code bb[]={"显示时间按"};//2
uchar code cc[]={"修改时间按"};//3
uchar code dd[]={"温度上限按"};//4
uchar code ee[]={"温度下限按"};//5
uchar code ff[]={"显示温度请按"};
//uchar code gg[]={"取二号温度按"};//7
uchar code hh[]={"设置上限按"};//8
uchar code ii[]={"设置下限按"};//9
uchar code jj[]={"温度校准按"};//10
uchar code kk[]={"当前时间为"};
uchar code ll[]={"温度上限为"};
uchar code mm[]={"温度下限为"};
uchar code nn[]={"放弃请按"};
uchar code oo[]={"确定请按"};
uchar code pp[]={"并按一或二确认"};
uchar code qq[]={"当前温度为"};
//uchar code rr[]={"二号温度为"};
uchar code ss[]={"送满度误差按"};
uchar code tt[]={"送零点误差按"};
uchar code uu[]={"子机一校准成功"};
uchar code vv[]={"子机二校准成功"};
uchar code ww[]={"送误差按"};
uchar code ww1[]={"按一送零点误差"};
uchar code ww2[]={"按二送满度误差"};
uchar code ww3[]={"读误差按"};
uchar code ww4[]={"确定地址按"};
uchar code www1[]={"进行编号"};
uchar code w1[]={"成功"};
uchar code xml[]={2,1,0,3,4,5,6};//写1302命令表
uchar code dml[]={0,1,2,3,4,5,6};//读1302命令表
uchar idata time[6]={0,0,0,0,0,0};
uchar idata Timee[6]={0,0,0,0,0,0};//存放时间
uchar idata uplim1[6]={0,0,0,0,0,0},uplim2[6]={0,0,0,0,0,0};//存放温度上限
uchar idata downlim1[6]={0,0,0,0,0,0},downlim2[6]={0,0,0,0,0,0};//存放温度下限
uchar idata  lim[8]={0,0,0,0,0,0,0,0};
uchar idata firstT[4]={0,0,0,0};//存放一号温度
uchar idata secondT[4]={0,0,0,0};//存放二号温度
uchar idata buff[9]={0,0,0,0,0,0,0,0,0};//接收缓冲区
uchar idata sendbuf[9]={0,0,0,0,0,0,0,0,0};//发送缓冲区
uchar idata error[9]={0,0,0,0,0,0,0,0,0};//存误差
idata uint i=0,f=0,j1=0;
idata unsigned long j=0;
idata uchar overtime=0;//超时标志
uchar data k=3;//上移计数器
uchar data unmber=0;//控制显示的子机温度
uchar data num=0;//子机地址号
uchar data times=0;//校准次数
uchar data uplim[4]={0,0,0,0};
uchar data downlim[4]={0,0,0,0};
uchar data * limm;
uint data word=0;
sbit req=P2^6;
sbit busy=P2^7;
sbit rest=P2^5;
sbit sclk=P3^2;//ds1302时钟线
sbit trx=P2^1;
sbit IO=P3^3;
sbit Rst=P3^4;
//////////////////////////////////////
send_byte(unsigned char xx)//向液晶写数据
{
  while(busy==1);
  P1=xx;
  req=1;
  while(busy==0);
  req=0;
}
//显示1个汉字,需要一个全局变量(1个汉字)支持
dis_word(unsigned char x,unsigned char y,unsigned char command)//液晶显示
{
unsigned char data i;
if(command==0xf0)//显示汉字
{
i=command;
send_byte(i);
send_byte(x);
send_byte(y);
i=word/256;
send_byte(i);
i=word%256;
send_byte(i);
}

if(command==0xf9) //显示字符
{
 i=command;
 send_byte(i);
 send_byte(x);
 send_byte(y);
 i=word;
 send_byte(i);
}

if(command==0xf4||command==0xf5) //清屏或者上移
{
 i=command;
 send_byte(i);
}
}
void send()
{
   unsigned char data i;
   trx=1;                                               //485发 送允许
   TI=0;
   for(i=0;i<9;i++)
    {
      SBUF=sendbuf[i];
      while(TI==0)
       {}
      TI=0;
    }
   for(i=0;i<30;i++)
     {}
   trx=0;
  for(i=0;i<255;i++)
     {}
  RI=0;
}
/****************************************************************************************
*****************************************BCD码转换到ASC码********************************
****************************************************************************************/
void bcdtoasc(unsigned char *lvalue)
 {
   m=*lvalue=((*lvalue)&0x0f)+10*( ((*lvalue)&0xf0)>>4);
 }
/****************************************************************************************
*****************************************ASC码转换到BCD码********************************
****************************************************************************************/
void asctobcd(unsigned char *lvalue)
  {
    *lvalue=(((*lvalue)/10)<<4)|(((*lvalue)%10)&0x0f);
  }
/******************************************************************************************
*************************************对于1302的读和写函数**********************************
******************************************************************************************/
void write_byte(unsigned char te)  //往ds1302 写入一个字节
{
unsigned char i;
//T_RST=1;
for(i=0;i<8;i++)
{
    IO=te&0x01;                  //取最后一位
    sclk=1;                       //模拟脉冲
    sclk=0;
    te= te>>1;                     //右移一位
}
}
unsigned char read_byte()        //从ds1302 读出一个字节
{
 unsigned char data i,j,k;
  IO=1;
  j=0;
  for(i=0;i<8;i++)
  {
    j=j>>1;                        //左移一
    k=IO;                        //传送数据
    k=k<<7;                        //接受位右移
    j=j|k;
    sclk=1;                       //模拟脉冲
    sclk=0;
  }
  return j;
}

void write_word(unsigned char add,unsigned char word,unsigned char flag)   //写1302先写命令再写数据
{
    sclk=0;
    Rst=0;                       //时钟初始化
   Rst=1;
    add=add<<1;
    add=add|0x80;
    if(flag==1)
      {
       add=add|0x40;
      }
    write_byte(add);              //写入命令
    write_byte(word);             //写入数据
    Rst=0;                      //清时钟
    sclk=0;
}
unsigned char read_word(unsigned char addr,unsigned char flag)  //读1302先写命令再读数据
{
unsigned char data i;
 sclk=0;
 Rst=0;                         //时钟初始化
 Rst=1;
    addr=addr<<1;
    addr=addr|0x81;
    if(flag==1)
      {
       addr=addr|0x40;
      }

 write_byte(addr);               //写入命令
 i=read_byte();                //读出数据
 Rst=0;
 sclk=0;
 return i;
}

void xsz1302()
{
   uchar data a,b,i;
   uchar code * data e;
   uchar  data *c;                  //反复调用函数将数据写完
   for(i=0;i<3;i++)
     {
        e=xml+i;
        a=*e;
        c=time+i;
        asctobcd(c);
        time[i]=*c;
        b=time[i];
        write_word(a,b,0);
        //bcdtoasc(c);
        //time[i]=*c;
     }
}
/******************************************************************************************
*************************************从1302读出时钟数据************************************
******************************************************************************************/
kaiguan(uchar a)
{

   switch(a)
   {
     case 0:
          Timee[f]=48;
          break;
     case 1:
         Timee[f]=49;
          break;
     case 2:
          Timee[f]=50;
          break;
     case 3:
          Timee[f]=51;
          break;
     case 4:
          Timee[f]=52;
          break;
     case 5:
          Timee[f]=53;
          break;
     case 6:
          Timee[f]=54;
          break;
     case 7:
          Timee[f]=55;
          break;
     case 8:
          Timee[f]=56;
          break;
     case 9:
          Timee[f]=57;
          break;
    }
    f++;
  if(f==6)
  {
    f=0;
    send_byte(0xf4);
    for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(kk[i]-0xa0)+kk[i+1]-0xa0;
     dis_word(j+3,0,0xf0);
    }
    word=Timee[5];
    dis_word(0x06,15,0xf9);
    word=Timee[4];
    dis_word(0x07,15,0xf9);
    word=':';
    dis_word(0x08,15,0xf9);
    word=Timee[3];
    dis_word(0x09,15,0xf9);
    word=Timee[2];
    dis_word(0x0a,15,0xf9);
    word=':';
    dis_word(0x0b,15,0xf9);
    word=Timee[1];
    dis_word(0x0c,15,0xf9);
    word=Timee[0];
    dis_word(0x0d,15,0xf9);
  }
}
void dsz1302()
{
  uchar data i,a,c;                  //反复调用函数将数据读完
  uchar data *b;
  uchar code * data e;
  for(i=0;i<7;i++)
     {
        e=dml+i;
        a=*e;
        b=time+i;
        c=read_word(a,0);
        b=&c;
        bcdtoasc(b);
        time[i]=*b;
     }
     kaiguan(time[0]%10);
     kaiguan(time[0]/10);
     kaiguan(time[1]%10);
     kaiguan(time[1]/10);
     kaiguan(time[2]%10);
     kaiguan(time[2]/10);
}
///////////////////////////////////////////////
void delay(unsigned char wai,unsigned char nei)
{ unsigned char i;
  unsigned char j;
  for(i=0;i<wai;i++)
     for(j=0;j<nei;j++);
}
////////////////////////////
bit pkey()//去抖动
{

 P0=0xf0;
 if(P0!=0xf0)
   {
     delay(5,250);
     if(P0!=0xf0)
     return 1;
     else
     return 0;
    }
 else
      return 0;
}

retur()
{
  for(i=0,j=0;i<7;i=i+2,j++)
  {
  word=256*(www[i]-0xa0)+www[i+1]-0xa0;
  dis_word(j+4,0,0xf0);
  }
//////////////////
  for(i=0,j=0;i<7;i=i+2,j++)
  {
   word=256*(aa[i]-0xa0)+aa[i+1]-0xa0;
   dis_word(j+3,1,0xf0);
  }
 word='1';
 dis_word(0x11,16,0xf9);
/////////////
 for(i=0,j=0;i<9;i=i+2,j++)
  {
   word=256*(bb[i]-0xa0)+bb[i+1]-0xa0;
   dis_word(j+3,2,0xf0);
  }
  word='2';
 dis_word(0x11,33,0xf9);
///////////////
 for(i=0,j=0;i<9;i=i+2,j++)
  {
   word=256*(cc[i]-0xa0)+cc[i+1]-0xa0;
   dis_word(j+3,3,0xf0);
  }
  word='3';
 dis_word(0x11,50,0xf9);
}
void Up()//上移
{
    if(k==19)
      k=0;
    else
      k++;
    for(i=0;i<16;i++)
    {
     send_byte(0xf5);
    }
   if(k==0)
   {
    for(i=0,j=0;i<7;i=i+2,j++)
    {
     word=256*(www[i]-0xa0)+www[i+1]-0xa0;
     dis_word(j+4,3,0xf0);
    }
   }
   if(k==1)
   {
     for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(aa[i]-0xa0)+aa[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='1';
    dis_word(0x11,50,0xf9);
   }
   if(k==2)
   {
    for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(bb[i]-0xa0)+bb[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='2';
    dis_word(0x11,50,0xf9);
   }
   if(k==3)
   {
    for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(cc[i]-0xa0)+cc[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='3';
    dis_word(0x11,50,0xf9);
  }
   if(k==4)
   {
     for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(dd[i]-0xa0)+dd[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='4';
    dis_word(0x11,50,0xf9);
   }
   if(k==5)
   {
    for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(ee[i]-0xa0)+ee[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='5';
    dis_word(0x11,50,0xf9);
   }
   if(k==6)
   {
    for(i=0,j=0;i<11;i=i+2,j++)
    {
     word=256*(ff[i]-0xa0)+ff[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='6';
    dis_word(0x13,50,0xf9);
   }
   /*if(k==7)
   {
     for(i=0,j=0;i<11;i=i+2,j++)
    {
     word=256*(gg[i]-0xa0)+gg[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='7';
    dis_word(0x13,50,0xf9);
   }*/
   if(k==7)
   {
    for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(hh[i]-0xa0)+hh[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='7';
    dis_word(0x11,50,0xf9);
   }
   if(k==8)
   {
    for(i=0,j=0;i<13;i=i+2,j++)
    {
     word=256*(pp[i]-0xa0)+pp[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
   }
   if(k==9)
   {
    for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(ii[i]-0xa0)+ii[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='8';
    dis_word(0x11,50,0xf9);
   }
   if(k==10)
   {
    for(i=0,j=0;i<13;i=i+2,j++)
    {
     word=256*(pp[i]-0xa0)+pp[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
   }
   if(k==11)
   {
    for(i=0,j=0;i<9;i=i+2,j++)
    {
     word=256*(jj[i]-0xa0)+jj[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='9';
    dis_word(0x11,50,0xf9);
    //word='0';
    //dis_word(0x12,50,0xf9);
   }
   if(k==17)
   {
    for(i=0,j=0;i<7;i=i+2,j++)
    {
     word=256*(nn[i]-0xa0)+nn[i+1]-0xa0;
     dis_word(j+3,3,0xf0);
    }
    word='C';
    dis_word(0x0f,50,0xf9);
    word='a';
    dis_word(0x10,50,0xf9);
    word='n';
    dis_word(0x11,50,0xf9);
    word='c';
    dis_word(0x12,50,0xf9);
    word='e';
    dis_word(0x13,50,0xf9);
   }
    if(k==18)
    {
     for(i=0,j=0;i<7;i=i+2,j++)
    {
     word=256*(oo[i]-0xa0)+oo[i+1]-0xa0;

⌨️ 快捷键说明

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