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

📄 adandkeyau.c

📁 ads7809采样程序 ads7809采样程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg52.h>      
#include<intrins.h>
#include<stdlib.h>
#include<absacc.h>
#include<stdio.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


#define FSA_INIT 0 //初始状态
#define FSA_COMMAND 1//命令状态
extern void Delay1335(uint delx);


//==============================
sbit KEY_CS=P1^7;//键盘
sbit KEY_CLK=P1^1;
sbit KEY_DIN=P1^0;
sbit KEY_INT0=P3^2;
//==============================
sbit AD_CLK=P1^2;//AD
sbit AD_RC=P1^3;
sbit AD_CS=P1^4;
sbit AD_BUSY=P1^5;
sbit AD_DATA=P1^6;
//==============================
sbit S_DIN=P2^6;
sbit S_DOUT=P2^5;
sbit S_CLK=P2^4;
sbit CS_MAX=P2^3;

uint idata R_buf_G;

uint idata value;
uint idata set_y;
uint idata set_num;
uint idata num_rule;
uint idata auto_back;

uchar idata Key_buf_G;
uchar bdata Buf_G;
sbit  D_KEY=Buf_G^7;

bdata uint  checksum;
uchar idata Kset_buf_G;
uchar idata bit_buf_G;
uchar idata back_count;
uchar idata wait_back_count;


uint idata a[11]={0,0,0,0,0,0,0,0,0,0,0};
uint idata b[6] ={0,0,0,0,0,0};
uint idata f[6] ={0,0,0,0,0,0};
uint idata c[11]={0,0,0,0,0,0,0,0,0,0,0};
uint idata d[6] ={0,0,0,0,0,0};
uint idata g[6] ={0,0,0,0,0,0};

bit Key_flag_G;  //有无键按下标志位
bit read_flag;
bit Res_flag_G;  //工作模式标志位
bit set_flag_G;  //设置状态标志位
bit work_flag_G; //电源工作标志位
bit PAMA_OK;     //电源参数采样读取次数完成标志位
bit set_key;     //设置键按下标志位
bit wait_back;   //等待接收发送的控制指令的返回植
bit send_wait;
bit PAMA_OK1;     //电源参数采样读取次数完成标志位

uchar xdata RecvState_G = FSA_INIT;//当前状态
uchar xdata RecvState_G1 = FSA_INIT;//当前状态
uchar xdata RecvChksum_G = 0;      //输入数据的校验字节
uchar xdata RecvCtr_G = 0;         //数据缓冲区指针
uchar xdata RecvCtr_G1 = 0;         //数据缓冲区指针
uchar xdata RecvBuf_G[13] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//输入数据缓冲区
uchar xdata Rec4Buf_G[13] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//485输入数据缓冲区
uint  xdata count3=0;
uchar xdata ERROR_SEND;

uchar xdata Recv_flag_G;       //接收是否完成1->完成
uchar xdata Rec4_flag_G;       //485接收是否完成1->完成
uchar xdata Rec2_flag_G;       //232接收是否完成1->完成

uchar xdata TransBuf_G[13];    //输出数据缓冲区
uchar xdata TransCtr_G = 0;    //输出数据指针
uchar xdata TransChksum_G = 0; //输出数据的校验字节
uchar xdata TransSize_G = 0;   //输出数据字节数
uchar xdata TransState=0;      //0为正常返回数据,1为下位机状态数据

//===========================
void InitZLG(void)
{
  KEY_INT0 = 1;
  KEY_CS = 1;
  KEY_DIN = 1;
}

void DelayZLG(uchar x)
{
  uchar i;
  for(i = 0; i <= x; i++)
  	{
  	  ;
  	}
}

void SendZLG(void)
{
 uchar i;
 Buf_G = 0x15;
 KEY_CS = 0;
 //===
 KEY_CLK = 0;
 //===
 DelayZLG(20);
 for(i = 0; i < 8; i++)
	{
	KEY_DIN = D_KEY;
	_nop_();
	_nop_();
	KEY_CLK = 1;
	DelayZLG(5);
	KEY_CLK = 0;
	DelayZLG(5);
	Buf_G = _crol_(Buf_G,1);
	}
 KEY_DIN = 1;
}

void ReceiveZLG(void)
{
 uchar i;
 DelayZLG(20);
 KEY_CS = 0;
 for(i = 0; i < 8; i++)
 	{
    KEY_DIN = 1;
	KEY_CLK = 1;
	DelayZLG(5);
	D_KEY = KEY_DIN;
 	Buf_G = _crol_(Buf_G,1);
	KEY_CLK = 0;
	DelayZLG(5);
   	}
 Key_buf_G = Buf_G;
 KEY_DIN = 1;
 KEY_CS = 1;
}


void Delayus(uchar t) 
{
    for(; t>0; t--)
            ;
}


//**********************3100发送字节子程序**********************
uchar Byte3100(uchar dat) reentrant //中断里调用,可重入函数
{
    uchar i;
    
    S_DOUT = 1;
    S_DIN = 1;
    for(i=0; i<8; i++)
    {
        if(dat & 0x80)    //判断最高位是否为1
            S_DIN = 1;    //如果最高位为1,DIN置1
        else              //否则DIN置0*/
            S_DIN = 0;    
        S_CLK = 1;        //时钟上升沿有效
        dat <<= 1;        //将数据左移一位
        dat |= S_DOUT;    //读数据
        S_CLK = 0;
    }
    return dat;
}
//*************************3100发送程序**************************
//发送程序,分2个字节,你也可用uint型的,DIN写命令/数据的同时,DOUT输出数据
uchar Send3100(uchar tx1,uchar tx2) reentrant 
{
    CS_MAX = 0;
    Byte3100(tx1);
    tx1 = Byte3100(tx2);
    CS_MAX = 1;
    return tx1;
}

//************************3100初始化函数*************************
void Init3100(void)
{
    uchar dat,i=0;
    do
    {
      Send3100(0xc4,0x09);       //写配置字0xc409, fifo使能,/IRO使能 ,19200bps
      Delayus(200);              //必须有延时
      dat = Send3100(0x40,0x00); //读配置字
    }while((dat!= 0x09)&&(++i<5)); //不成功则配置5次,确保可靠配置,应该是0x09(19200bps)
    Send3100(0x80,0xaa);         //写数据,配置端口方等
    Delayus(200);                //必需有延时
	Send3100(0x82,0x00);         //写数据,配置端口方等
    Delayus(200);
}


//***********************按键中断处理程序***********************
void INT0_Key(void) interrupt 0
{
      SendZLG();
      ReceiveZLG();
      KEY_CS=1;
      while(KEY_INT0==0) ;//等待按键释放
	  Key_flag_G=1;
      if(Key_buf_G==0x00)
      set_key=1;
      auto_back=0;
}
//********************485接收数据中断处理程序********************
void INT1_MAX3100(void) interrupt 2 //using 2
{
    uchar temp;
   // TF0  = 0;
   ES=0;
	temp = Send3100(0x00,0x00);           //IRQ中断,读数据
    if(wait_back==0)
	  {
	  switch(RecvState_G1)
	  	{
	  	 case FSA_INIT :
              if(temp==0x5a)
                {
				  
				  TR2=0;
			      TH2=0x7f;
                  TL2=0x00;
			      TR2=1;
				  RecvCtr_G1=0;             //数据长度复位
				  Rec4Buf_G[RecvCtr_G1++]=temp;
                  RecvState_G1=FSA_COMMAND;//设置状态位
                }
			    break;

		 case FSA_COMMAND :
		      if(RecvCtr_G1<12)            //判断接收数据是否完毕,长度12
			   {
                  Rec4Buf_G[RecvCtr_G1++]=temp;

			   }
			   else
			   {
			    RecvCtr_G1=0;               //数据长度复位
                RecvState_G1=FSA_INIT;      //设置状态位
               if(Rec4Buf_G[3] == 0x02)    //接受完一帧数据判断是否为数据返回信息
                {
                count3=count3+1;           //接收信息次数加一
                a[count3-1] = Rec4Buf_G[6]*256+Rec4Buf_G[5];//电压信息保存
                c[count3-1] = Rec4Buf_G[8]*256+Rec4Buf_G[7];//电流信息保存
                if (count3>=11)
                 {count3=0;
                 PAMA_OK=1;                //满11次置位电源参数采样读取次数完成标志    
                 }  
			    }
                } 
		   break;
       	}
	  }
	  else
	  {
         if(back_count<2)
          back_count=back_count+1;
		 else
	        {
		      wait_back=0;
				 PAMA_OK1=0;
                // TransBuf_G[0]=0x55;//发送接收正确标志
	     	     //TransBuf_G[1]=0x55;
	    	    // TransBuf_G[2]=0x55;
	    	    // TransSize_G=3;
	    	    // TransState=1;
                // SBUF=TransBuf_G[0];//启动发送 	 
	       /*  if(temp==0x55)
                {

				
                 wait_back=0;
				 PAMA_OK1=0;
                 TransBuf_G[0]=0x55;//发送接收正确标志
	     	     TransBuf_G[1]=0x55;
	    	     TransBuf_G[2]=0x55;
	    	     TransSize_G=3;
	    	     TransState=1;
                 SBUF=TransBuf_G[0];//启动发送
                 }
              if(temp==0xaa)
			    {
				  Init3100();       //向电源控制部件发送控制信息
			      Send3100(0x80,0x5a);Send3100(0x80,0x06);Send3100(0x80,RecvBuf_G[2]);Send3100(0x80,0x01);Send3100(0x80,RecvBuf_G[4]); //写数据0x80 00, RTS在Cs上升沿时置高 ,19200bps
                  Send3100(0x80,RecvBuf_G[5]);Send3100(0x80,RecvBuf_G[6]);Send3100(0x80,RecvBuf_G[7]);Send3100(0x80,RecvBuf_G[8]);Send3100(0x80,RecvBuf_G[9]);
                  Send3100(0x80,RecvBuf_G[10]);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x86,0x00);
				  TransBuf_G[0]=0xFC;//发送接收正确标志
	     	     TransBuf_G[1]=0xFC;
	    	     TransBuf_G[2]=0xFC;
	    	     TransSize_G=3;
	    	     TransState=1;
                 SBUF=TransBuf_G[0];//启动发送
				  TR2=0;
			      TH2=0x00;
                  TL2=0x00;
			      TR2=1;

⌨️ 快捷键说明

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