本帖最后由 xyz549040622 于 2019-12-21 15:47 编辑
- ADS7843驱动程序
- ADS7843是一个内置12位模数转换、低导通电阻模拟开关的串行接口芯片。供电电压2.7~5 V,参考电压VREF为1 V~+VCC,转换电压的输入范围为0~ VREF,最高转换速率为125 kHz。
- //=====================================================================
- // ADS7843 驱动程序(串行)
- //硬件连接: DCLK ——P0^0;
- // CS ——P0^1;
- // DIN ——P0^2;
- // BUSY ——P0^3
- // DOUT ——P0^4
- // PENIRQ——P3^2;
- // VDD--逻辑电源(+5V)
- // VSS--GND(0V)
- //=====================================================================
- #include //STC单片机头文件
- #include
- #define uint unsigned int
- #define uchar unsigned char
- sbit DCLK = P0^0; //时钟信号,下降沿有效
- sbit CS = P0^1; //片选信号,低电平有效
- sbit DIN = P0^2; //串行数据输入
- sbit BUSY = P0^3; //忙信号
- sbit DOUT = P0^4; //串行数据输出
- sbit PENIRQ = P3^2; //键盘中断请求信号,低电平(负边沿)有效
- void Tranfer(char Data);
- uint average(uint a[8]);
- //====================================================================================
- //函数名称:void delay(uint us)
- //函数功能:延时子函数
- //入口参数:us 延时时间
- //出口参数:无
- //====================================================================================
- void delay(uint us)
- {
- while(us--);
- }
- //====================================================================================
- //函数名称:void ADS7843_start(void)
- //函数功能:ADS7843启动
- //入口参数:无
- //出口参数:无
- //====================================================================================
- void ADS7843_start(void)
- {
- DCLK=0;
- CS=1;
- DIN=1;
- DCLK=1;
- CS=0;
- }
- //====================================================================================
- //函数名称:void ADS7843_wr(uchar dat)
- //函数功能:写ADS7843
- //入口参数:dat 写入的数据
- //出口参数:无
- //====================================================================================
- void ADS7843_wr(uchar dat)
- {
- uchar count;
- DCLK=0;
- for(count=0;count<8;count++)
- {
- dat<<=1;
- DIN=CY;
- DCLK=0;
- _nop_();
- _nop_();
- _nop_();
- DCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }
- }
- //====================================================================================
- //函数名称:uint ADS7843_rd(void)
- //函数功能:读ADS7843
- //入口参数:无
- //出口参数:读回的坐标值
- //====================================================================================
- uint ADS7843_rd(void)
- {
- uchar count=0;
- uint dat=0;
- for(count=0;count<12;count++)
- {
- dat<<=1;
- DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效
- DCLK=0; _nop_();_nop_();_nop_();
- if(DOUT)
- dat++;
- }
- return(dat);
- }
- //====================================================================================
- //函数名称:void intr0_int()
- //函数功能:外中断0中断服务函数
- //入口参数:无
- //出口参数:无
- //====================================================================================
- void intr0_int() interrupt 0 using 2
- {
- uint X=0,Y=0,a[4],i, avex,avey,x[8],y[8];
- IE=0; //关中断
- delay(100); //中断后延时以消除抖动,使得采样数据更准确
- if(!PENIRQ)
- {
- for(i=0;i<8;i++) //进行8次数据采集
- {
- ADS7843_start();
- delay(2);
- ADS7843_wr(0x90);//送控制字 10010000 即用差分方式读X坐标
- delay(2);
- DCLK=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- DCLK=0;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- X=ADS7843_rd(); //读X轴坐标
- x[i]=X;
- ADS7843_wr(0xD0); //送控制字 11010000 即用差分方式读Y坐标
- DCLK=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- DCLK=0;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- Y=ADS7843_rd(); //读Y轴坐标
- y[i]=Y;
- CS=1;
- }
- avex=average(x); //X坐标数据处理
- a[0]=avex/1000; //发上位机观察结果
- a[1]=(avex-a[0]*1000)/100;
- a[2]=(avex-a[0]*1000-a[1]*100)/10;
- a[3]=avex%10;
- Tranfer(a[0]+48);
- Tranfer(a[1]+48);
- Tranfer(a[2]+48);
- Tranfer(a[3]+48);
- avey=average(y); //Y坐标数据处理
- a[0]=avey/1000; //发上位机观察结果
- a[1]=(avey-a[0]*1000)/100;
- a[2]=(avey-a[0]*1000-a[1]*100)/10;
- a[3]=avey%10;
- Tranfer(a[0]+48);
- Tranfer(a[1]+48);
- Tranfer(a[2]+48);
- Tranfer(a[3]+48);
- for(i=0;i<10;i++) //延时,在程序中根据具体情况改动
- delay(10000);
- }
- IE=0x81; //开中断
- }
- //====================================================================================
- //函数名称:void init_serial()
- //函数功能:初始化串口
- //入口参数:无
- //出口参数:无
- //====================================================================================
- void init_serial()
- {
- TMOD=0x22; //定时器T1使用工作方式2
- TH1=250; //设置初值
- TL1=250;
- TR1=1; //开始计时
- PCON=0x80; //SMOD=1;
- SCON=0x50; //工作方式1,波特率9600bit/s,允许接收
- TI=1;
- }
- //====================================================================================
- //函数名称:void Tranfer(char Data)
- //函数功能:发送数据程序
- //入口参数:Data 要发送的数据
- //出口参数:无
- //====================================================================================
- void Tranfer(char Data)
- {
- while(TI==0);
- SBUF=Data;
- TI=0;
- }
- //====================================================================================
- //函数名称:int main()
- //函数功能:主函数
- //入口参数:无
- //出口参数:无
- //====================================================================================
- int main()
- {
- // uint b[4];
- TCON=0x01; //设置外部中断0下降沿触发
- EX0=1; //开外中断0
- EA=1; //开总中断
- init_serial();
- while(1);
- }
- //====================================================================================
- //函数名称:uint average(uint a[8])
- //函数功能:数据处理程序,采集8次的数据,去掉最大值,去掉最小值,然后求平均
- //入口参数:数组首地址
- //出口参数:平均值
- //====================================================================================
- uint average(uint a[8])
- {
- uint max,min,i,ave=0,sum=0;
- max=a[0];
- min=a[0];
- for(i=0;i<8;i++)
- {
- if(maxif(min>a[i])min=a[i];
- sum+=a[i];
- }
- ave=(sum-min-max)/6;
- return ave;
- }
|