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

📄 12ad.c

📁 应用tlc1543及cd4067对35路信号进行采集
💻 C
字号:
#include <reg52.h>
#include <stdio.h>
#include <math.h>
#include <intrins.h>

sfr  AUXR=0x8E;

sbit CLOCK=P2^7;     //1543与MCU接口定义
sbit D_IN=P2^6;
sbit D_OUT=P2^5;
sbit _CS=P2^2;


/*sbit P01=P0^1;
sbit P02=P0^2;
sbit P03=P0^3;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;*/

//sbit P16=P1^6;

#define uint unsigned int
#define uchar unsigned char

uint xdata adresult[35][10];
uint idata Result[35];
uchar Times;              //每点采用次数

uchar ch[2];
uchar i,j,k,m;
uint n;

sbit X5045_CS=P1^0;        //X5045接口定义
sbit X5045_SO=P1^1;
sbit X5045_SCK=P1^2;
sbit X5045_SI=P1^3;

#define WREN 0X06         //X5045命令
#define WRDI 0X04
#define RDSR 0X05
#define WRSR 0X01
//#define READ
//#define WRITE

extern void Init(void);
extern void UART(void);

uchar bdata data_x5045;
sbit x5045_data0=data_x5045^0;
sbit x5045_data7=data_x5045^7;


//******************************************//
uchar Read8(void)         /*read from 5045*/
{
    uchar i;
    for(i=0;i<8;i++)
        {
            X5045_SCK=1;
            X5045_SCK=0;
            data_x5045=data_x5045<<1;
            x5045_data0=X5045_SO;
        }
        return(data_x5045);
}


//*******************************************//
void Write8(uchar cData)
{
    uchar i;
    data_x5045=cData;
    for(i=0;i<8;i++)
        {
            X5045_SCK=0;
            X5045_SI=x5045_data7;
            X5045_SCK=1;
            data_x5045=data_x5045<<1;
         }
}


//**********************************************//
uchar ReadSR(void)
{
    uchar cData;
    X5045_CS=0;
    Write8(RDSR);
    cData=Read8();
    X5045_CS=1;
    return(cData);
}


//**********************************************//
void WriteSR(uchar cData)
{
    while((ReadSR()&0x01)==1);
    X5045_CS=0;
    Write8(WREN);
    X5045_CS=1;
    X5045_CS=0;
    Write8(WRSR);
    Write8(cData);
    X5045_CS=1;
}



/*********读tlc1543子程序****************************/
uint Read1543(uchar port)	//形参port是采样的通道号
{
    uint data ad;uint data i;
    uchar data al=0,ah=0;

    CLOCK=0;_CS=0;
    port<<=4;
    for (i=0;i<4;i++) //把通道号打入1543
        {
	    D_IN=(bit)(port&0x80);CLOCK=1;CLOCK=0;
	    port<<=1;
        }
        for (i=0;i<6;i++) //填充6个CLOCK
        {
        CLOCK=1;CLOCK=0;
        }

    _CS=1;//等待AD转换

	_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();

	_CS=0; //开始取数
	_nop_();_nop_();_nop_();

    for (i=0;i<2;i++) //取D9,D8
        {
	    D_OUT=1;CLOCK=1;
	    ah<<=1;
	    if (D_OUT) ah|=0x01;
	    CLOCK=0;
        }

    for (i=0;i<8;i++) //取D7--D0
        {
	    D_OUT=1;CLOCK=1;
	    al<<=1;
	    if (D_OUT) al|=0x01;
	    CLOCK=0;
        }
    _CS=1;

    ad=(uint)ah;ad<<=8;ad|=al; //得到AD值
    return (ad);
}

/*********第t轮采样子程序****************************/

void Getad(uchar t)
{
   // char xdata *xdp;
    uchar i,j,k;
    uchar ch=0;                  //选择读哪一个1543通道
    for(i=0;i<2;i++)
        {
         //if(i==0)
		 //xdp=0xfffd;       //选4067片子
		 //else
		 //xdp=0xffbf;
         //else if(i==2) xdp=0xbfff;
         //else xdp=0x7fff;
		 k=0;
         for(j=0;j<16;j++)
            {
			//k<<=2;                     //选4067通道
			if(i==0) P0=k|0x20;
			else P0=k|0x10;
            //_nop_();_nop_();_nop_();//*xdp=k;
			//Read1543(ch);
            adresult[16*i+j][t]=Read1543(ch);
			//k>>=2;
            k++;
            }
		 if(i==1)
			{
			//Read1543(0x09);
			adresult[32][t]=Read1543(0x08);
			adresult[33][t]=Read1543(0x09);
			//Read1543(0x0a);
			adresult[34][t]=Read1543(0x0a);
			}
        }
}

/**********************排序子程序****************************/

void Sort(uchar n)
{
    uint temp;
	uchar i,j,k;
    for(i=0;i<34;i++)           //共34路
        {for(j=0;j<n;j++)      //n个数排序
            for(k=0;k<n-j;k++)
                if (adresult[i][k]>adresult[i][k+1])
                {temp=adresult[i][k];adresult[i][k]=adresult[i][k+1];adresult[i][k+1]=temp;}
        }
}


/***********************平均值滤波子程序*************************/

void Filter(uchar n)
{
    uint sum;
	uchar i,j;
    for(i=0;i<34;i++)
        {
		 sum=0;
		 for(j=(Times-n)/2;j<=n+1;j++)
        	sum+=adresult[i][j];
        	Result[i]=sum/n;
		}
}


/**************************Delay********************************/

void Delay(void)
{
	uint i;
	for(i=0;i<550;i++);
}
/***********************主程序***********************************/

main()
{
    uchar T;
	Times=10;
	AUXR=AUXR&0xfd;
	AUXR=AUXR|0x01;

	WriteSR(0x00);          //禁止看门狗
	Init();

    Begin:
	for(T=0;T<Times;T++)
        	{Getad(T);
			Delay();
        	}
    	  Sort(Times);
    	  Filter(6);
	X5045_CS=1;
	_nop_();
    X5045_CS=0;
	_nop_();_nop_();_nop_();
	X5045_CS=1;
	//P0=0x20;
	goto Begin;

}

⌨️ 快捷键说明

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