- 时间: 2008-7
- 子程序名:ADS7818
- 程序功能:控制模拟/数字转换器ADS7818的工作
- 程序入口:引脚P1.0(输入信号) ;采样/保持转换控制信号CONV
- 引脚P1.1(输入信号) ;串行数据输出DATA
- 引脚P1.2(输入信号) ;串行时钟信号CLK
- ******************************************************************/
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit Conv=P1^0; //采样/保持转换控制信号
- sbit Data =P1^1; //串行数据输出
- sbit Clk =P1^2; //串行时钟信号
- uint result; //保存十二位值(结果)
- uint temp;
- // 数码管驱动相关接口
- /*sbit SDATA_595 = P2^0 ; //串行数据输入
- /sbit SCLK_595 = P2^1; //移位时钟脉冲
- /sbit RCK_595 = P2^2; //输出锁存器控制脉冲
- /code uchar TAB[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
- uchar sz[3];
- uint get;
- */
- /***********延时子函数***********************/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=113;y>0;y--);
- }
- /******************ADS转换读取************************/
- uint ADS_7818()
- {
- char i; //用于12位数字的计数
- result=0;
- Conv=1;
- Conv=0; //产生Conv信号的下跳沿,触发采样到保持的转换
- Clk=0; //CLK信号清零
- Clk=1; //产生第一个时钟信号
- for(i=11;i>=0;i--) //12位数的取样循环
- {
- Clk=0; //循环中产生十二个时钟信号(加之前的),全过程至少要十三个时钟信号
- Clk=1;
- // if(Data==1)
- result|=Data;
- Clk=0;
- result<<=1;
- }
- Clk=0;
- Clk=1;
- Clk=0;
- Clk=1; //等待系统稳定(也可以不要)
- Clk=0;
- Conv=1; //CONV拉高,即CONV信号复位
- return(result); //返回值
- }
- /*
- static void WR_595(unsigned char data num2 )
- {
- uchar data count1;
-
- for(count1=0;count1<=7;count1++)
- {
- if((num2&0x80)==0x80) //最高位为1,则向SDATA_595发送1
- SDATA_595=1; //发出数据的最高位
- else
- SDATA_595=0;
- num2<<=1; //右移位
- SCLK_595=0; //产生上生沿
- SCLK_595=1;
-
- }
- }
- */
- /********************打开锁存,更新74595输出子程序************/
- //static void Out_595(void)
- //{
- // RCK_595=0;
- // _nop_();
- // _nop_();
- // RCK_595=1; /*上升沿锁存数据*/
- //}
- /****************************算法************************/
- //void calculate(void) //算法
- // {
- // sz[0]=(get/1000);
- // sz[1]=get/100%10;
- // sz[2]=get/10%10;
- // sz[3]=get%10;
- // }
- /******************ADS转换读取*******************************/
- /*
- void disp(void)
- {
- uchar j,m;
- temp=ADS_7818();
- get=temp;
- P0=get;
- get=temp*5.0*1000/0xfff;
- calculate();
- if(sz[0]==0)
- {
- j=TAB[m]&0x7F;
- }
- else
- j=TAB[m];
- WR_595(TAB[sz[0]]);
- WR_595(0xfd);
- Out_595();
- WR_595(TAB[sz[1]]);
- WR_595(0xfe);
- Out_595();
- WR_595(TAB[sz[2]]);
- WR_595(0xfb);
- Out_595();
- WR_595(TAB[sz[3]]);
- WR_595(0xf7);
- Out_595();
- WR_595(0x00);
- WR_595(0xff);
- Out_595();
- }
- */
- void wa(void)
- {
- uint get;
- temp=ADS_7818();
- get=temp;
- P2=get;
- }
- /****************主程序********************************/
- void main()
- {
- while(1)
- {
- wa();
- }
- }
|