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

📄 admp.c

📁 At89C51与MAX186串行A/D采样程序。采集三个数码盘启动阈值
💻 C
字号:
/*******MAX186串行A/D采样程序********/

#include<reg51.h>
#include<stdio.h>
#include<absacc.h>

/****定义与码盘地址****/

#define BYTE0 XBYTE[0x1E00]
#define BYTE1 XBYTE[0x1D00]
#define BYTE2 XBYTE[0x1B00]
#define BYTE3 XBYTE[0x1700]
#define CLC   XBYTE[0x0F00]

/****定义与MAX186相关的I/O口****/
sbit max186_sclk = P1^2;
sbit max186_cs = P1^3;
sbit max186_din = P1^4;
sbit max186_sstrb = P1^5;
sbit max186_dout = P1^6;



/*****函数声明****/
unsigned int max186_ad(unsigned char);
void send_cb(unsigned char);//控制字发送函数
unsigned int receive(void);//数据接收函数
void delay(unsigned long);//延时函数
void T0_ISR(void);
void t0_init();
void init_serialcomm(void);   //串口初始化
void serial ();
void send_char_com(unsigned char ch);
unsigned long Globtime;
unsigned char Ctl186;  //186控制字
int volt_yz;  //启动 阈值

/*****主函数****/
void main()
{
   unsigned int ad_result;
   unsigned char DAT0,DAT1;
   unsigned char MP[4];
   unsigned char i;
   unsigned int Adrslt;  //ad结果
   unsigned int UItemp ;
   int volt_cur;  //当前电压值
   int Itemp;
   Globtime=0;
   t0_init();
   init_serialcomm();
   DAT0 = CLC;
   EA=1;
   Ctl186=0x85;
   volt_yz=-50;  //启动 阈值 -50mv
   while (1)
   {


       if(Globtime>99)
        {
            //向串口发送数据
            Globtime=0;
            Adrslt=0;
            //Ctl186=0xBE;
            Itemp=0;
          /*  for(i=0;i<5;i++)
            {
              // Adrslt= Adrslt+ max186_ad(Ctl186)/16;
              Itemp=   Itemp +  max186_ad(Ctl186);
            }   */
            Adrslt= Itemp/5;
            Adrslt= max186_ad(Ctl186);
            DAT0 = Adrslt/256;
            DAT1 = Adrslt%256;
          //  send_char_com(DAT0);
         //   send_char_com(DAT1);
            MP[0] = BYTE3;
            MP[1] = BYTE2;
            MP[2] = BYTE1;
            MP[3] = BYTE0;
            //计算电压值
            UItemp =   Adrslt;
            if(UItemp>=0x8000)  // 负数
            {
		UItemp =UItemp&0x7ff0;
		UItemp =UItemp/16;
		UItemp =UItemp-1;
		UItemp =~UItemp;
		UItemp =UItemp&0x7ff;
		volt_cur= -(int)UItemp;
	    }
	    else
	    {
	        UItemp =UItemp/16;
	        volt_cur= (int)UItemp;
	    }
            if(  volt_cur> volt_yz)  //如果大于阈值则
            {
                send_char_com(0xff);
                send_char_com(0x00);
                send_char_com(0xff);
                send_char_com(0x00);
                send_char_com(DAT0);
                send_char_com(DAT1);
                for(i=0;i<4;i++) { send_char_com(MP[i]);}
             }
        }

   }
}
//串口中断函数
void serial () interrupt 4 using 3
{
   unsigned char ch;
   unsigned char tmp;
   static unsigned char cnt;
   static unsigned char recchar[4];
   if(RI)
   {
       RI = 0;
       ch=SBUF;
       if(cnt>=6) cnt=0;
       if(ch==0xff)  cnt=0;  //帧头
       else if(ch==0xfe&&cnt==4)  //帧尾
       {
         if     (recchar[0]==0x00)   Ctl186 = 0x85; //通道0
         else if(recchar[0]==0x01)   Ctl186 = 0xc5; //通道1
         else if(recchar[0]==0x02)   Ctl186 = 0x95; //通道2
         else if(recchar[0]==0x03)   tmp=CLC;   //码盘清零
         else if(recchar[0]==0x05)      //启动阈值
         {
            volt_yz=  (int)(recchar[2]/16)*1000+(int)(recchar[2]&0x0f)*100
                     +(int)(recchar[3]/16)*10  +(int)(recchar[3]&0x0f);
            if( recchar[1]==1) volt_yz=-volt_yz;
         }
       }
       else
       {
           recchar[cnt]=ch;
           cnt++;
       }
   }
}
//延时函数
void delay(unsigned long dly_time) //延时
{
 while ( (dly_time--) > 0 )
 { ; }
}/***********************
串口初始化
/**********************/
void init_serialcomm(void)   //串口初始化
{
   SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr
   TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload
   PCON |= 0x00;       //SMOD=1;
   TH1   = 0xFD;       //Baud:9600  fosc=11.0592MHz
   // TH1   = 0xF3;     //6M wei 2400bps
   IE   |= 0x91;       //Enable Serial Interrupt
   TR1   = 1;          // timer 1 run
  // TI=1;
}
/**********************
串口发送一个字符
/*********************/
void send_char_com(unsigned char ch)
{
   SBUF=ch;
    do{}while(TI==0);
    TI=0;
}


void t0_init()
{
  TMOD=0x01;  //T0工作在方式1,16位定时器
  TH0=0XFC;
  TL0=0X18;
  ET0=1;	  //T0中断允许
  PT0=1;      //T0为高优先级中断
  TR0=1;
}
void T0_ISR(void) interrupt 1 using 1
 {
   TH0=0xFC;
   TL0=0x1F;
   //TR0=1;
   Globtime++;
  }
/****MAX186服务函数****/
unsigned int max186_ad(unsigned char ctrl_byte)
{
 unsigned int ad_data;
 max186_cs = 1;
 max186_sclk = 0;
 max186_din = 0;
 max186_cs = 0;
 send_cb(ctrl_byte);//发出控制字
 //max186_cs = 1;
 do
 {} while (!max186_sstrb);//等待转换完毕
 max186_cs = 0;
 max186_sclk = 1;
 ad_data = receive();//接收转换后的数据
 max186_sclk = 0;
 max186_cs = 1;
 return(ad_data);
}

/****控制字发送函数****/
void send_cb(unsigned char cb_buffer)
{
 unsigned char gate;
 for ( gate = 0x80 ; gate >= 1 ; gate >>= 1 )
 {
  max186_sclk=0;  delay(1);
  if ( (gate & cb_buffer) == 0 )//判断控制字中所要发送位的值
     max186_din = 0;
  else
     max186_din = 1;
   delay(1);
   max186_sclk = 1;          //给出SCLK的上升沿
  }
 delay(1);
 max186_din = 0;
 delay(1);
 max186_sclk = 0;
}

/****数据接收函数****/
unsigned int receive(void)   //读转换后的数据
{
 unsigned int ad_buffer = 0;
 unsigned int gate;
 for ( gate = 0x8000 ; gate >= 0x0010; gate >>= 1 )
 {
  max186_sclk = 1;
  max186_sclk = 0; //给出下降沿
  if ( max186_dout == 1)   //接收数据
     ad_buffer += gate;
 }
 return(ad_buffer);
}










⌨️ 快捷键说明

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