📄 main.lst
字号:
C51 COMPILER V7.20 MAIN 09/06/2007 15:49:45 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\software\up51v7200\C51\BIN\C51.EXE main.c DEBUG OBJECTEXTEND
line level source
1 /*********************************************************************************************************
-
2 **
3 ** PC control microprocessor by serial port
4 **
5 ** Copyright 2007, shiyueyong
6 **
7 ** All Rights Reserved
8 **
9 **
10 **--------------文件信息--------------------------------------------------------------------------------
11 **文 件 名: main.c
12 **创 建 人: 史跃勇
13 **最后修改日期: 2007年9月4日
14 **描 述: 在MCS51上实现计算器和时钟例子的主程序。
15 ** 包括用键盘进行加减乘除正余弦开方正余切E的幂等的运算及调整时钟和控制时钟显示
16 **------------------------------------------------------------------------------------------------------
17 ** 修改人:
18 ** 版 本:
19 ** 日 期:
20 ** 描 述:
21 **
22 **------------------------------------------------------------------------------------------------------
23 ********************************************************************************************************/
24 #include <reg51.h>
25 #include <stdio.h>
26 #include <ctype.h>
27 #include <stdlib.h>
28 #include <math.h>
29 #include <clock.c>
30 #include <calculator.c>
31 #define uchar unsigned char
32 #define uint unsigned int
33 uchar idata r_buf[20];
34 //uchar idata t_buf[20];
35 uchar yearh,yearl,month,day,hour,min,sec;
36 uchar workmode=0;
37 uchar r_pointer;
38 uchar t_pointer;
39 int tcnt;
40 bit display;
41 /*********************************************************************************************************
42 ** 函数名称: sysinit
43 ** 功能描述: 初始化函数,一般在多任务环境启动前调用
44 ** 输 入: 无
45 ** 输 出: 无
46 ** 全局变量: 无
47 ** 调用模块: 无
48 **
49 ** 作 者: 史跃勇
50 ** 日 期: 2007年9月4日
51 **-------------------------------------------------------------------------------------------------------
52 ** 修改人:
53 ** 日 期:
54 **------------------------------------------------------------------------------------------------------
C51 COMPILER V7.20 MAIN 09/06/2007 15:49:45 PAGE 2
55 ********************************************************************************************************/
-
56 void sysinit(void)
57 {
58 1 IP=0x00;
59 1 TMOD = 0x22; // 定时器1工作于8位自动重载模式, 用于产生波特率
60 1 TH1 = 0xFD; // 波特率9600
61 1 TL1 = 0xFD;
62 1
63 1 SCON = 0x50;
64 1 PCON &= 0x00; // 波特率不倍增
65 1 EA=1; // 开启中断总控制
66 1 ES=1; // 允许串口中断
67 1
68 1 TH0=0x06; // 设置定时器初值,靠TH0存储重装的计数值X0=256-250=6
69 1 TL0=0x06;
70 1 ET0=1; // 开启定时器T0中断允许
71 1 TR1=1; // 启动定时器1
72 1 TR0=1; // 启动定时器0
73 1 }
74 /*********************************************************************************************************
75 ** 函数名称: dividesign
76 ** 功能描述: 利用查表法迅速分辨出输入的命令并转换成可识别的代码
77 (例如:对于sum这条命令首先得到s.u.m的对应编号19,21,13.然后把sum的各位乘以相应的位权,在这里为
78 3*19+2*21+1*13=112.把结果列成表以供把命令翻译成代码,扩展指令时只需在tab2中加入一个值即可.)
79 ** 输 入: r_buf:数据接收缓冲区的内容
80 ** 输 出: sign:转化后的可识别命令代码
81 ** 全局变量: r_buf
82 ** 调用模块: tab1,tab2
83 **
84 ** 作 者: 史跃勇
85 ** 日 期: 2007年9月4日
86 **-------------------------------------------------------------------------------------------------------
87 ** 修改人:
88 ** 日 期:
89 **------------------------------------------------------------------------------------------------------
90 ********************************************************************************************************/
91 /*英文字母ASCII表和指令识别内码表tab1[27],tab[15]*/
92 uchar idata tab1[27]=
93 {0x00,
94 0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d, //abcdefghigklm的ASCII码
95 0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a //nopqrstuvwxyz的ASCII码
96 };
97 uchar idata tab2[18]=
98 {0,
99 112,101,105,52,89,58,109,23,44,81,34,91,49,107,76,59,79 //sum,sub,mux,div,sin,cos,sqrt,cal,clk,send,date
-,time,dis,out,tan,cot,exp,log
100 };
101 /*************************************************************/
102 uchar dividesign(uchar *string)
103 {
104 1 char order[2];
105 1 uchar i,j,method,sign;
106 1 for(i=0;i<=2;i++)
107 1 {
108 2 for(j=0;j<=26;j++){if(tab1[j]==string[i])order[i]=j;}
109 2 }
110 1 method=3*order[0]+2*order[1]+order[2];
111 1 i=0;
112 1 while((tab2[i]!=method)&&(i<=17)){i++;}
113 1 sign=i;
114 1 if(sign==8){workmode=1;return(0);}
C51 COMPILER V7.20 MAIN 09/06/2007 15:49:45 PAGE 3
115 1 else if(sign==9){workmode=2;return(0);}
116 1 else{return(sign);}
117 1 }
118 /**********************主任务***********************************/
119
120 /*********************************************************************************************************
121 ** 函数名称: command
122 ** 功能描述: 命令处理任务,高层命令由这个任务执行,相当于应用程序
123 ** 输 入: 无
124 ** 输 出: 无
125 ** 全局变量: 无
126 ** 调用模块: calculation();clock();dividesign();tab1[];tab[2]
127 **
128 ** 作 者: 史跃勇
129 ** 日 期: 2007年9月4日
130 **-------------------------------------------------------------------------------------------------------
131 ** 修改人:
132 ** 日 期:
133 **------------------------------------------------------------------------------------------------------
134 ********************************************************************************************************/
135 void command(void)
136 {uchar p;uchar i,j,k;uchar idata buf[10],suf[10];float idata num1,num2;
137 1 p=dividesign(r_buf);
138 1 if(p!=0)
139 1 {
140 2 if(workmode!=0)
141 2 {
142 3 for(i=0;i<=10;i++){buf[i]=0;suf[i]=0;}i=0;j=0;
143 3 while((isdigit(r_buf[i])!=1)&&(i<=20)){i++;}
144 3 while(((isdigit(r_buf[i])==1)||(r_buf[i])==0x2e)&&(i<=20)){buf[j]=r_buf[i];i++;j++;}
145 3 num1=atof(buf);k=0;
146 3 while((isdigit(r_buf[i])!=1)&&(i<=20)){i++;}
147 3 while(((isdigit(r_buf[i])==1)||(r_buf[i])==0x2e)&&(i<=20)){suf[k]=r_buf[i];i++;k++;}
148 3 num2=atof(suf);
149 3 }
150 2 switch(workmode)
151 2 {
152 3 case 1:
153 3 p=dividesign(r_buf);
154 3 calculator(p,num1,num2);
155 3 break;
156 3 case 2:
157 3 p=dividesign(r_buf);
158 3 clock(p,num1);
159 3 break;
160 3 default:
161 3 break;
162 3 }
163 2 }
164 1 }
165 /*********************************************************************************************************
166 ** 函数名称: main
167 ** 功能描述: 主函数,用户程序从这里执行
168 ** 输 入: 无
169 ** 输 出: 无
170 ** 全局变量: 无
171 ** 调用模块: sysinit()
172 **
173 ** 作 者: 史跃勇
174 ** 日 期: 2007年9月4日
175 **-------------------------------------------------------------------------------------------------------
176 ** 修改人:
C51 COMPILER V7.20 MAIN 09/06/2007 15:49:45 PAGE 4
177 ** 日 期:
178 **------------------------------------------------------------------------------------------------------
179 ********************************************************************************************************/
180 main()
181 {
182 1 sysinit();
183 1 while(1);
184 1 }
185 /*********************************************************************************************************
186 ** 函数名称: UART
187 ** 功能描述: 串口中断处理程序
188 ** 输 入: 无
189 ** 输 出: 无
190 ** 全局变量:r_buf,t_buf,out
191 ** 调用模块:trans_data(),rece_data();command();
192 **
193 ** 作 者: 史跃勇
194 ** 日 期: 2007年9月4日
195 **-------------------------------------------------------------------------------------------------------
196 ** 修改人:
197 ** 日 期:
198 **------------------------------------------------------------------------------------------------------
199 ********************************************************************************************************/
200 void UART(void) interrupt 4
201 {
202 1 unsigned char dataBUF;
203 1 if(RI==1)
204 1 {
205 2 RI=0;
206 2 display=0;
207 2 dataBUF=SBUF;
208 2 SBUF=dataBUF;
209 2 r_buf[r_pointer++]=dataBUF;
210 2 if(dataBUF==0x0d)
211 2 {
212 3 r_pointer=0;
213 3 command();
214 3 }
215 2 else if(dataBUF=='\b')
216 2 {
217 3 r_pointer--;
218 3 r_buf[r_pointer--]=0;
219 3 }
220 2 }
221 1 /*if(TI==1)
222 1 {
223 1 TI=0;
224 1 {
225 1 if(t_buf[t_pointer-2]=='\r'||t_buf[t_pointer-1]=='\n')
226 1 {
227 1 t_pointer=0;
228 1 }
229 1
230 1 else
231 1 {
232 1 SBUF=t_buf[t_pointer++];
233 1 }
234 1 }
235 1 }*/
236 1 }
237 /**********************end****************************************/
238
C51 COMPILER V7.20 MAIN 09/06/2007 15:49:45 PAGE 5
239
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2127 ----
CONSTANT SIZE = 330 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 34
IDATA SIZE = 65 70
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -