?? main.lst
字號:
C51 COMPILER V6.23a MAIN 04/24/2007 09:42:29 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\PROGRA~1\keil\C51\Bin\c51.exe main.c DB OE SMALL ROM(LARGE)
stmt level source
1 #include <reg52.h>
2 #include <intrins.h>
3 sbit SDATA=P3^0;
4 sbit SCLK=P3^1;
5 sbit FSYNC=P3^7;
6
7 unsigned char k_value _at_ 0x30;//k_value為鍵值
8 unsigned char bdata protect _at_ 0x20;//對位變量區進行保護
9 unsigned char i; //定時器統計時基用
10 float f_word; //頻率值
11 unsigned long f_bj; //頻率步進量
12 unsigned char key_word; //核心狀態控制量
13
14 sbit k_f = protect^0;//k_f為有鍵按下標志位
15 sbit zh = protect^1;//位中轉,用于保存C,在鍵盤采值子程序中
16 sbit ss = protect^2;//數碼管閃爍控制位
17 sbit k_rx= protect^3;//修改頻率狀態標志位
18 sbit f_sx= protect^4;//正弦波狀態頻率刷新請求,為1使能
19 sbit f_sxs=protect^5;//三角波狀態頻率刷新請求,為1使能
20 sbit f_squ=protect^6;//方波狀態頻率刷新請求,為1使能
21
22 //程序編號:0
23 //名稱:鍵盤采值子程序
24 //功能:把采到的值在保存在k_value中(30H),并置位k_f(位00H)
25 void keyboard(void);//鍵盤采值函數,真正的函數體是用匯編語言寫的,在keyboard文件中
26
27 //編號7,延時2ms
28 void dl_2ms (void)
29 {unsigned int i;
30 1 for(i=0;i<580;i++)
31 1 {}
32 1 }
33
34 //編號12
35 //0.5S定時信號產生
36 void second_500ms() interrupt 1 using 0
37 {TH0=0xBF;
38 1 TL0=0x63;
39 1 if(i<=25)
40 1 {i++;}
41 1 else
42 1 {i=0;
43 2 ss=!ss;
44 2 }
45 1 TF0=0;
46 1 }
47
48 //編號3,顯示頻率函數。。。。。。。。。。。。。。。
49 //將頻率值分成八個單數送到數碼管顯示
50 void dispaly (float f_word,unsigned char XC)//f_word為頻率值,XC為控制位,數字表示相應位滅
51 {unsigned char led_1;//數碼管個位
52 1 unsigned char led_2;//數碼管十位
53 1 unsigned char led_3;//數碼管百位
54 1 unsigned char led_4;//數碼管K位
55 1 unsigned char led_5;//數碼管10K位
C51 COMPILER V6.23a MAIN 04/24/2007 09:42:29 PAGE 2
56 1 unsigned char led_6;//數碼管100K位
57 1 unsigned char led_7;//數碼管m位
58 1 unsigned char led_8;//數碼管10m位
59 1
60 1 unsigned char code xsm[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
61 1 0x07,0x7f,0x6f,0x00};
62 1
63 1 led_8=(unsigned long)f_word/10000000;//提取十兆位
64 1 led_7=(unsigned long)f_word/1000000%10;//提取兆位
65 1 led_6=(unsigned long)f_word/100000%10;//提取100K位
66 1 led_5=(unsigned long)f_word/10000%10;//提取10K位
67 1 led_4=(unsigned long)f_word/1000%10;//提取1K位
68 1 led_3=(unsigned long)f_word/100%10;//提取百位
69 1 led_2=(unsigned long)f_word/10%10;//提取十位
70 1 led_1=(unsigned long)f_word%10;//提取個位
71 1
72 1 if(led_8==0) //高位為0消影
73 1 {led_8=0x0a;
74 2 if(led_7==0)
75 2 {led_7=0x0a;
76 3 if(led_6==0)
77 3 {led_6=0x0a;
78 4 if(led_5==0)
79 4 {led_5=0x0a;
80 5 if(led_4==0)
81 5 {led_4=0x0a;
82 6 if(led_3==0)
83 6 {led_3=0x0a;
84 7 if(led_2==0)
85 7 {led_2=0x0a;
86 8 if(led_1==0)
87 8 {led_1=0x0a;
88 9 }
89 8 }
90 7 }
91 6 }
92 5 }
93 4 }
94 3 }
95 2 }
96 1
97 1 if(XC==1)
98 1 {P0 = 00; // 關閉最右邊的一個,個位
99 2 P2 = 0x80;}
100 1 else
101 1 {led_1=xsm[led_1];//數轉碼
102 2 P0=0;
103 2 P2 = 0x80;// 選中最右邊的一個
104 2 P0=led_1;
105 2 dl_2ms();}//送碼
106 1
107 1 if(XC==2) //十位
108 1 {P0 = 00;
109 2 P2 = 0x40;
110 2 }
111 1 else
112 1 {led_2=xsm[led_2];//數轉碼
113 2 P0=0;
114 2 P2 = 0x40;//
115 2 P0=led_2;
116 2 dl_2ms();}//送碼
117 1
C51 COMPILER V6.23a MAIN 04/24/2007 09:42:29 PAGE 3
118 1 if(XC==3) //百位
119 1 {P0 = 00;
120 2 P2 = 0x20;
121 2 }
122 1 else
123 1 {led_3=xsm[led_3];//數轉碼
124 2 P0=0;
125 2 P2 = 0x20;//
126 2 P0=led_3;
127 2 dl_2ms();}//送碼
128 1
129 1 if(XC==4) //K位
130 1 {P0 = 00;
131 2 P2 = 0x10;
132 2 }
133 1 else
134 1 {led_4=xsm[led_4];//數轉碼
135 2 P0=0;
136 2 P2 = 0x10;//
137 2 P0=led_4;
138 2 dl_2ms();}//送碼
139 1
140 1 if(XC==5) //10K位
141 1 {P0 = 00;
142 2 P2 = 0x08;
143 2 }
144 1 else
145 1 {led_5=xsm[led_5];//數轉碼
146 2 P0=0;
147 2 P2 = 0x08;//
148 2 P0=led_5 ;
149 2 dl_2ms();}//送碼
150 1
151 1 if(XC==6) //100K位
152 1 {P0 = 00;
153 2 P2 = 0x04;
154 2 }
155 1 else
156 1 {led_6=xsm[led_6];//數轉碼
157 2 P0=0;
158 2 P2 = 0x04;//
159 2 P0=led_6 ;
160 2 dl_2ms();}//送碼
161 1
162 1 if(XC==7) //M位
163 1 {P0 = 00;
164 2 P2 = 0x02;
165 2 }
166 1 else
167 1 {led_7=xsm[led_7];//數轉碼
168 2 P0=0;
169 2 P2 = 0x02;//
170 2 P0=led_7 ;
171 2 dl_2ms();}//送碼
172 1
173 1 if(XC==8) //10M位,最左邊的數碼管
174 1 {P0 = 00;
175 2 P2 = 0x01;
176 2 }
177 1 else
178 1 {led_8=xsm[led_8];//數轉碼
179 2 P0=0;
C51 COMPILER V6.23a MAIN 04/24/2007 09:42:29 PAGE 4
180 2 P2 = 0x01;//
181 2 P0=led_8;
182 2 dl_2ms();}//送碼
183 1 }
184
185 //函數編號4,串行發送16位數據
186 void send_2B(unsigned int word)
187 {unsigned char i;
188 1 EA=0;//時序嚴格要求區,必須關閉中斷
189 1 SCLK=1;
190 1 SDATA=0;
191 1 FSYNC=1;
192 1 _nop_ ();
193 1 _nop_ ();
194 1 FSYNC=0;
195 1 for (i=0;i<16;i++)
196 1 {SCLK=1;
197 2 if(word&0x8000)
198 2 {SDATA=1;}
199 2 else
200 2 {SDATA=0;}
201 2 _nop_ ();
202 2 SCLK=0;
203 2 word=word<<1;
204 2 SCLK=1;
205 2 SDATA=0;
206 2 }
207 1 FSYNC=1;
208 1 EA=1;//操作完畢后開啟中斷
209 1 }
210
211
212 //函數編號編號5,將期望頻率值換算為AD9833控制字并發
213 void frejs(float fout)//頻率計算,處理。頻率控制函數,入口參數為頻率值,經該函數處理,直接控制AD9833輸出相
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -