|
- /********************************************************************
- * 文件名 : PCF8591TAD实验.c
- * 描述 : 该程序实现了用PCF8591T同时采集4路AD输入的功能。
- 通过P3.2,P3.3两个按键,来切换所显示的AD输入通道。
- 按S19(P3.2)则显示的精密可调电阻分压的值。
- 按S20(P3.3) 则显示的光敏电阻和热敏电阻的值。
- 大家可以调节精密可调电阻,或者挡住光敏电阻的光,或者手接触温敏电阻,
- 数码管上显示的AD采集值都会有相应的变化。
- ***********************************************************************************/
- #include<reg52.h>
- #include <I2C.H>
- #define ADDR 0x90 //PCF8591 地址
- // 此表为 LED 的字模 // 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)
- unsigned char code Disp_Tab[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 };
- unsigned char TABLEW[8] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- unsigned char AD_CHANNEL;
- unsigned char LedOut[8];
- unsigned int D[32];
-
- sbit KEY1 = P3^2;
- sbit KEY2 = P3^3;
- /********************************************************************
- * 名称 : Delay_1ms()
- * 功能 : 延时子程序,延时时间为 1ms * x
- * 输入 : x (延时一毫秒的个数)
- * 输出 : 无
- ***********************************************************************/
- void Delay_1ms(unsigned char i)//1ms延时
- {
- unsigned char x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
- /*******************************************************************
- DAC 变换, 转化函数
- *******************************************************************/
- bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
- {
- Start_I2c(); //启动总线
- SendByte(sla); //发送器件地址
- if(ack==0)return(0);
- SendByte(c); //发送控制字节
- if(ack==0)return(0);
- SendByte(Val); //发送DAC的数值
- if(ack==0)return(0);
- Stop_I2c(); //结束总线
- return(1);
- }
- /*******************************************************************
- ADC发送字节[命令]数据函数
- *******************************************************************/
- bit ISendByte(unsigned char sla,unsigned char c)
- {
- Start_I2c(); //启动总线
- SendByte(sla); //发送器件地址
- if(ack==0)return(0);
- SendByte(c); //发送数据
- if(ack==0)return(0);
- Stop_I2c(); //结束总线
- return(1);
- }
- /*******************************************************************
- ADC读字节数据函数
- *******************************************************************/
- unsigned char IRcvByte(unsigned char sla)
- { unsigned char c;
- Start_I2c(); //启动总线
- SendByte(sla+1); //发送器件地址
- if(ack==0)return(0);
- c=RcvByte(); //读取数据0
- Ack_I2c(1); //发送非就答位
- Stop_I2c(); //结束总线
- return(c);
- }
- //******************************************************************/
- main()
- {
- unsigned char i,temp=1;
- while(1)
- {/********以下AD-DA处理*************/
- switch(AD_CHANNEL)
- {
- case 0: ISendByte(ADDR,0x41);
- D[0]=IRcvByte(ADDR)*2; //ADC0 模数转换1
- break;
-
- case 1: ISendByte(ADDR,0x42);
- D[1]=IRcvByte(ADDR)*2; //ADC1 模数转换2
- break;
- case 2: ISendByte(ADDR,0x43);
- D[2]=IRcvByte(ADDR)*2; //ADC2 模数转换3
- break;
- case 3: ISendByte(ADDR,0x40);
- D[3]=IRcvByte(ADDR)*2; //ADC3 模数转换4
- break;
- case 4: DACconversion(ADDR,0x40, D[4]/4); //DAC 数模转换
- break;
- }
- if(++AD_CHANNEL>4) AD_CHANNEL=0;
-
- if(KEY1==0 || KEY2==0 )
- {
- Delay_1ms(20); //20毫秒软件防抖
- if(KEY1 == 0)
- {
- temp =1;
-
- }
- else if(KEY2 == 0)
- {
- temp=2;
- }
-
- }
- if(temp ==1)
- {
- LedOut[0]=Disp_Tab[D[0]%10000/1000];
- LedOut[1]=Disp_Tab[D[0]%1000/100];
- LedOut[2]=Disp_Tab[D[0]%100/10]&0x7f;
- LedOut[3]=Disp_Tab[D[0]%10];
-
- LedOut[4]=Disp_Tab[D[1]%10000/1000];
- LedOut[5]=Disp_Tab[D[1]%1000/100]&0x7f;
- LedOut[6]=Disp_Tab[D[1]%100/10];
- LedOut[7]=Disp_Tab[D[1]%10];
- }
- if(temp ==2)
- {
- LedOut[0]=Disp_Tab[D[2]%10000/1000];
- LedOut[1]=Disp_Tab[D[2]%1000/100];
- LedOut[2]=Disp_Tab[D[2]%100/10]&0x7f;
- LedOut[3]=Disp_Tab[D[2]%10];
-
- LedOut[4]=Disp_Tab[D[3]%10000/1000];
- LedOut[5]=Disp_Tab[D[3]%1000/100]&0x7f;
- LedOut[6]=Disp_Tab[D[3]%100/10];
- LedOut[7]=Disp_Tab[D[3]%10];
- }
- for(i=0;i<8;i++)
- {
- P0 = LedOut[7-i];
- P2 = 7-i;
- Delay_1ms(2);
- }
- }
- }
复制代码
|
|