📄 dds.lst
字号:
C51 COMPILER V7.50 DDS 12/21/2006 15:07:00 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DDS
OBJECT MODULE PLACED IN dds.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE dds.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <absacc.h>
2 #include <reg51.h>
3 #include <stdlib.h>
4 #include <math.h>
5 #include <intrins.h>
6 #include <lcdhead.h>
7 #define uchar unsigned char
8 #define uint unsigned int
9
10
11
12 sbit LOAD=P2^4; //送M值至寄存器
13 sbit FQ_UP=P2^6; //DDS显示
14 sbit RESET_PHASEREG=P2^5; //复位相位累加器
15
16 /*P1口用作LED显示线*/
17 sbit LED_CLK=P1^0; //LED时钟线
18 sbit LED_DAT=P1^1; //LED数据线
19
20 uchar count=0; //已经显示的位数
21 bit flag=0; //是否按了ENTER,为0表示没有按
22 uchar idata value[6]={0,0,0,0,0,0}; //存储显示的数值
23 uchar mh_data=0; //送给CPLD的频率步进值高位
24 uchar ml_data=0; //送给CPLD的频率步进值低位
25 uchar phase=0; //送给CPLD相位控制字
26
27 void display(uchar i);
28 /*数字'1','2','3','4','5','6','7','8','9','0'的七段码字库*/
29 const uchar code LED_FONT[11]={ //
30 0xFC, //0
31 0x60, //1
32 0xDA, //2
33 0xF2, //3
34 0x66, //4
35 0xB6, //5
36 0xBE, //6
37 0xE0, //7
38 0xFE, //8
39 0xF6, //9
40 0x00, //不显示
41 };
42
43 void init_IO()//初始化输入输出端口
44 {
45 1 uchar i;
46 1 P0 = 0xFF;
47 1 P1 = 0xFF;
48 1 RESET_PHASEREG=1; //禁止相位累加器工作
49 1 LOAD=0; //回送M控制线初始为低电平
50 1 P3 = 0xFF;
51 1 for(i=0;i<6;i++)
52 1 display(10);
53 1 }
54
55
C51 COMPILER V7.50 DDS 12/21/2006 15:07:00 PAGE 2
56 void init_int()//初始化中断
57 {
58 1 IE=0x81; //开外部中断0
59 1 IE0=0;
60 1 IT0=1; //外部中断0为跳变触发方式
61 1 EA=1; //CPU开中断
62 1 }
63
64 void display(uchar i)
65 {
66 1 uchar j,mask;
67 1 mask=0x01;
68 1 for(j=0;j<8;j++){
69 2 LED_CLK=0;
70 2 LED_DAT=( (LED_FONT[i]) & mask);
71 2 mask<<=1;
72 2 LED_CLK=1; //上升沿移位
73 2 }
74 1
75 1 displaynum(i,3,14+10*count);//在液晶屏显示数据i。
76 1 }
77
78 void clear_dds()
79 {
80 1 uchar i,j;
81 1 for(i=0;i<7;i++)
82 1 display(10);
83 1 if(count>0){
84 2 count-=1;
85 2 value[count]=0;
86 2 for(j=0;j<count;j++)
87 2 display(value[j]); //除最后一位外,重新显示
88 2 }
89 1 displaynum(10,3,14+10*count);
90 1 }
91
92 void reset_dds()
93 {
94 1 uchar i;
95 1 init_port();
*** WARNING C206 IN LINE 95 OF DDS.C: 'init_port': missing function-prototype
96 1 init_interrupt();
*** WARNING C206 IN LINE 96 OF DDS.C: 'init_interrupt': missing function-prototype
97 1 count=0;
98 1 flag=0;
99 1 for(i=0;i<6;i++)
100 1 value[i]=0; //各标志位和显示数据存储区清零
101 1 for(i=0;i<7;i++) //清空数码管显示
102 1 display(10);
103 1 for(i=0;i<6;i++)
104 1 displaynum(10,3,14+10*i);
105 1 }
106
107 void enter_dds()
108 {
109 1 uchar i;
110 1 float temp;
111 1 uint sum=0;
112 1 uint m_data=0;
113 1 uchar phase;
114 1 flag=1;
115 1 for(i=0;i<count;i++)
C51 COMPILER V7.50 DDS 12/21/2006 15:07:00 PAGE 3
116 1 sum=sum+value[i]*pow(10,count-i-1); //显示数据按权相加
117 1 temp=sum/0.964; //实际的分辨率为0.964
118 1 m_data=floor(temp);
119 1 if((temp-m_data)>=0.5){
120 2 m_data+=1;
121 2 }
122 1 LOAD=0;
123 1 ml_data=m_data; //频率步进值低位
124 1 mh_data=((m_data&0xFF00)>>8); //频率步进值高位
125 1 P0=mh_data;
126 1 LOAD=1; //上升沿送高位
127 1 _nop_();
128 1 _nop_();
129 1 _nop_();
130 1 LOAD=0;
131 1 P0=ml_data;
132 1 LOAD=1; //上升沿送低位
133 1 FQ_UP=0;
134 1 _nop_();
135 1 _nop_();
136 1 _nop_();
137 1 phase=sum%10;
138 1 FQ_UP=1; //dds输出新频率对应的波形
139 1 RESET_PHASEREG=0; //相位累加器读取增量寄存器中的值开始工作
140 1 }
141
142 main()
143 {
144 1 init_IO();
145 1 init_int();
146 1 clearscan();
147 1 huanying();//欢迎动画
148 1 please();//进入工作界面
149 1 _nop_();
150 1 _nop_();
151 1 _nop_();
152 1 while(1){} //等待中断
153 1 }
154
155 void interrupt_handle() interrupt 0
156 {
157 1 uchar disdata;
158 1 EA=0; //CPU关中断
159 1 disdata=P2&0x0F; //读取P2口的低四位显示数据编码
160 1 if(flag==0){ //没按确定键时
161 2 if(count<5){
162 3 switch(disdata){
163 4 case(0): display(0);
164 4 value[count]=0;
165 4 count+=1;
166 4 break;
167 4 case(1): display(1);
168 4 value[count]=1;
169 4 count+=1;
170 4 break;
171 4 case(2): display(2);
172 4 value[count]=2;
173 4 count+=1;
174 4 break;
175 4 case(3): display(3);
176 4 value[count]=3;
177 4 count+=1;
C51 COMPILER V7.50 DDS 12/21/2006 15:07:00 PAGE 4
178 4 break;
179 4 case(4): display(4);
180 4 value[count]=4;
181 4 count+=1;
182 4 break;
183 4 case(5): display(5);
184 4 value[count]=5;
185 4 count+=1;
186 4 break;
187 4 case(6): display(6);
188 4 value[count]=6;
189 4 count+=1;
190 4 break;
191 4 case(7): display(7);
192 4 value[count]=7;
193 4 count+=1;
194 4 break;
195 4 case(8): display(8);
196 4 value[count]=8;
197 4 count+=1;
198 4 break;
199 4 case(9): display(9);
200 4 value[count]=9;
201 4 count+=1;
202 4 break;
203 4 case(10): clear_dds();
204 4 break;
205 4 case(11): reset_dds();
206 4 break;
207 4 case(12): enter_dds();
208 4 break;
209 4 }
210 3 }
211 2 else{ //当显示了6位数据后数码管和液晶屏不再显示数据,只有功能键有效
212 3 switch(disdata){
213 4 case(10): clear_dds();
214 4 break;
215 4 case(11): reset_dds();
216 4 break;
217 4 case(12): enter_dds();
218 4 break;
219 4 }
220 3 }
221 2 }
222 1 else{ //按了确定键时,只有复位键有效
223 2 if(disdata==11)
224 2 reset_dds();
225 2 }
226 1 EA=1; //CPU开中断
227 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1659 ----
CONSTANT SIZE = 507 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 29
IDATA SIZE = 6 ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -