📄 +
字号:
C51 COMPILER V7.50 AD_DA 05/28/2010 15:53:28 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE AD_DA
OBJECT MODULE PLACED IN AD_DA.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE AD_DA.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*-----------------------------------------------
2 名称:IIC协议 PCF8591ADDA转换
3 内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压通过液晶显示,并输出模拟量,用LED亮度渐变指示
4 ------------------------------------------------*/
5 #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
6 #include <intrins.h> //包含NOP空指令函数_nop_();
7 #include<LCD1602.h>
8
9 #define AddWr 0x90 //写数据地址
10 #define AddRd 0x91 //读数据地址
11
12
13 sbit Sda=P1^2; //定义总线连接端口
14 sbit Scl=P1^1;
15
16 bit ADFlag; //定义AD采样标志位
17 unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表
18 data unsigned char Display[8];//定义临时存放数码管数值
19 /*------------------------------------------------
20 延时程序
21 ------------------------------------------------*/
22 void mDelay(unsigned char j)
23 {
24 1 unsigned int i;
25 1 for(;j>0;j--)
26 1 {
27 2 for(i=0;i<125;i++)
28 2 {;}
29 2 }
30 1 }
31 /*------------------------------------------------
32 初始化定时器1
33 ------------------------------------------------*/
34 void Init_Timer1(void)
35 {
36 1 TMOD |= 0x10;
37 1 TH1=0xff; /* Init value */
38 1 TL1=0x00;
39 1 //PT1=1; /* 优先级 */
40 1 EA=1; /* interupt enable */
41 1 ET1=1; /* enable timer1 interrupt */
42 1 TR1=1;
43 1 }
44 /*------------------------------------------------
45 启动IIC总线
46 ------------------------------------------------*/
47 void Start(void)
48 {
49 1 Sda=1;
50 1 _nop_();
51 1 Scl=1;
52 1 _nop_();
53 1 Sda=0;
54 1 _nop_();
55 1 Scl=0;
C51 COMPILER V7.50 AD_DA 05/28/2010 15:53:28 PAGE 2
56 1 }
57
58
59 /*------------------------------------------------
60 停止IIC总线
61 ------------------------------------------------*/
62 void Stop(void)
63 {
64 1 Sda=0;
65 1 _nop_();
66 1 Scl=1;
67 1 _nop_();
68 1 Sda=1;
69 1 _nop_();
70 1 Scl=0;
71 1 }
72
73
74 /*------------------------------------------------
75 应答IIC总线
76 ------------------------------------------------*/
77 void Ack(void)
78 {
79 1 Sda=0;
80 1 _nop_();
81 1 Scl=1;
82 1 _nop_();
83 1 Scl=0;
84 1 _nop_();
85 1 }
86
87
88 /*------------------------------------------------
89 非应答IIC总线
90 ------------------------------------------------*/
91 void NoAck(void)
92 {
93 1 Sda=1;
94 1 _nop_();
95 1 Scl=1;
96 1 _nop_();
97 1 Scl=0;
98 1 _nop_();
99 1 }
100
101
102 /*------------------------------------------------
103 发送一个字节
104 ------------------------------------------------*/
105 void Send(unsigned char Data)
106 {
107 1 unsigned char BitCounter=8;
108 1 unsigned char temp;
109 1
110 1 do
111 1 {
112 2 temp=Data;
113 2 Scl=0;
114 2 _nop_();
115 2 if((temp&0x80)==0x80)
116 2 Sda=1;
117 2 else
C51 COMPILER V7.50 AD_DA 05/28/2010 15:53:28 PAGE 3
118 2 Sda=0;
119 2
120 2 Scl=1;
121 2 temp=Data<<1;
122 2 Data=temp;
123 2 BitCounter--;
124 2 }
125 1 while(BitCounter);
126 1 Scl=0;
127 1 }
128
129
130 /*------------------------------------------------
131 读入一个字节并返回
132 ------------------------------------------------*/
133 unsigned char Read(void)
134 {
135 1 unsigned char temp=0;
136 1 unsigned char temp1=0;
137 1 unsigned char BitCounter=8;
138 1
139 1 Sda=1;
140 1 do
141 1 {
142 2 Scl=0;
143 2 _nop_();
144 2 Scl=1;
145 2 _nop_();
146 2 if(Sda)
147 2 temp=temp|0x01;
148 2 else
149 2 temp=temp&0xfe;
150 2
151 2 if(BitCounter-1)
152 2 {
153 3 temp1=temp<<1;
154 3 temp=temp1;
155 3 }
156 2 BitCounter--;
157 2 }
158 1 while(BitCounter);
159 1 return(temp);
160 1 }
161
162 /*------------------------------------------------
163 写入DA数模转换值
164 ------------------------------------------------*/
165 void DAC(unsigned char Data)
166 {
167 1 Start();
168 1 Send(AddWr); //写入芯片地址
169 1 Ack();
170 1 Send(0x40); //写入控制位,使能DAC输出
171 1 Ack();
172 1 Send(Data); //写数据
173 1 Ack();
174 1 Stop();
175 1
176 1 }
177
178 /*------------------------------------------------
179 读取AD模数转换的值,有返回值
C51 COMPILER V7.50 AD_DA 05/28/2010 15:53:28 PAGE 4
180 ------------------------------------------------*/
181 unsigned int ReadADC(unsigned char Chl)
182 {
183 1 unsigned int Data;
184 1 Start(); //写入芯片地址
185 1 Send(AddWr);
186 1 Ack();
187 1 Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
188 1 //Chl的值分别为0、1、2、3,分别代表1-4通道
189 1 Ack();
190 1 Start();
191 1 Send(AddRd); //读入地址
192 1 Ack();
193 1 Data=Read(); //读数据
194 1 Data=Data*196;
195 1 Data=Data/100;
196 1 Scl=0;
197 1 NoAck();
198 1 Stop();
199 1 return Data; //返回值
200 1 }
201
202 /*------------------------------------------------
203 主程序
204 ------------------------------------------------*/
205 void main()
206 {
207 1 unsigned char num; //DA数模输出变量
208 1 unsigned char ADtemp; //定义中间变量
209 1 InitLcd();
210 1 mDelay(20);
211 1 Init_Timer1();
212 1
213 1 while(1)
214 1 {
215 2 DAC(num); //DA输出,可以用LED模拟电压变化
216 2 num++; //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化
217 2 mDelay(20); //延时用于清晰看出变化
218 2 if(ADFlag) //定时采集输入模拟量
219 2 {
220 3 ADFlag=0;
221 3
222 3 ADtemp=ReadADC(0);
223 3 TempData[0]=(ReadADC(0))/100;//处理0通道电压显示
224 3 TempData[1]=((ReadADC(0))%100)/10;
225 3
226 3 ADtemp=ReadADC(1);
227 3 TempData[2]=(ReadADC(1))/100;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
228 3 TempData[3]=((ReadADC(1))%100)/10;
229 3
230 3 ADtemp=ReadADC(2);
231 3 TempData[4]=(ReadADC(2))/100;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
232 3 TempData[5]=((ReadADC(2))%100)/10;
233 3
234 3 ADtemp=ReadADC(3);
235 3 TempData[6]=(ReadADC(3))/100;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
236 3 TempData[7]=((ReadADC(4))%100)/10;
237 3
238 3 disp();
239 3 }
240 2 }
241 1 }
C51 COMPILER V7.50 AD_DA 05/28/2010 15:53:28 PAGE 5
242
243 /*------------------------------------------------
244 定时器中断程序
245 ------------------------------------------------*/
246 void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描
247 {
248 1
249 1 static unsigned int j;
250 1 TH1=0xfb; //重新赋值
251 1 TL1=0x00;
252 1 j++;
253 1 if(j==200)
254 1 {j=0;ADFlag=1;} //定时置位AD采样标志位
255 1
256 1 // P0=Display[count];//用于动态扫描数码管
257 1 // P2=count;
258 1 // count++;
259 1 // if(count==8) //表示扫描8个数码管
260 1 // count=0;
261 1
262 1
263 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 767 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 52 7
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -