📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 01/08/2008 15:08:10 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND TABS(2)
line level source
1 /*-------------------------------------------------------------------------------------------------
2 文件名称:Main.c
3 创建日期:07.07.30
4 修改日期:
5 文件说明:功能:
6 -基于C8051F000系列单片机的FFT试验程序
7 创建人: 李大伟
8 -------------------------------------------------------------------------------------------------*/
9 #include <stdio.h>
10 #include <intrins.h>
11 #include <math.h>
12 #include "C8051F000.h"
13 #include "CalcPhase.h"
14 //ADC0寄存器定义
15 #define NUM_FFT 128
16 sfr16 ADC0 = 0xBE;
17
18 //外部XRAM数据的起始
19 #define DATA_BEGIN 0x0000
20 #define EnableInt() EIE2|=0x02
21 #define UnEnableInt() EIE2&=~0x02
22 #define SendChar(charr) SBUF=charr; while(!TI); TI=0
23 #define GoToInSide() P1|=0x18; P1&=~0x10 //切换到内光路
24 #define GoToOutSide() P1|=0x18; P1&=~0x08 //切换到外光路
25 #define RuleOne() P1|=0x06; AMX0SL=0x07;P2|= 0x01 //以2.5 m测尺测量
26 #define RuleTwo() AMX0SL=0x06;P1|=0x06; P1&=~0x06 //以25 m测尺测量
27 #define RuleThr() AMX0SL=0x06;P1|=0x06; P1&=~0x04 //以250 m测尺测量
28 #define RuleFor() AMX0SL=0x06;P1|=0x06; P1&=~0x02 //以2500 m测尺测量
29 #define RuleFir() AMX0SL=0x06;P1|=0x06; P1&=~0x02 //以25000m测尺测量
30 #define JstIntLgh() ErrSta=JudgeLightInSide() //调节内光路光强
31 #define JstOutLgh(a) ErrSta=JudgeLightOutSide(a);if(ErrSta) return 0 //外光路光强判断
32 #define ONEPI 3.1415926535897932384626433832795 //pi
33 #define TWOPI 6.283185307179586476925286766559 //pi*2
34 #define HALFPI 1.5707963267948966192313216916398 //pi/2
35 #define ONEHALFPI 4.7123889803846898576939650749193 //pi*1.5
36 #define RULER0 2.5274651209813304576396845723529 //2.5 m尺长
37 #define RULER1 25.274651209813304576396845723529 //25 m尺长
38 #define RULER2 252.74651209813304576396845723529 //250 m尺长
39 #define RULER3 2527.4651209813304576396845723529 //2500m尺长
40 #define HALFRULER0 1.263732560490665228819842286176
41 #define HALFRULER1 12.63732560490665228819842286176
42 #define HALFRULER2 126.3732560490665228819842286176
43
44
45 #define AVGNUM 7
46 //函数申明
47 float MeasureDistance(void);
48 void SysInit(void);
49 void DataUnite(void);
50 void PrtChr(unsigned char TemChr);
51 void ADC0_ISR(void);
52 float SignleMeasure(float RulerLenght);
53 float MeasureSub(void);
54
55 //全局变量
C51 COMPILER V7.50 MAIN 01/08/2008 15:08:10 PAGE 2
56 //FFT的XRAM空间=NUM_FFT*4字节(起始于DATA_BEGIN)
57 int xdata Real[NUM_FFT] _at_ DATA_BEGIN;
58
59
60 #if(NUM_FFT>=256)
unsigned int index,ADC_Index;
#endif
63
64 #if(NUM_FFT<256)
65 unsigned char index,ADC_Index;
66 #endif
67
68 bit Conversion_Set_Complete; //一轮采样结束标志位
69 int MaxVal; //一轮采样中数据的最大值
70 int MinVal; //一轮采样中数据的最小值
71 float LengthResult; //测距结果
72 unsigned char FlgEn; //数据有效标志
73 unsigned char ErrSta; //全局错误代码
74 unsigned char AvgeTimes; //平均次数
75 unsigned char SampeEnable; //采样允许标志
76 unsigned char MesuState; //测量状态标志
77 unsigned char MesuEnable; //测量允许标志
78
79 /*=================================================================================================
80 01.名称:main
81 入口:无
82 出口:无
83 功能:系统主函数
84 =================================================================================================*/
85 void main()
86 {
87 1 long TemLVal;
88 1 float TemFVal;
89 1 unsigned char TemBuf;
90 1
91 1 SysInit();
92 1 while(1)
93 1 {
94 2 while(!RI); RI=0;
95 2 TemBuf=SBUF;
96 2 switch(TemBuf)
97 2 {
98 3 case 0xBB:
99 3 SendChar(0xBB);
100 3 break;
101 3 case 0xB4:
102 3 SendChar(0xB4); //k=justlight();
103 3 if(ErrSta)
104 3 {
105 4 if(ErrSta==1) {ErrSta=0;PrtChr(0x11);} //光太弱
106 4 else if(ErrSta==2) {ErrSta=0;PrtChr(0x22);} //光太强
107 4 break;
108 4 }
109 3 LengthResult=MeasureDistance(); //测距
110 3 if(ErrSta)
111 3 {
112 4 if(ErrSta==1) {ErrSta=0;PrtChr(0x11);} //光太弱
113 4 else if(ErrSta==2) {ErrSta=0;PrtChr(0x22);} //光太强
114 4 break;
115 4 }
116 3 if(FlgEn) //数据有效
117 3 { //将数据发给主板
C51 COMPILER V7.50 MAIN 01/08/2008 15:08:10 PAGE 3
118 4 SendChar(0xDD);
119 4 TemLVal=(long)LengthResult;
120 4 SendChar(TemLVal/1000); //千位
121 4 SendChar((((TemLVal%1000)/100)<<4)|((TemLVal%1000)%100)/10); //百位和十位
122 4 ErrSta=((TemLVal%1000)%100)%10;
123 4 TemFVal=LengthResult-(float)TemLVal;
124 4 TemLVal=(long)(TemFVal*1000);
125 4 SendChar((ErrSta<<4)|(TemLVal/100));ErrSta=0; //个位和十分位
126 4 SendChar((((TemLVal%100)/10)<<4)|((TemLVal%100)%10)); //百分位和千分位
127 4 SendChar(0x0d);
128 4 }
129 3 else PrtChr(0x33);
130 3 break;
131 3 case 0xB7: //打开关闭激光指示
132 3 SendChar(0xB7);
133 3 if((P1&0x08)==0x08) {GoToOutSide();} //外光路
134 3 else {GoToInSide ();} //内光路
135 3 break;
136 3 case 0xB8: //发送高压值给主板
137 3 SendChar(0xB8);
138 3 SendChar(0xB8);
139 3 MaxVal=(DAC0H<<8)|DAC0L;
140 3 SendChar(((MaxVal/1000)<<4)|((MaxVal%1000)/100));
141 3 SendChar(((((MaxVal%1000)%100)/10)<<4)|(((MaxVal%1000)%100)%10));
142 3 SendChar(0x0D);
143 3 break;
144 3 default:
145 3 break;
146 3 }
147 2 }
148 1 }
149
150 /*=================================================================================================
151 02.名称:SysInit
152 入口:tem - 要发送的字符,占一个字节
153 出口:无
154 功能:通过串口与主板通讯
155 =================================================================================================*/
156 void SysInit(void)
157 {
158 1 WDTCN = 0xDE; //关看门狗
159 1 WDTCN = 0xAD;
160 1 OSCXCN = 0x20; //外部时钟输入@19.44MHz
161 1 OSCICN = 0x08;
162 1 XBR0 = 0x07; //配置交叉开关
163 1 XBR2 = 0x41;
164 1 CKCON = 0x20; //配置定时器2作为波特率发生器
165 1 TMOD = 0x30; //8为异步
166 1 T2CON = 0x34;
167 1 RCAP2L = 0xC1; //9600@19.44MHz
168 1 RCAP2H = 0xFF;
169 1 SCON = 0x50; //UART
170 1 REF0CN = 0x03; //参考电压
171 1 DAC0CN = 0x80; //ADC
172 1 AMX0SL = 0x06;
173 1 ADC0CF = 0x80;
174 1 ADC0CN = 0xC8;
175 1 P1=0xff;
176 1 P0=0x0;
177 1 P2&=~0x01;
178 1 P1&=~0x80;
179 1 P1&=~0x40;
C51 COMPILER V7.50 MAIN 01/08/2008 15:08:10 PAGE 4
180 1 DAC0L&=0x0;
181 1 DAC0H&=0x0;
182 1 DAC0L|=0x6a; //设置高压值
183 1 DAC0H|=0x05;
184 1 FlgEn = 1; //初始化变量及标志
185 1 ErrSta = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -