📄 ad.lst
字号:
C51 COMPILER V8.08 AD 12/14/2007 16:43:40 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE AD
OBJECT MODULE PLACED IN AD.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe AD.C DB OE
line level source
1 //-----------------------------------------------------------------------------
2 // 文件名:AD.C
3 //-----------------------------------------------------------------------------
4 //
5 // 初始作者: 刘建
6 // 初始版本:V1.0
7 // 功能说明:单片机初始化;AD转换,并在LED数码管上显示转换结果
8 // 初始日期:2007年1月26日
9 //
10 // 修改版本:
11 // 修改内容:
12 // 修改日期:
13
14 // CPU型号 : C8051F330
15 // 软件工具: SL IDE 1.9
16
17 //-----------------------------------------------------------------------------
18 // 包含文件
19 #include <c8051f330.h> // SFR 声明
20
21 //-----------------------------------------------------------------------------
22 // 定义16位特殊功能寄存器
23 sfr16 ADC0 = 0xbd; // ADC0 采样数据寄存器地址
24
25 //-----------------------------------------------------------------------------
26 // 函数原形定义
27 #define uchar unsigned char
28
29 void main (void); // 主函数
30 void SYSCLK_Init (void); // 系统时钟初始化
31 void PORT_Init (void); // IO口初始化
32 void ADC0_Init (void); // AD转换初始化
33
34 void LED4_Display (void); // LED显示
35 void LED_OUT(uchar X); // LED单字节串行移位函数
36
37 unsigned int AD_Sampling (unsigned char Channel); // AD采样子程序
38 void _16to4bit10(unsigned int dd); // 16进制到4位10进制转换
39
40 unsigned char code LED_0F[]; // LED字模表
41
42 //-----------------------------------------------------------------------------
43 // 全局常量
44 #define SYSCLK 24500000 / 8 // 系统频率
45
46 sbit LED_DOUT = P1^6; //串行数据输入
47 sbit LED_CLK = P1^5; //时钟脉冲信号——上升沿有效
48 sbit LED_LATCH = P1^7; //打入信号————上升沿有效
49
50 #define AI1 6 // AI1采样通道为P0.6
51 #define AI2 7 // AI2采样通道为P0.7
52
53 //-----------------------------------------------------------------------------
54 // 全局变量
55 uchar LED[4]; //用于LED的4位显示缓存
C51 COMPILER V8.08 AD 12/14/2007 16:43:40 PAGE 2
56
57
58 //*****************************************************************************
59 // 主程序
60 //
61 void main (void)
62 {
63 1
64 1 PCA0MD &= ~0x40; // 禁止watchdog timer
65 1
66 1 SYSCLK_Init (); // 初始化系统时钟到 24.5MHz
67 1 PORT_Init (); // 初始化io口与交叉开关
68 1 ADC0_Init (); // 初始化AD转换
69 1
70 1 while(1)
71 1 {
72 2 unsigned long i1;
73 2 i1=AD_Sampling (AI1); //采样
74 2 i1=i1*3300; //参考电压选择VDD=3.3V
75 2 //3.3*1000=3300
76 2 i1=i1/1024; //除以2的10次方(10位AD)
77 2
78 2 _16to4bit10(i1); //结果转换为4位10进制数
79 2 //并送显示
80 2
81 2 LED4_Display ();
82 2 }
83 1 }
84 // 主程序结束
85 //*****************************************************************************
86
87
88
89 //*****************************************************************************
90 // 初始化程序
91 //-----------------------------------------------------------------------------
92 // SYSCLK_Init 系统时钟初始化程序
93 //
94 // 使用内部 24.5MHz / 8 振荡器作为时钟源
95 // 同时允许时钟丢失检测器
96 //
97 void SYSCLK_Init (void)
98 {
99 1
100 1 OSCICN = 0x80; // 使用内部振荡器;8分频
101 1
102 1 RSTSRC = 0x04; // 检测到时钟丢失时允许系统复位
103 1 }
104 //-----------------------------------------------------------------------------
105 // PORT_Init IO端口初始化程序
106 //
107 // 定义交叉开关和IO口
108 // P1.0 - LED (推挽)
109 //
110 void PORT_Init (void)
111 {
112 1 P0MDIN = 0x3f; // 定义P0.6、P0.7为模拟输入通道
113 1 // P0.6——AI1
114 1 // P0.7——AI2
115 1 P0SKIP = 0xc0; // P0.6、P0.7被交叉开关跳过
116 1
117 1 XBR0 = 0x00; // 未选择任何数字外设
C51 COMPILER V8.08 AD 12/14/2007 16:43:40 PAGE 3
118 1 XBR1 = 0x40; // 使能交叉开关和弱上拉
119 1 P1MDOUT |= 0xE0; // 设P1.5、P1.6、P1.7为输出端口
120 1 }
121 //-----------------------------------------------------------------------------
122 // ADC0初始化
123 //
124 void ADC0_Init (void)
125 {
126 1 AMX0N = 0x11; // 单端输入方式
127 1 ADC0CN = 0x80; // ADC0使能;正常跟踪模式
128 1 // 当写AD0BUSY时ADC0转换开始;ADC0数据右对齐
129 1 REF0CN = 0xA; // (电压基准控制寄存器)使用VDD
130 1 // 禁止片内温度传感器
131 1 ADC0CF = (SYSCLK/2500000) << 3; // ADC转换时钟=2.5MHz
132 1 EIE1 &= ~0x0C; // 禁止ADC0窗口比较器中断
133 1 // 禁止ADC0 EOC中断
134 1 }
135 // 初始化程序结束
136 //*****************************************************************************
137
138
139
140 //-----------------------------------------------------------------------------
141 // AD_Sampling ——AD采样子程序
142 //
143 // Channel 采样通道
144 //
145 unsigned int AD_Sampling (unsigned char Channel)
146 {
147 1 AMX0P = Channel; // 选择模拟转换通道
148 1 AD0INT = 0; // 清除转换结束标记
149 1 AD0BUSY = 1; // 开始转换
150 1 while (AD0INT == 0); // 等待转换结束
151 1 return(ADC0); // 读ADC0数据
152 1 }
153
154 //-----------------------------------------------------------------------------
155 // 16进制到4位10进制转换
156 //
157 // 将dd数据转换为4位10进制数,并存入LED显示缓存
158 void _16to4bit10(unsigned int dd)
159 {
160 1 unsigned int div;
161 1 unsigned char i;
162 1 div=1000;
163 1 for (i=0;i<4;i++) {
164 2 LED[i]=dd/div;
165 2 dd%=div;
166 2 div/=10;
167 2 }
168 1 }
169
170
171
172 //*****************************************************************************
173 // 显示程序
174 //-----------------------------------------------------------------------------
175 // 4位LED显示程序
176 //
177 void LED4_Display (void)
178 {
179 1 unsigned char code *led_table; // 查表指针
C51 COMPILER V8.08 AD 12/14/2007 16:43:40 PAGE 4
180 1 uchar i;
181 1 //显示第1位
182 1 led_table = LED_0F + LED[0];
183 1 i = *led_table;
184 1 i &= 0x7f; //显示小数点
185 1
186 1 LED_OUT(i); //段码输出
187 1 LED_OUT(0xfe); //位码输出
188 1
189 1 LED_LATCH = 0;
190 1 LED_LATCH = 1;
191 1 //显示第2位
192 1 led_table = LED_0F + LED[1];
193 1 i = *led_table;
194 1
195 1 LED_OUT(i); //段码输出
196 1 LED_OUT(0xfd); //位码输出
197 1
198 1 LED_LATCH = 0;
199 1 LED_LATCH = 1;
200 1 //显示第3位
201 1 led_table = LED_0F + LED[2];
202 1 i = *led_table;
203 1
204 1 LED_OUT(i); //段码输出
205 1 LED_OUT(0xfb); //位码输出
206 1
207 1 LED_LATCH = 0;
208 1 LED_LATCH = 1;
209 1 //显示第4位
210 1 led_table = LED_0F + LED[3];
211 1 i = *led_table;
212 1
213 1 LED_OUT(i); //段码输出
214 1 LED_OUT(0xf7); //位码输出
215 1
216 1 LED_LATCH = 0;
217 1 LED_LATCH = 1;
218 1 }
219
220 //-----------------------------------------------------------------------------
221 // LED单字节串行移位函数
222 //
223 void LED_OUT(uchar X)
224 {
225 1 uchar i;
226 1 for(i=8;i>=1;i--)
227 1 {
228 2 if (X&0x80) LED_DOUT=1; else LED_DOUT=0;
229 2 X<<=1;
230 2 LED_CLK = 0;
231 2 LED_CLK = 1;
232 2 }
233 1 }
234
235 // 显示程序结束
236 //*****************************************************************************
237
238
239
240 //*****************************************************************************
241 // 表
C51 COMPILER V8.08 AD 12/14/2007 16:43:40 PAGE 5
242 //*****************************************************************************
243 //-----------------------------------------------------------------------------
244 // LED转换表0——F
245 //
246 unsigned char code LED_0F[] =
247 {// 0 1 2 3 4 5 6 7 8 9 A b C d E F -
248 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
249 };
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 300 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -