AD.C
1 #include
2 #include
3
4 #define PCF8591 0x90 //PCF8591 地址
5
6 sbit LS138A=P2^2;
7 sbit LS138B=P2^3;
8 sbit LS138C=P2^4;
9
10 //此表为 LED 的字模, 共阴数码管 0-9 -
11 unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
12
13 unsigned char AD_CHANNEL;
14 unsigned long xdata LedOut[8];
15 unsigned int D[32];
16
17 bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
18 {
19 Start_I2c(); //启动总线
20 SendByte(sla); //发送器件地址
21 if(ack==0) return(0);
22 SendByte(c); //发送控制字节
23 if(ack==0) return(0);
24 SendByte(Val); //发送DAC的数值
25 if(ack==0) return(0);
26 Stop_I2c(); //结束总线
27 return(1);
28 }
29
30 /*******************************************************************
31 ADC发送字节[命令]数据函数
32 *******************************************************************/
33 bit ISendByte(unsigned char sla,unsigned char c)
34 {
35 Start_I2c(); //启动总线
36 SendByte(sla); //发送器件地址
37 if(ack==0) return(0);
38 SendByte(c); //发送数据
39 if(ack==0) return(0);
40 Stop_I2c(); //结束总线
41 return(1);
42 }
43
44 /*******************************************************************
45 ADC读字节数据函数
46 *******************************************************************/
47 unsigned char IRcvByte(unsigned char sla)
48 {
49 unsigned char c;
50
51 Start_I2c(); //启动总线
52 SendByte(sla+1); //发送器件地址
53 if(ack==0) return(0);
54 c=RcvByte(); //读取数据0
55
56 Ack_I2c(1); //发送非就答位
57 Stop_I2c(); //结束总线
58 return(c);
59 }
60
61 void main()
62 {
63 char i,j;
64 while(1)
65 {/********以下AD-DA处理*************/
66 switch(AD_CHANNEL)
67 {
68 case 0: ISendByte(PCF8591,0x41);
69 D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 放大2倍显示
70 break;
71
72 case 1: ISendByte(PCF8591,0x42);
73 D[1]=IRcvByte(PCF8591); //ADC1 模数转换2
74 break;
75
76 case 2: ISendByte(PCF8591,0x43);
77 D[2]=IRcvByte(PCF8591); //ADC2 模数转换3
78 break;
79
80 case 3: ISendByte(PCF8591,0x40);
81 D[3]=IRcvByte(PCF8591); //ADC3 模数转换4
82 break;
83
84 case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 数模转换
85 break;
86 }
87
88 D[4]=400; //数字--->>模拟输出
89 D[4]=D[0]; // 把模拟输入 采样的信号 通过数模转换输出
90 if(++AD_CHANNEL>4) AD_CHANNEL=0;
91
92 /********以下将AD的值送到LED数码管显示*************/
93
94 LedOut[0]=Disp_Tab[D[1]%10000/1000];
95 LedOut[1]=Disp_Tab[D[1]%1000/100]|0x80;
96 LedOut[2]=Disp_Tab[D[1]%100/10];
97 LedOut[3]=Disp_Tab[D[1]%10];
98
99 LedOut[4]=Disp_Tab[D[0]%10000/1000];
100 LedOut[5]=Disp_Tab[D[0]%1000/100]|0x80;
101 LedOut[6]=Disp_Tab[D[0]%100/10];
102 LedOut[7]=Disp_Tab[D[0]%10];
103
104
105 for( i=0; i<8; i++)
106 {
107 P0 = LedOut[i];
108 switch(i) //使用switch 语句控制138译码器 也可以是用查表的方式 学员可以试着自己修改
109 {
110 case 0:LS138A=0; LS138B=0; LS138C=0; break;
111 case 1:LS138A=1; LS138B=0; LS138C=0; break;
112 case 2:LS138A=0; LS138B=1; LS138C=0; break;
113 case 3:LS138A=1; LS138B=1; LS138C=0; break;
114 case 4:LS138A=0; LS138B=0; LS138C=1; break;
115 case 5:LS138A=1; LS138B=0; LS138C=1; break;
116 case 6:LS138A=0; LS138B=1; LS138C=1; break;
117 case 7:LS138A=1; LS138B=1; LS138C=1; break;
118 }
119 for (j = 0 ; j<90 ;j++) { ;} //扫描间隔时间
120 }
121 }
122 }
IIC.h
1 #include
2 #include
3
4 #define _Nop() _nop_() /*定义空指令*/
5 sbit SCL = P2^1; //I2C 时钟
6 sbit SDA = P2^0; //I2C 数据
7 bit ack; /*应答标志位*/
8
9 void Start_I2c()
10 {
11 SDA = 1; /*发送起始条件的数据信号*/
12 _Nop();
13 SCL = 1; /*起始条件建立时间大于4.7us,延时*/
14 _Nop();_Nop();_Nop();_Nop();_Nop();
15 SDA = 0; /*发送起始信号,起始条件锁定时间大于4μs*/
16 _Nop();_Nop();_Nop();_Nop();_Nop();
17 SCL = 0; /*钳住I2C总线,准备发送或接收数据 */
18 _Nop();_Nop();
19 }
20
21 void Stop_I2c()
22 {
23 SDA = 0;
24 _Nop();
25 SCL = 1;
26 _Nop();_Nop();_Nop();_Nop();_Nop();
27 SDA = 1; /*发送I2C总线结束信号*/
28 _Nop();_Nop();_Nop();_Nop();
29 }
30
31 void SendByte(unsigned char c)
32 {
33 int i;
34
35 for(i = 0;i < 8;i++) /*要传送的数据长度为8位*/
36 {
37 if((c << i) & 0x80) SDA=1; /*判断发送位*/
38 else SDA = 0;