📄 12ad.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 + -