📄 ad.lst
字号:
C51 COMPILER V8.02 AD 03/23/2009 20:06:28 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE AD
OBJECT MODULE PLACED IN AD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe AD.c DB OE
line level source
1 //C8051F005的AD驱动程序(C语言)
2 //-----------------------------------------------------------------------------
3 // Includes
4 //-----------------------------------------------------------------------------
5 #include<C8051F000.H>
6 #include<STDIO.H>
7
8 //-----------------------------------------------------------------------------
9 // Function PROTOTYPES
10 //-----------------------------------------------------------------------------
11 #define uchar unsigned char
12 #define uint unsigned int
13 void SYSCLK_Init (void);
14 void delaynus(unsigned int q) ; //N us延时函数
15 void PORT_Init (void);
16 void SPI0_Init (void);
17 void LCD_Init(void);
18 void SendSPIByte(unsigned char ch);
19 void delaynms (unsigned int j);
20 void writecom(unsigned char com);
21 void writedata(unsigned char d);
22 void writechar(unsigned char ua);
23 void lcd_Net(void);
24 void Write_COM(uchar ins);
25 void SendSPIByte(uchar disdata);
26 void lcden(datad);
27 void LCD_set_xy( unsigned char x, unsigned char y );
28 void lcd_xhl(void);
29 void LCD_write_string(unsigned char n);
30 void lcd_adc(void);
31 void UART0_Init (void);
32 void ADC (void);
33 sbit lcdcs=P3^0;
34 //-----------------------------------------------------------------------------
35 // Global CONSTANTS
36 //-----------------------------------------------------------------------------
37 #define BAUDRATE 115200 // Baud rate of UART in bps
38 #define SYSCLK 11059200 // SYSCLK frequency in Hz
39 #define SAMPLE_RATE 50000 // Sample frequency in Hz
40 #define INT_DEC 4096 // integrate and decimate ratio
41
42 sfr16 DP = 0x82; // data pointer
43 sfr16 TMR3RL = 0x92; // Timer3 reload value
44 sfr16 TMR3 = 0x94; // Timer3 counter
45 sfr16 ADC0 = 0xbe; // ADC0 data
46 sfr16 ADC0GT = 0xc4; // ADC0 greater than window
47 sfr16 ADC0LT = 0xc6; // ADC0 less than window
48 sfr16 RCAP2 = 0xca; // Timer2 capture/reload
49 sfr16 T2 = 0xcc; // Timer2
50 sfr16 DAC0 = 0xd2; // DAC0 data
51 sfr16 DAC1 = 0xd5; // DAC1 data
52 unsigned char xdata ADC1Data[4];
53 unsigned int xdata ad_arr[50];
54 unsigned char datad ,comd,kk,sdf,ppca;
55 unsigned char virt_port,v,b,m;
C51 COMPILER V8.02 AD 03/23/2009 20:06:28 PAGE 2
56 unsigned char lcd_data_count;
57 unsigned char *lcdpoint;
58 unsigned char qqq;
59 unsigned char data8;
60 unsigned int i;
61 unsigned int AD_MAXT;
62 unsigned int AD_MINT;
63 long AD_VAL,AD_VAL_TEST;
64 unsigned char YYY;
65 long result;
66 long fff;
67 long hhh;
68 int j,w,z; // temperature in hundredths of a
69 unsigned int fff_int, fff_frac;
70 unsigned char p=0,a=0,s,d,f,g=0;
71 //-----------------------------------------------------------------------------
72 // MAIN Routine
73 //-----------------------------------------------------------------------------
74 void main(void){
75 1 WDTCN = 0xde; // disable watchdog timer
76 1 WDTCN = 0xad;
77 1 SYSCLK_Init ();
78 1 PORT_Init ();
79 1 UART0_Init() ; // initialize crossbar and GPIO
80 1 SPI0_Init ();
81 1 LCD_Init() ;
82 1 delaynms(100);
83 1 Write_COM(0x00);
84 1 delaynms(100);
85 1 delaynms(100);
86 1 Write_COM(0x01);
87 1 delaynms(100);
88 1 delaynus (100);
89 1 LCD_set_xy(0X00,0);
90 1 delaynus (200);
91 1 lcd_adc();
92 1 delaynus (200);
93 1 LCD_write_string(5);
94 1 delaynms (100);
95 1 while (1)
96 1 {
97 2 delaynms (100);
98 2 ADC ();
99 2 }
100 1 }
101 //-----------------------------------------------------------------------------
102 // Initialization Subroutines
103 //-----------------------------------------------------------------------------
104
105 //-----------------------------------------------------------------------------
106 // ADC
107 //-----------------------------------------------------------------------------
108 void ADC (void)
109 {
110 1 AMX0CF = 0x60; // AMUX Configuration Register
111 1 AMX0SL = 0x00; // AMUX Channel Select Register
112 1 ADC0CN = 0x00; // ADC Control Register
113 1 REF0CN = 0x03;
114 1 ADC0CN |= 0x80;
115 1 AD_VAL=0;
116 1 AD_VAL_TEST = 0;
117 1 for( YYY = 0;YYY<50;YYY++)
C51 COMPILER V8.02 AD 03/23/2009 20:06:28 PAGE 3
118 1 {
119 2 ad_arr[YYY]=0;
120 2 }
121 1 YYY=0;
122 1 ADCINT = 0;
123 1 for(YYY= 0;YYY<50;YYY++) //AD_TIMES=50
124 1 {
125 2 ADBUSY = 1;
126 2 while (!ADCINT);
127 2 ADCINT = 0;
128 2 nop_();
*** WARNING C206 IN LINE 128 OF AD.C: 'nop_': missing function-prototype
129 2 nop_();
130 2 nop_(); //*AD_POINTER = ADC0
131 2 ad_arr[YYY]=ADC0;
132 2 }
133 1 for(YYY=0;YYY<50;YYY++)// for(i = 0;i
134 1 {
135 2 AD_VAL_TEST += ad_arr[YYY];
136 2 }
137 1 AD_VAL = (int)(AD_VAL_TEST/50);
138 1 nop_();
139 1 nop_();
140 1 nop_();
141 1 nop_();
142 1 hhh=AD_VAL*5;
143 1 hhh=hhh*5;
144 1 hhh=hhh*100;
145 1 hhh=hhh/4096;
146 1 ADC1Data[0]=hhh/1000; //将A/D转化值存到显示数组
147 1 ADC1Data[1]=(hhh-1000*ADC1Data[0])/100;
148 1 ADC1Data[2]=(hhh-1000*ADC1Data[0]-100*ADC1Data[1])/10;
149 1 ADC1Data[3]=hhh-1000*ADC1Data[0]-100*ADC1Data[1]-10*ADC1Data[2];
150 1 delaynus (100);
151 1 LCD_set_xy(0X05,0);
152 1 delaynus (200);
153 1 for(qqq=0;qqq<4;qqq++)
154 1 {
155 2 data8=ADC1Data[qqq];
156 2 if(data8>=0x0a) data8 += 0x37;
157 2 else data8 += 0x30;
158 2 delaynms (200);
159 2 writechar(data8);
160 2 }
161 1 AD_VAL=0;
162 1 }
163
164 //-----------------------------------------------------------------------------
165 // PORT_Init
166 //-----------------------------------------------------------------------------
167 void PORT_Init (void)
168 {
169 1 XBR0 = 0x27; // XBAR0: Initial Reset Value
170 1 XBR1 = 0x00; // XBAR1: Initial Reset Value
171 1 XBR2 = 0x5c; // XBAR2: Initial Reset Value
172 1 PRT0CF = 0x14; // Output configuration for P0
173 1 PRT1CF = 0x10; // Output configuration for P3
174 1 PRT3CF = 0x01; // Output configuration for P3
175 1 }
176 //-----------------------------------------------------------------------------
177 // SYSCLK_Init
178 //-----------------------------------------------------------------------------
C51 COMPILER V8.02 AD 03/23/2009 20:06:28 PAGE 4
179 void SYSCLK_Init (void)
180 {
181 1 // delaynms counter
182 1 OSCXCN = 0x67; // start external oscillator with
183 1 for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
184 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
185 1 OSCICN = 0x88; // select external oscillator as SYSCLK
-
186 1 }
187 //-----------------------------------------------------------------------------
188 // SPI0_Init
189 //-----------------------------------------------------------------------------
190 void SPI0_Init (void)
191 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -