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