📄 main.c
字号:
/*********************************************************************************************************
**
** PC control microprocessor by serial port
**
** Copyright 2007, shiyueyong
**
** All Rights Reserved
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: main.c
**创 建 人: 史跃勇
**最后修改日期: 2007年9月4日
**描 述: 在MCS51上实现计算器和时钟例子的主程序。
** 包括用键盘进行加减乘除正余弦开方正余切E的幂等的运算及调整时钟和控制时钟显示
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <reg51.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <clock.c>
#include <calculator.c>
#define uchar unsigned char
#define uint unsigned int
uchar idata r_buf[20];
//uchar idata t_buf[20];
uchar yearh,yearl,month,day,hour,min,sec;
uchar workmode=0;
uchar r_pointer;
uchar t_pointer;
int tcnt;
bit display;
/*********************************************************************************************************
** 函数名称: sysinit
** 功能描述: 初始化函数,一般在多任务环境启动前调用
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 史跃勇
** 日 期: 2007年9月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void sysinit(void)
{
IP=0x00;
TMOD = 0x22; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50;
PCON &= 0x00; // 波特率不倍增
EA=1; // 开启中断总控制
ES=1; // 允许串口中断
TH0=0x06; // 设置定时器初值,靠TH0存储重装的计数值X0=256-250=6
TL0=0x06;
ET0=1; // 开启定时器T0中断允许
TR1=1; // 启动定时器1
TR0=1; // 启动定时器0
}
/*********************************************************************************************************
** 函数名称: dividesign
** 功能描述: 利用查表法迅速分辨出输入的命令并转换成可识别的代码
(例如:对于sum这条命令首先得到s.u.m的对应编号19,21,13.然后把sum的各位乘以相应的位权,在这里为
3*19+2*21+1*13=112.把结果列成表以供把命令翻译成代码,扩展指令时只需在tab2中加入一个值即可.)
** 输 入: r_buf:数据接收缓冲区的内容
** 输 出: sign:转化后的可识别命令代码
** 全局变量: r_buf
** 调用模块: tab1,tab2
**
** 作 者: 史跃勇
** 日 期: 2007年9月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*英文字母ASCII表和指令识别内码表tab1[27],tab[15]*/
uchar idata tab1[27]=
{0x00,
0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d, //abcdefghigklm的ASCII码
0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a //nopqrstuvwxyz的ASCII码
};
uchar idata tab2[18]=
{0,
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
};
/*************************************************************/
uchar dividesign(uchar *string)
{
char order[2];
uchar i,j,method,sign;
for(i=0;i<=2;i++)
{
for(j=0;j<=26;j++){if(tab1[j]==string[i])order[i]=j;}
}
method=3*order[0]+2*order[1]+order[2];
i=0;
while((tab2[i]!=method)&&(i<=17)){i++;}
sign=i;
if(sign==8){workmode=1;return(0);}
else if(sign==9){workmode=2;return(0);}
else{return(sign);}
}
/**********************主任务***********************************/
/*********************************************************************************************************
** 函数名称: command
** 功能描述: 命令处理任务,高层命令由这个任务执行,相当于应用程序
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: calculation();clock();dividesign();tab1[];tab[2]
**
** 作 者: 史跃勇
** 日 期: 2007年9月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void command(void)
{uchar p;uchar i,j,k;uchar idata buf[10],suf[10];float idata num1,num2;
p=dividesign(r_buf);
if(p!=0)
{
if(workmode!=0)
{
for(i=0;i<=10;i++){buf[i]=0;suf[i]=0;}i=0;j=0;
while((isdigit(r_buf[i])!=1)&&(i<=20)){i++;}
while(((isdigit(r_buf[i])==1)||(r_buf[i])==0x2e)&&(i<=20)){buf[j]=r_buf[i];i++;j++;}
num1=atof(buf);k=0;
while((isdigit(r_buf[i])!=1)&&(i<=20)){i++;}
while(((isdigit(r_buf[i])==1)||(r_buf[i])==0x2e)&&(i<=20)){suf[k]=r_buf[i];i++;k++;}
num2=atof(suf);
}
switch(workmode)
{
case 1:
p=dividesign(r_buf);
calculator(p,num1,num2);
break;
case 2:
p=dividesign(r_buf);
clock(p,num1);
break;
default:
break;
}
}
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数,用户程序从这里执行
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: sysinit()
**
** 作 者: 史跃勇
** 日 期: 2007年9月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
main()
{
sysinit();
while(1);
}
/*********************************************************************************************************
** 函数名称: UART
** 功能描述: 串口中断处理程序
** 输 入: 无
** 输 出: 无
** 全局变量:r_buf,t_buf,out
** 调用模块:trans_data(),rece_data();command();
**
** 作 者: 史跃勇
** 日 期: 2007年9月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UART(void) interrupt 4
{
unsigned char dataBUF;
if(RI==1)
{
RI=0;
display=0;
dataBUF=SBUF;
SBUF=dataBUF;
r_buf[r_pointer++]=dataBUF;
if(dataBUF==0x0d)
{
r_pointer=0;
command();
}
else if(dataBUF=='\b')
{
r_pointer--;
r_buf[r_pointer--]=0;
}
}
/*if(TI==1)
{
TI=0;
{
if(t_buf[t_pointer-2]=='\r'||t_buf[t_pointer-1]=='\n')
{
t_pointer=0;
}
else
{
SBUF=t_buf[t_pointer++];
}
}
}*/
}
/**********************end****************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -