📄 wpcacapture.lst
字号:
C51 COMPILER V7.05 WPCACAPTURE 02/14/2006 10:38:24 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE WPCACAPTURE
OBJECT MODULE PLACED IN WPCACAPTURE.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe WPCACAPTURE.C DB OE
stmt level source
1 //参考程序B:WPCACAPTURE.C 用PCA模块0负边沿触发的捕捉方式测量方波的频
2 //率.测量固定频率方波的100个周期的时间宽度,再求平均,可得方波的频率和
3 //周期.测量结果用LCD显示. 打开VIEW/DEBUG WINDOW/SFR'S/PCA窗口,
4 // 可直接从PCA0CPH0和PCA0CPL0中看到十六进制表达的测量结果.
5
6 #include <c8051f020.h> // SFR declarations
7 #include <intrins.h>
8 #define uchar unsigned char
9 #define uint unsigned int
10 sbit BELL=P3^5;
11 unsigned char *lcdpoint; /*指向 lcddata数组的指针*/
12 void SYSCLK_Init (void); /*时钟初始化*/
13 void LCD_Init(void); /*LCD初始化*/
14 void LCD_disp_line1(void); /*显示第一行数据*/
15 void LCD_disp_line2(void); /*显示第二行数据*/
16 void handle(void); /*处理数据*/
17 void delay(uchar time);//延时
18 void PORT_Init (void); //I/O口初始化
19 void PCA_Init (void); //PCA初始化
20 void PCA_ISR (void); //PCA中断服务子程序
21 float freq,data0;
22 unsigned int i,j,data2;
23 unsigned char FRE[8]={" FREQ: "},KHZ[10]={0x0,0x00,0x0,0x0,"Khz"};
24 signed char T[8]={" TIME: "},TIME0[10]={0x0,0x00,0x0,0x0,0x0,"us"};
25 unsigned char aa,bb,cc,ee;
26 void main (void) {
27 1 BELL=1;
28 1 /*关看门狗*/
29 1 WDTCN = 0xde;
30 1 WDTCN = 0xad;
31 1 LCD_Init(); /*LCD初始化*/
32 1 SYSCLK_Init (); /*时钟初始化*/
33 1 PORT_Init (); /*IO口初始化*/
34 1 BELL = 0; /*响蜂鸣器*/
35 1 delay(100); /* 延时*/
36 1 BELL =1; /*关闭蜂鸣器*/
37 1 while (1) {
38 2 j=0;
39 2 EA = 1; /*开中断*/
40 2 PCA_Init (); /*PCA初始化*/
41 2 while (j<0x64) ; /*PCA发生中断100次 到否?;*/
42 2 PCA0CN=0x0; /*禁止PCA定时器/计数器*/
43 2 EIE1 = 0x0; /*禁止PCA0中断*/
44 2 handle(); /*处理数据*/
45 2 LCD_disp_line1();
46 2 LCD_disp_line2();
47 2 delay(65000); /* 延时*/
48 2 delay(65000); /* 延时*/
49 2 delay(65000); /* 延时*/
50 2 delay(65000); /* 延时*/
51 2 delay(65000); /* 延时*/
52 2 delay(65000); /* 延时*/
53 2 delay(65000); /* 延时*/
54 2 }
55 1 }
C51 COMPILER V7.05 WPCACAPTURE 02/14/2006 10:38:24 PAGE 2
56 void handle(void)/*处理数据*/
57 {
58 1 data0=(PCA0CPH0*256+PCA0CPL0);/*处理来自PCA0CPH0,CA0CPL0的数据*/
59 1 data0=(PCA0CPH0*256+PCA0CPL0)/11.0592;
60 1 freq=(100000)/data0; /*计算被测波形的频率*/
61 1 aa=data0/1000; //计算周期(TIME)
62 1 bb=(data0-aa*1000)/100;
63 1 cc=(data0-aa*1000-bb*100)/10;
64 1 ee=(data0-aa*1000-bb*100-cc*10);
65 1 TIME0[0]=aa; //存放万位数
66 1 TIME0[1]=bb; //存放千位数
67 1 TIME0[2]=0x2e; //"."
68 1 TIME0[3]=cc; //存放百位数
69 1 TIME0[4]=ee; //存放十位数
70 1 aa=freq/1000; //计算频率(FREQ)
71 1 bb=(freq-aa*1000)/100;
72 1 cc=(freq-aa*1000-bb*100)/10;
73 1 ee=(freq-aa*1000-bb*100-cc*10);
74 1 KHZ[0]=aa; //存放千位数
75 1 KHZ[1]=bb; //存放百位数
76 1 KHZ[2]=cc; //存放十位数
77 1 KHZ[3]=ee; //存放个位数
78 1 }
79 void PORT_Init (void) //I/O口初始化
80 {
81 1 XBR0 = 0x08; //CEX0-->P0.0
82 1 XBR2 = 0x40; // Enable crossbar and weak pull-ups
83 1 P74OUT = 0xf0; /*P6,P7为推挽输出*/
84 1 }
85 void PCA_Init (void) //PCA初始化
86 {
87 1 EIE1 = 0x08; /*使能PCA0中断*/
88 1 PCA0MD = 0x09; /*PCA定时器时钟源SYSCLK选择:01(1/12),03(1/4),09(1)*/
89 1 PCA0L = 0x00;
90 1 PCA0H = 0x00;
91 1 PCA0CPM0 = 0x11;/*PCA0负边沿捕捉方式,CCF0=1,允许辅捉/比较标志的中断申请*/
92 1 PCA0CPL0 = 0x00;
93 1 PCA0CPH0 = 0x00;
94 1 PCA0CN=0x40; /*允许PCA定时器/计数器*/
95 1 }
96 /*PCA中断服务子程序*/
97 void PCA_ISR (void) interrupt 9
98 {
99 1 j++; /*计中断次数*/
100 1 CCF0 = 0; /*清匹配中断标志*/
101 1 }
102 void delay(uint time) //延时
103 {
*** WARNING C235 IN LINE 103 OF WPCACAPTURE.C: parameter 1: different types
104 1 uint k,h;
105 1 for(h=0;h<time;h++)
106 1 for(k=0;k<0x900;k++);
107 1 }
108 void LCD_disp_line1(void)
109 { uint x;
110 1 unsigned data1,count;
111 1 P7=0x80; // 显示第一行,DDRAM地址为00
112 1 P6 = 0x1;
113 1 P6 = 0x0;
114 1 for(x=0;x<1000;x++);
115 1 lcdpoint=&T;
116 1 for(count=8;count>0;count--) //显示文字"TIME :"
C51 COMPILER V7.05 WPCACAPTURE 02/14/2006 10:38:24 PAGE 3
117 1 {
118 2 data1=*lcdpoint;
119 2 P7 = data1; /*送字符数据*/
120 2 P6 = 0x04;
121 2 P6 = 0x05;
122 2 lcdpoint++;
123 2 for(x=0;x<1000;x++);
124 2 } //准备送数据
125 1 lcdpoint=&TIME0;
126 1 for(count=7;count>0;count--) //显示数字"XXXXXns"
127 1 {
128 2 data1=*lcdpoint;
129 2 if(data1<0x40)
130 2 if(data1 !=0x2e)
131 2 data1 += 0x30; /*转化成ASCII码*/
132 2 P7 = data1; /*送字符数据*/
133 2 P6 = 0x04;
134 2 P6 = 0x05;
135 2 lcdpoint++;
136 2 for(x=0;x<100;x++);
137 2 }
138 1 }
139 void LCD_disp_line2(void)// 显示第二行
140 { uint x;
141 1 unsigned data1,count;
142 1 P7=0xc0; // 显示第二行,DDRAM地址为40H
143 1 P6 = 0x1;
144 1 P6 = 0x0;
145 1 for(x=0;x<1000;x++);
146 1 lcdpoint=&FRE; //显示文字"FREQUENCE :"
147 1 for(count=8;count>0;count--)
148 1 {
149 2 data1=*lcdpoint;
150 2 P7 = data1; /*送字符数据*/
151 2 P6 = 0x04;
152 2 P6 = 0x05;
153 2 lcdpoint++;
154 2 for(x=0;x<1000;x++);
155 2 } //准备送数据
156 1 lcdpoint=&KHZ;
157 1 for(count=7;count>0;count--) //显示数字"XXXXKhz"
158 1 { data1=*lcdpoint;
159 2 if(data1<0x40)
160 2 data1 += 0x30; /*转化成ASCII码*/
161 2 P7 = data1; /*送字符数据*/
162 2 P6 = 0x04;
163 2 P6 = 0x05;
164 2 lcdpoint++;
165 2 for(x=0;x<100;x++);
166 2 }
167 1 }
168 void LCD_Init(void) /*LCD初始化*/
169 { uint x;
170 1 P6 = 0x09;
171 1 for(x=0;x<50000;x++);
172 1 //P7 = 0x30; /*设定一行显示*/
173 1 P7 = 0x38; /*设定两行显示*/
174 1 P6 = 0x08;
175 1 P6 = 0x09;
176 1 for(x=0;x<1000;x++);
177 1 P7 = 0x0e; /*显示开,光标显示,光标不闪烁*/
178 1 P6 = 0x08;
C51 COMPILER V7.05 WPCACAPTURE 02/14/2006 10:38:24 PAGE 4
179 1 P6 = 0x09;
180 1 for(x=0;x<1000;x++);
181 1 P7= 0x06; /*显示增加,不平移*/
182 1 P6 = 0x08;
183 1 P6 = 0x09;
184 1 for(x=0;x<5000;x++);
185 1 P7 = 0x01; /*清屏*/
186 1 P6 = 0x08;
187 1 P6 = 0x09;
188 1 for(x=0;x<5000;x++);
189 1 }
190 void SYSCLK_Init (void) /*时钟初始化*/
191 {
192 1 int k; /*延时计数器*/
193 1 OSCXCN = 0x67; /*启动外部晶振*/
194 1 for (k=0; k < 255; k++) ; /*等待外部晶体起振*/
195 1 while ((OSCXCN & 0x80)==0x00) ; /*查询标志位*/
196 1 OSCICN=0x88 ; /* 选择外部时钟为11.0592MHZ*/
-
197 1 }
198
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1467 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 57 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -