main.lst
来自「51与ADC0804的编程实现的具体方法」· LST 代码 · 共 264 行
LST
264 行
C51 COMPILER V8.02 MAIN 03/10/2008 17:14:46 PAGE 1
C51 COMPILER V8.02, 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 //===========================================================
2 //
3 //
4 // COPY RIGHT
5 //
6 //
7 //===========================================================
8
9 // 文件名: Main.c
10 // 创建日期: 080303
11 // 创建: 神之吻
12 // 描述: 作用:
13 // ADC0804芯片的使用,模数转换试验
14 // 现象:
15 //
16 // 引脚连接关系:
17 // 1.用跳线将P2口的8脚与JE排插连接(即ADC0804的输出引脚DB0-DB7对应单片机的P20-P27)
18 // 2.用跳线将P35连接JC5(即ADC0804的片选信号CS接单片机的P35引脚)
19 // 3.用跳线将P36连接JC6(即ADC0804的启动转换信号WR接单片机的P36引脚)
20 // 4.用跳线将P37连接JC7(即ADC0804的读取转换结果控制信号RD接单片机的P37引脚)
21 //
22 //------------------------------------------------------------
23
24
25 //********************************************************
26 //* 头文件
27 //********************************************************
28
29 #include <reg52.h>
30
31 //*******************************************************
32 //* 常量定义
33 //*******************************************************
34
35 // TRUE/FALSE定义
36 //---------------------------------------------------
37 #ifndef TRUE
38 #define TRUE 0xFF
39 #endif
40
41 #ifndef FALSE
42 #define FALSE 0x00
43 #endif
44
45 // 引脚宏定义
46 //---------------------------------------------------
47 sbit ADC_CS = P3^5; //ADC0804片选控制信号
48 sbit ADC_WR = P3^6; //ADC0804启动转换信号WR
49 sbit ADC_RD = P3^7; //ADC0804读取转换结果控制信号RD
50 sbit DOT = P0^2; //八段数码管小数点控制位
51
52 #define DB P2 //ADC0804的转换结果DB0-DB7
53 #define BITCODE P0 //八段数码管的位编码
54 #define BITCHOOSE P1 //位选择,在数码管的六位中选择一位显示
55
C51 COMPILER V8.02 MAIN 03/10/2008 17:14:46 PAGE 2
56
57
58 // 其它常量宏定义
59 //---------------------------------------------------
60 #define VREF 10 //参考电压:由于ADC0804的Vref/2外接电压5V,因此进行ADC转换的参考电压为10V
61 #define FULLSCALE 256
62
63 //********************************************************
64 //* 类型定义
65 //********************************************************
66
67 // 类型重命名
68 //---------------------------------------------------
69 typedef unsigned char BOOLEAN; //布尔类型变量
70 typedef unsigned char uint8; //无符号8位整型变量
71 typedef signed char int8; //有符号8位整型变量
72 typedef unsigned int uint16; //无符号16位整型变量
73 typedef signed int int16; //有符号16位整型变量
74 typedef unsigned long uint32; //无符号32位整型变量
75 typedef signed long int32; //有符号32位整型变量
76 typedef float fp32; //单精度浮点数(32位长度)
77
78 //********************************************************
79 //* 全局变量声明
80 //********************************************************
81
82 // 与八段数码管有关的表定义
83 //---------------------------------------------------
84 uint8 code sled_table[] = { // 位编码
85 0x14, // 0
86 0xD7, // 1
87 0x4C, // 2
88 0x45, // 3
89 0x87, // 4
90 0x25, // 5
91 0x24, // 6
92 0x57, // 7
93 0x04, // 8
94 0x05, // 9
95 0x06, // A
96 0xA4, // B
97 0x3C, // C
98 0xC4, // D
99 0x2C, // E
100 0x2E // F
101 };
102
103 uint8 code bit_table[] = { // 位选
104 0xDF, // bit0
105 0xEF, // bit1
106 0xF7, // bit2
107 0xFB, // bit3
108 0xFD, // bit4
109 0xFE, // bit5
110 };
111
112 uint8 code dot = 0xFB; // 小数点位置
113
114 //与ADC0804采样芯片有关的数据结构
115 //-----------------------------------------------------
116 uint8 SampleValue; //直接从ADC0804的DB引脚取出的二进制采样结果
117 fp32 RealVoltage; //转换后的实际电压值
C51 COMPILER V8.02 MAIN 03/10/2008 17:14:46 PAGE 3
118 uint8 RealVoltBit[6]; //转换后地实际电压值的每一位编码值(用于八段数码管显示)
119
120 //********************************************************
121 //* 函数原型
122 //********************************************************
123
124 void AdcStart();
125 void AdcRead();
126 void Display();
127 void delay_ms(uint32 ms);
128
129 //********************************************************
130 //* main函数
131 //********************************************************
132
133 main()
134 {
135 1 while(TRUE)
136 1 {
137 2 AdcStart(); //启动一次ADC0804采样
138 2 delay_ms(100); //延时100ms,等待采样结束
139 2 AdcRead(); //完成一次采样后,从ADC0804的DB引脚读取采样值
140 2 Display(); //将采样结果在八段数码管显示出来
141 2 }
142 1 }
143
144
145 //*******************************************************
146 //* AdcStart
147 //*
148 //*功能描述:启动一次ADC0804采样
149 //*输入参数:无
150 //*返回值:无
151 //*******************************************************
152 void AdcStart()
153 {
154 1 ADC_CS = 0; //片选信号置0,ADC0804有效
155 1
156 1 ADC_WR = 0; //WR信号为低电平有效,启动一次ADC采样
157 1 //NOP
158 1 ADC_WR = 1; //采样启动完毕WR信号复位
159 1 //NOP
160 1 ADC_CS = 1; //片选信号复位
161 1 }
162
163 //*******************************************************
164 //* AdcRead
165 //*
166 //*功能描述:完成一次采样后,从ADC0804的DB引脚读取采样值
167 //*输入参数:无
168 //*返回值:无
169 //*******************************************************
170 void AdcRead()
171 {
172 1 ADC_CS = 0; //片选信号置0,ADC0804有效
173 1 //__NOP;
174 1 ADC_RD = 0; //RD信号为低电平有效,读出采样结果
175 1 //NOP
176 1 SampleValue = DB; //读出采样结果
177 1
178 1 ADC_RD = 1; //采样结果读出后,RD信号复位
179 1 //NOP
C51 COMPILER V8.02 MAIN 03/10/2008 17:14:46 PAGE 4
180 1 ADC_CS = 1; //片选信号复位
181 1 }
182
183 //*******************************************************
184 //* Display
185 //*
186 //*功能描述:将采样结果通过八段数码管显示出来
187 //*输入参数:无
188 //*返回值:无
189 //*******************************************************
190 void Display()
191 {
192 1 uint8 CurBit,CurCode;
193 1 uint8 VoltInt; //实际电压值的整数部分
194 1 fp32 VoltDec; //实际电压值的小数部分
195 1 uint8 VoltDectoInt;
196 1 RealVoltage = VREF * (SampleValue / FULLSCALE); //将二进制字节采样结果转换成实际电压值
197 1 VoltInt = (uint8)RealVoltage; //获得实际电压值的整数部分
198 1 VoltDec = RealVoltage - VoltInt; //获得实际电压值的小数部分
199 1 VoltDectoInt = (uint8)(VoltDec * 10000); //小数点后保留四位
200 1 //显示小数部分(四位)
201 1 for(CurBit = 0;CurBit < 4;CurBit ++)
202 1 {
203 2 CurCode = VoltDectoInt % 10;
204 2 VoltDectoInt /= 10;
205 2 BITCHOOSE = bit_table[CurBit]; //选择当前显示的数码管
206 2 BITCODE = sled_table[CurCode]; //将选中的八段数码管赋予位编码
207 2 }
208 1 //显示个位整数与小数点
209 1 CurCode = VoltInt % 10; //获得显示数据编码
210 1 BITCHOOSE = bit_table[5]; //选择当前显示的数码管
211 1 BITCODE = sled_table[CurCode]; //将选中的八段数码管赋予位编码
212 1 DOT = 0; //小数点位于个位整数所在的八段数码管上
213 1 //显示十位整数
214 1 VoltInt /= 10;
215 1 CurCode = VoltInt; //获得显示数据编码
216 1 BITCHOOSE = bit_table[5]; //选择当前显示的数码管
217 1 BITCODE = sled_table[CurCode]; //将选中的八段数码管赋予位编码
218 1 }
219
220 //*******************************************************
221 //* delay_ms
222 //*
223 //*功能描述:ms级延时函数
224 //*输入参数:
225 //*返回值:无
226 //*******************************************************
227 void delay_ms(uint32 ms)
228 {
229 1 uint32 i, j;
230 1 for(i = 0; i < ms; i++)
231 1 for(j = 0; j < 5000; j++);
232 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 325 ----
CONSTANT SIZE = 23 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 18
IDATA SIZE = ---- ----
C51 COMPILER V8.02 MAIN 03/10/2008 17:14:46 PAGE 5
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?