📄 adc0809.lst
字号:
C51 COMPILER V8.02 ADC0809 07/23/2007 11:23:20 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE ADC0809
OBJECT MODULE PLACED IN adc0809.OBJ
COMPILER INVOKED BY: D:\Program Files\C51\BIN\C51.EXE adc0809.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <intrins.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5
6
7 #define Digit0 0x01 // 数码管1寄存器
8 #define Digit1 0x02 // 数码管2寄存器
9 #define Digit2 0x03 // 数码管3寄存器
10 #define Digit3 0x04 // 数码管4寄存器
11 #define Digit4 0x05 // 数码管5寄存器
12 #define Digit5 0x06 // 数码管6寄存器
13 #define Digit6 0x07 // 数码管7寄存器
14 #define Digit7 0x08 // 数码管8寄存器
15
16
17 #define DecodeMode 0x09 // 译码模式寄存器
18 #define Intensity 0x0a // 亮度寄存器
19 #define ScanLimit 0x0b // 扫描位数寄存器
20 #define ShutDown 0x0c // 低功耗模式寄存器
21 #define DisplayTest 0x0f // 显示测试寄存器
22
23
24 #define ShutdownMode 0x00 // 低功耗方式
25 #define NormalOperation 0x01 // 正常操作方式
26
27 #define ScanDigit 0x04 // 扫描位数设置,显示8位数码管
28 #define DecodeDigit 0xff // 译码设置,8位均为BCD码
29 #define IntensityGrade 0x0a // 亮度级别设置
30
31 #define TestMode 0x01 // 显示测试模式
32 #define TextEnd 0x00 // 显示测试结束,恢复正常工作模式
33
34
35
36 sbit DIN = P1^0; // 串行数据输入
37 sbit CLK = P1^1; // 串行时钟
38 sbit LOAD =P1^2; // 显示数据锁存控制
39
40 sbit ST=P3^0;
41 sbit OE=P3^1;
42 sbit EOC=P3^2;
43 sbit CLK1=P3^3;
44
45 double data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
46 uint data dis[5]={0x00,0x00,0x00,0x00,0x00};
47
48
49 /* 延时t毫秒 */
50 void delay(uint t)
51 {
52 1 uint i;
53 1 while(t--)
54 1 {
55 2 /* 对于12M时钟,约延时1ms */
C51 COMPILER V8.02 ADC0809 07/23/2007 11:23:20 PAGE 2
56 2 for (i=0;i<125;i++)
57 2 {}
58 2 }
59 1 }
60
61 /* 向MAX7219写入字节(8位)*/
62 void SendChar (uchar ch)
63 {
64 1 uchar i,temp;
65 1 _nop_();
66 1 for (i=0;i<8;i++)
67 1 {
68 2 temp=ch&0x80;
69 2 ch=ch<<1;
70 2 if(temp)
71 2 {
72 3 DIN=1;
73 3 CLK=0;
74 3 CLK=1;
75 3 }
76 2 else
77 2 {
78 3 DIN=0;
79 3 CLK=0;
80 3 CLK=1;
81 3 }
82 2 }
83 1 }
84
85 /* 向MAX7219写入字(16位)*/
86 void WriteWord (uchar addr,uchar num)
87 {
88 1 LOAD=0;
89 1 _nop_();
90 1 SendChar(addr);
91 1 _nop_();
92 1 SendChar(num);
93 1 _nop_();
94 1 LOAD=1; // 锁存进相应寄存器
95 1 }
96
97 /* MAX7219初始化 */
98 void InitDisplay (void)
99 {
100 1 WriteWord (ScanLimit,ScanDigit); // 设置扫描界限
101 1 WriteWord (DecodeMode,DecodeDigit); // 设置译码模式
102 1 WriteWord (Intensity,IntensityGrade); // 设置亮度
103 1 WriteWord (ShutDown,NormalOperation); // 设置为正常工作模式
104 1 }
105
106
107
108
109
110
111 //*******ADC0809转换函数***********/
112
113 void ADC0809_Convert()
114 {
115 1 uchar m;
116 1 uchar adr=0x00;
117 1 P2=adr;
C51 COMPILER V8.02 ADC0809 07/23/2007 11:23:20 PAGE 3
118 1 for(m=0;m<8;m++)
119 1 {
120 2
121 2
122 2 ST=1;
123 2 ST=0;
124 2 _nop_();
125 2 _nop_();
126 2 _nop_();
127 2 _nop_(); //延时4微秒
128 2 while(EOC==0);//等待转换结束
129 2 OE=1;
130 2 ad_data[m]=P0;
131 2 OE=0;
132 2 adr++;
133 2 P2=adr;//取AD值,地址加1
134 2 }
135 1 P2=0x00; //地址复位
136 1 }
137
138
139
140
141 //***********显示扫描函数**********/
142 Display_scan()
143 {
144 1
145 1 char k,n;
146 1
147 1
148 1 dis[0]=0x00; //通道初值为0
149 1 for(n=0;n<8;n++) //每次显示8个数据
150 1 {
151 2 ad_data[n]=(ad_data[n]/255*5);
152 2 dis[1]=(uint)ad_data[n];
153 2 ad_data[n]=(ad_data[n]-dis[1])*10;
154 2 dis[2]=(uint)ad_data[n];
155 2 ad_data[n]=(ad_data[n]-dis[2])*10;
156 2 dis[3]=(uint)ad_data[n];
157 2 for(k=0;k<4;k++)
158 2 {
159 3 WriteWord ( Digit0, dis[0]);
160 3 WriteWord ( Digit1, 0x0f );
161 3 WriteWord ( Digit2, dis[1]|0x80);
162 3 WriteWord ( Digit3, dis[2]);
163 3 WriteWord ( Digit4, dis[3]);
164 3 }
165 2 delay(1000);
166 2 dis[0]++; //通道值加1
167 2 }
168 1 }
169
170 /* 主函数 */
171 void main(void)
172 {
173 1
174 1
175 1 InitDisplay (); // MAX7219初始化
176 1 WriteWord(DisplayTest,TestMode); // 开始显示测试,点亮所有LED
177 1 delay(500); // 延时约3s
178 1 WriteWord (DisplayTest,TextEnd); // 退出显示测试模式
179 1
C51 COMPILER V8.02 ADC0809 07/23/2007 11:23:20 PAGE 4
180 1 ST=0;
181 1 OE=0;
182 1
183 1 ET0=1;
184 1 EA=1;
185 1 TMOD=0x02;
186 1 TH0=216;
187 1 TL0=216;
188 1 TR0=1;
189 1 while(1)
190 1 {
191 2 ADC0809_Convert();
192 2 Display_scan();
193 2
194 2 }
195 1
196 1 }
197
198
199 void timer0(void) interrupt 1 using 0
200 {
201 1
202 1 CLK1=~CLK1;
203 1 }
204
205
206
207
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 520 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 42 3
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 + -