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

📄 子机.c

📁 利用AD7705与热敏电阻来检测实际的温度
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************************************************************************
************************************************一号温度测试系统子机程序*************************************************************
************************************************************************************************************************/
#include<reg51.h>
#include<intrins.h>
#include <math.h>
#define  uchar unsigned char
#define  uint unsigned int
#define Rvr1 100                                         //校准电阻低端值100欧
#define Rvr2 250                                         //校准电
//#define rref 196945                                     //电阻基准
//#define vref 524800                                      //电压基准
uchar code dm[]={0x42,0xd7,0x1a,0x16,0x87,0x26,0x22,0x57,0x02,0x06};
uchar code xml[]={0,0,2,1,0,3,4,5,6};//写1302命令表
uchar code dml[]={0,1,2,3,4,5,6};//读1302命令表
uchar data jshc[8]={0,0,0,0,0,0,0,0};                  //串口接收数据缓冲区
//uchar data fshc[8]={0,0,0,0,0,0,0,0};                  //串口发送数据缓冲区
uchar idata huanchong[3]={0,34,12};                        //1302读数据缓冲
uint  idata wenduzhihc[3]={0,34,12};                       //温度显示数据缓冲
uchar idata sendhc[4];                                     //485发送缓冲
float idata jzrref[5]={0,0,0,0,0};                                    //校准电阻滤波数组
float idata jzvref[5]={0,0,0,0,0};                                    //校准电压滤波数组
//float data dqr[10]={0,0,0,0,0,0,0,0,0,0};                                      //读数据电阻滤波数组
//float data dqv[10]={0,0,0,0,0,0,0,0,0,0};                                      //读数据温度滤波数组
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}range_zero;
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}range_full;
                                     		             /*系统量程零点和满度误差*/
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}rref;
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}vref;
//data unsigned int out_zero,out_full;                    /*变送输出零点和满度*/
data float v1,v2,rt1,rt2,vrl1,vrl2,v,vrl,r,rl,t;	/*校准及计算用数据区?*/
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}wendu;
idata union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}shangx; //检测仪上下限
idata union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}xiax;
unsigned char dizhi;
float aa;
int zz;
uchar data jsflag=0,err,jzhun=0,xhflag=0; //接收到数据标志////接收出错标志//校准标志
bit    jzh_flag;					        	  /*校准期间标志*/
sbit   trx=P2^7;
sbit   fmq=P2^0;     //蜂鸣器引脚
sbit   T_CLK= P2^3;  /*实时时钟时钟线引脚 */
sbit   T_IO= P2^1;   /*实时时钟数据线引脚 */
sbit   T_RST= P2^2;  /*实时时钟复位线引脚 */
sbit   dat= P0^2 ;    // P2.0 对应 595 SI
sbit   rck= P0^1 ;    // P2.1 ...  595 RCK
sbit   clk= P0^0 ;    // P2.2 ...  595 SCK
sbit   TA= P0^7 ;     //状态按键右向左第一个
sbit   ADDE= P0^6;    //加按键右向左第二个
sbit   SUB= P0^5;     //减按键右向左第三个
sbit   jdq1=P1^0;
sbit   jdq2=P1^1;                           //继电器驱动口
sbit   ad_cs=P1^6;					/*AD转换器AD7705硬件I/O定义*/
sbit   ad_sclk=P1^7;
sbit   ad_dout=P1^3;					/*AD输入输出公用I/O*/
sbit   ad_din=P1^2;
sbit   ad_reset=P1^5;
sbit   ad_drdy=P1^4;            		                 /*AD工作标志,'0'时才可以操作*/
sbit   LIGHT1= P0^4;
sbit   LIGHT2= P0^3;
uchar data  cnt=0,cnt1=0,cnt2=0,cnt3=4,cnt4=5,cnt7=0,senflag=0;

/*延时函数,可以定义时间*/
void dealy(unsigned int time)
{
	while(time!=0)
	     {
	      time--;
	     }
}

/*AD转换器命令写函数,标准移位寄存器方式,高位在前,每次8位*/
void ad_write(unsigned char command)
{
  data unsigned char i;

        ad_sclk=1;
        ad_cs=0;
        i=8;
	while(i!=0)
	        {
                ad_sclk=0;
	        ad_din=command&0x80;
	        ad_sclk=1;
	        command=command<<1;
	        i--;
	        }
        ad_din=1;					//送完命令置'1',准备输入数据
        ad_cs=1;
}
/*===========================================================================================*/


unsigned int ad_pro(unsigned char ch)    /*AD转换处理函数,CH=1,2,直接输出结果*/
{
  data union {unsigned int word;struct{unsigned char hi;unsigned char lo;}byte;}k;
  data unsigned char i;
  data unsigned int j;
       ad_cs=0;

      ad_write(0x0f+ch);         /*写通讯寄存器,选择通道1,2,并建立下一个操作为写设置寄存器*/
      ad_write(0x5c);            /*写设置寄存器,清除FSYNC,建立增益为8,信号为单极性等运行条件,*/
                                /*初始化被选通道为自校准模式,不加缓冲器*/
      while(ad_drdy==0)
          {}
      while(ad_drdy==1)
          {}
      ad_write(0x37+ch);		/*读通讯寄存器,选择通道1,2,并建立下一个操作位读数据寄存器*/

        ad_sclk=1;              /*读取结果*/
        ad_cs=0;

	i=16;
	while(i!=0)
	        {
	        k.word=k.word<<1;
                ad_sclk=0;
	        j=ad_dout;
	        ad_sclk=1;
                k.word=k.word+j;
	        i--;
                }
        ad_cs=1;

        return (k.word);
}
/******************************************************************************************
*****************************************串口发送数据程序**********************************
******************************************************************************************/
void send()
{
   unsigned char data i;
   trx=1;                                               //485发 送允许
   TI=0;
   for(i=0;i<8;i++)
    {
      SBUF=jshc[i];
      while(TI==0)
       {}
      TI=0;
    }
   for(i=0;i<30;i++)
     {}
   trx=0;
  for(i=0;i<250;i++)
     {}
}
/******************************************************************************************
*****************************************给595缓冲区送数据*********************************
******************************************************************************************/
void sd595hc ()
{
  uchar data a,i,j;
  uchar code * data b;
  j=0;
  for(i=1;i<=2;i++)
  {
      a=huanchong[i];                                   //将从1302读出的数据变换成段码
      if(a>=10)                                         //数据大于10
      {
        b=dm+a%10;                                      //找到段码位置
        sendhc[j]=*b;                                   //送给595发送缓冲区
        j++;
        b=dm+a/10;
        sendhc[j]=*b;
        j++;
      }
      else
      {
        b=dm+a;                                         //数据小于10
        sendhc[j]=*b;
        j++;
        sendhc[j]=*dm;                                  //第二位送0
        j++;
      }
   }
}
void sd595hc1()
{
  uchar data a,i,j;
  uchar code * data b;
  j=0;
  for(i=1;i<=2;i++)
  {
      a=wenduzhihc[i];                                   //将从1302读出的数据变换成段码
      if(a>=10)                                         //数据大于10
      {
        b=dm+a%10;                                      //找到段码位置
        sendhc[j]=*b;                                   //送给595发送缓冲区
        j++;
        b=dm+a/10;
        sendhc[j]=*b;
        j++;
      }
      else
      {
        b=dm+a;                                         //数据小于10
        sendhc[j]=*b;
        j++;
        sendhc[j]=*dm;                                  //第二位送0
        j++;
      }
   }
}
/******************************************************************************************
******************************************给595送数据函数**********************************
******************************************************************************************/
delay()
{
data unsigned char i;

for(i=0;i<10;i++)
{}
}

void sd595()
{  uchar data j,i,k;                                      //将缓冲区数据送给595
   for(j=0;j<4;j++)
                 {
                  k=sendhc[j];                          //找到缓冲区先送低位
                  for(i=0;i<8;i++)
                    {
                     clk=0;                             //模拟时钟
                     dat=k&0x01;                           //送一位数据
                     delay();
                     clk=1;
                     //delay();
                     k=k>>1;                            //右移一位
                    }
                 }
           rck=0;
           //delay();
           rck=1;
}
/****************************************************************************************
*****************************************BCD码转换到ASC码********************************
****************************************************************************************/
void bcdtoasc(unsigned char *lvalue)
 {
   *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++)
{
    T_IO=te&0x01;                  //取最后一位
    T_CLK=1;                       //模拟脉冲
    T_CLK=0;
    te= te>>1;                     //右移一位
}
}
unsigned char read_byte()        //从ds1302 读出一个字节
{
 unsigned char data i,j,k;

    T_CLK=0;
  for(i=0;i<8;i++)
  {
    j=j>>1;                        //左移一位
    k=T_IO;                        //传送数据
    k=k<<7;                        //接受位右移
    j=j|k;
    T_CLK=1;                       //模拟脉冲
    T_CLK=0;
  }
  return j;
}

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

 write_byte(addr);               //写入命令
 i=read_byte();                //读出数据
 T_RST=0;
 return i;
}
/******************************************************************************************
*************************************给1302写入时钟数据************************************
******************************************************************************************/
void xsz1302()
{
   uchar data a,b,i;
   uchar code * data e;
   uchar  data *c;                  //反复调用函数将数据写完
   for(i=2;i<5;i++)
     {
        e=xml+i;
        a=*e;
        c=jshc+i;
        asctobcd(c);
        jshc[i]=*c;
        b=jshc[i];
        write_word(a,b,0);
        bcdtoasc(c);
        jshc[i]=*c;
     }
}
/******************************************************************************************
*************************************从1302读出时钟数据************************************
******************************************************************************************/
void dsz1302()
{
  uchar data i,a,c;                  //反复调用函数将数据读完
  uchar data *b;
  uchar code * data e;
  for(i=0;i<3;i++)
     {
        e=dml+i;
        a=*e;
        b=huanchong+i;
        c=read_word(a,0);
        b=&c;
        bcdtoasc(b);
        huanchong[i]=*b;
     }
}

⌨️ 快捷键说明

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