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