1、硬件仿真图
硬件部分比较简单,当键盘按键按下时它的那一行、那一列的端口为低电平。因此,只要扫描行、列端口是否都为低电平就可以确定是哪个键被按下。
2、主程序流程图
程序的主要思想是:将按键抽象为字符,然后就是对字符的处理。将操作数分别转化为字符串存储,操作符存储为字符形式。然后调用compute()函数进行计算并返回结果。具体程序及看注释还有流程图。
3、Altium Designer画的PCB图
4、程序源代码
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar operand1[9], operand2[9];
uchar operator;
void delay(uint);
uchar keyscan();
void disp(void);
void buf(uint value);
uint compute(uint va1,uint va2,uchar optor);
uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dbuf[8] = {10,10,10,10,10,10,10,10};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan()
{
uchar skey;
P1 = 0xfe;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xee: skey = '7'; break;
case 0xde: skey = '8'; break;
case 0xbe: skey = '9'; break;
case 0x7e: skey = '/'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xfd;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xed: skey = '4'; break;
case 0xdd: skey = '5'; break;
case 0xbd: skey = '6'; break;
case 0x7d: skey = '*'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xfb;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xeb: skey = '1'; break;
case 0xdb: skey = '2'; break;
case 0xbb: skey = '3'; break;
case 0x7b: skey = '-'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xf7;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xe7: skey = '$'; break;
case 0xd7: skey = '0'; break;
case 0xb7: skey = '='; break;
case 0x77: skey = '+'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
return skey;
}
void main()
{
uint value1, value2, value;
uchar ckey, cut1 = 0, cut2 = 0;
uchar operator;
uchar i, bool = 0;
init:
buf(0);
disp();
value = 0;
cut1 = cut2 = 0;
bool = 0;
for(i = 0;i < 9;i++)
{
operand1[i] = '\0';
operand2[i] = '\0';
}
while(1)
{
ckey = keyscan();
if(ckey != '#')
{
if(isdigit(ckey))
{
switch(bool)
{
case 0:
operand1[cut1] = ckey;
operand1[cut1+1] = '\0';
value1 = atoi(operand1);
cut1++;
buf(value1);
disp();
break;
case 1:
operand2[cut2] = ckey;
operand2[cut2+1] = '\0';
value2 = atoi(operand2);
cut2++;
buf(value2);
disp();
break;
default: break;
}
}
else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
{
bool = 1;
operator = ckey;
buf(0);
dbuf[7] = 10;
disp();
}
else if(ckey == '=')
{
value = compute(value1,value2,operator);
buf(value);
disp();
while(1)
{
ckey = keyscan();
if(ckey == '$')
goto init;
else
{
buf(value);
disp();
}
}
}
else if(ckey == '$')
{ goto init;}
}
disp();
}
}
uint compute(uint va1,uint va2,uchar optor)
{
uint value;
switch(optor)
{
case '+' : value = va1+va2; break;
case '-' : value = va1-va2; break;
case '*' : value = va1*va2; break;
case '/' : value = va1/va2; break;
default : break;
}
return value;
}
void buf(uint val)
{
uchar i;
if(val == 0)
{
dbuf[7] = 0;
i = 6;
}
else
for(i = 7; val > 0; i--)
{
dbuf[i] = val % 10;
val /= 10;
}
for( ; i > 0; i--)
dbuf[i] = 10;
}
void disp(void)
{
uchar bsel, n;
bsel=0x01;
for(n=0;n<8;n++)
{
P2=bsel;
P0=table[dbuf[n]];
bsel=_crol_(bsel,1);
delay(3);
P0=0xff;
}
}
扩展资料:
PROTEUS 是单片机课堂教学的先进助手
PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台
随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。相信在单片机开发应用中PROTEUS也能茯得愈来愈广泛的应用。
使用Proteus 软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;
在单片机课程设计和全国大学生电子设计竞赛中,我们使用 Proteus 开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。
实践证明,在使用 Proteus 进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。因此,Proteus 有较高的推广利用价值。
参考资料来源:百度百科-protues
程序和电路图如下:
#include
#define DIN P1_0
#define CLK P1_2
#define LOAD P1_1
unsigned char key_h,key_l,key_code;
unsigned char ADS,i,j,m,n;
unsigned char n_bit=0;
unsigned char flag=0;
unsigned char key_num[16]={7,8,9,'/',4,5,6,'*',1,2,3,'-','c',0,'=','+'};
unsigned char data1[6]={0};
unsigned char data2[6]={0};
unsigned int result;
void delay(unsigned int n)
{
while(n--);
}
void send(unsigned char addr,unsigned char dat)
{
LOAD=0;
i=0;
while(i<16)
{
if(i<8) ADS=addr;
else
ADS=dat;
for(j=8;j>=1;j--)
{
DIN=ADS&0x80;
ADS<<=1;
CLK=1;
CLK=0;
}
i+=8;
}
LOAD=1;
}
void clear()
{
for(m=1;m<=5;m++)
send(m,0xff);
send(0x06,0);
n_bit=6;
}
void calc()
{
unsigned int temp1;
unsigned int tmep2;
unsigned char temp;
temp1=data1[5]+data1[4]*10+data1[3]*100+data1[2]*1000+data1[1]*10000;
tmep2=data2[5]+data2[4]*10+data2[3]*100+data2[2]*1000+data2[1]*10000;
switch(flag)
{
case 1: result=temp1+tmep2; break;
case 2: result=temp1-tmep2; break;
case 3: result=temp1*tmep2; break;
case 4: result=temp1/tmep2; break;
}
clear();
for(n=6;n>1;n--)
{
temp=(unsigned char)result%10;
if(temp) send(n,temp);
result/=10;
data2[n-1]=data1[n-1]=0;
}
flag=0;
while((P2&0xf0)!=0xf0);
}
void keyScan() //键盘扫描程序
{
if((P2&0xf0)!=0xf0)
delay(20);
if((P2&0xf0)!=0xf0)
{
key_h=P2&0xf0;
P2=0xf0|0x01;
if((P2&0xf0)==0xf0) key_l=0;
P2=0xf0|0x02;
if((P2&0xf0)==0xf0) key_l=1;
P2=0xf0|0x04;
if((P2&0xf0)==0xf0) key_l=2;
P2=0xf0|0x08;
if((P2&0xf0)==0xf0) key_l=3;
P2=0xf0;
switch((~P2)&0xf0)
{
case 0x10: key_h=0x0; break;
case 0x20: key_h=0x1; break;
case 0x40: key_h=0x2; break;
case 0x80: key_h=0x3; break;
}
key_code=key_l*4+key_h;
switch(key_code)
{
case 3: flag=4;n_bit=7;break; //+
case 7: flag=3;n_bit=7;break; //-
case 11: flag=2;n_bit=7;break; //*
case 15: flag=1;n_bit=7;break; ///
case 14: calc();n_bit=7;return; //=
case 12: clear();break; //C
default:
if(n_bit>1)
{
if(n_bit==7)
{
clear();
}
send(n_bit--,key_num[key_code]);
if(!flag)
data1[n_bit]=key_num[key_code];
else
data2[n_bit]=key_num[key_code];
}
}
while((P2&0xf0)!=0xf0);
}
}
void main(void)
{
P2=0xf0;
send(0x0c,0x01);
send(0x0b,0x05);
send(0x0a,0xf5);
send(0x09,0xff);
//
// send(0x01,0x8f);
// send(0x02,0x82);
// send(0x03,0x83);
// send(0x04,0x84);
// send(0x05,0x85);
// send(0x06,0x86);
// send(0x07,0x87);
// send(0x08,0x08);
clear();
n_bit=6;
while(1)
{
keyScan();
}
}
扩展资料:
Proteus 自从有了单片机也就有了开发系统,随着单片机的发展开发系统也在不断发展。 keil是一种先进的单片机集成开发系统。它代表着汇编语言单片机开发系统的最新发展,首创多项便利技术,将开发的编程/仿真/调试/写入/加密等所有过程一气呵成,中间不须任何编译或汇编。
使用方法如下——
1、将仿真器插入需仿真的用户板的CPU插座中,仿真器由用户板供电。
2、将仿真器的串行电缆和PC机接好,打开用户板电源。
3、通过Keil C 的IDE 开发仿真环境UV2 下载用户程序进行仿真、调试。
1、首先第一步就是要进行查找元器件并放入到原理图中,如下图所示。
2、接着就是要进行原理图连接根据网络标签的方式即可。
3、然后就是要进行编写程序,
程序源代码
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar operand1[9], operand2[9];
uchar operator;
void delay(uint);
uchar keyscan();
void disp(void);
void buf(uint value);
4、最后一步就是进行验证正确后编译程序在protues中加载HEX观察仿真结果是否正确,如下图所示。
1、首先第一步就是要进行查找元器件并放入到原理图中,如下图所示。
2、接着就是要进行原理图连接根据网络标签的方式即可。
3、然后就是要进行编写程序,
程序源代码
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar operand1[9], operand2[9];
uchar operator;
void delay(uint);
uchar keyscan();
void disp(void);
void buf(uint value);
4、最后一步就是进行验证正确后编译程序在protues中加载HEX观察仿真结果是否正确,如下图所示。
扩展资料
电脑仿真:
单片机有了开发系统,随着单片机的发展开发系统也在不断发展。 keil是一种先进的单片机集成开发系统。
它代表着汇编语言单片机开发系统的最新发展,首创多项便利技术,将开发的编程/仿真/调试/写入/加密等所有过程一气呵成,中间不须任何编译或汇编。
功能特性:
1、可以仿真63K程序空间,接近64K 的16位地址空间;
2、可以仿真64Kxdata 空间,全部64K 的16位地址空间;
3、可以真实仿真全部32 条IO脚;
4,完全兼容keilC51 UV2 调试环境,可以通过UV2 环境进行单步,断点, 全速等操作;
5、可以使用C51语言或者ASM汇编语言进行调试 ;
6、可以非常方便地进行所有变量观察,包括鼠标取值观察,即鼠标放在某 变量上就会立即显示出它此的值;
7、可选 使用用户晶振,支持0-40MHZ晶振频率;
8、片上带有768字节的xdata,您可以在仿真时选 使用他们,进行xdata 的仿真;
9、可以仿真双DPTR 指针;
10、可以仿真去除ALE 信号输出. ;
11、自适应300-38400bps 的所有波特率通讯;
12、体积非常细小,非常方便插入到用户板中.插入时紧贴用户板,没有连接电缆,这样可以有效地减少运行中的干扰,避免仿真时出现莫名其妙的故障;
13、仿真插针采用优质镀金插针,可以有效地防止日久生锈,选择优质园脚IC插座,保护仿真插针,同时不会损坏目标板上的插座. ;
14,仿真时监控和用户代码分离,不可能产生不能仿真的软故障;
15、RS-232接口不计成本采用MAX202集成电路,串行通讯稳定可靠,绝非一般三极管的简易电路可比。
功能限制:
仿真器占用单片机串口及定时器2,与Keil C(PC)通讯,故不支持串口及定时器2 的仿真功能。全速运行时单片机串口及定时器2 可供用户使用。
使用方法:
1、将仿真器插入需仿真的用户板的CPU插座中,仿真器由用户板供电;
2、将仿真器的串行电缆和PC机接好,打开用户板电源;
3、通过Keil C 的IDE 开发仿真环境UV2 下载用户程序进行仿真、调试。
刚做过,发给你参考下
这是原理图
51单片机简易计算器程序:
#include
#include
#define uchar unsigned char
#define uint unsigned int
//---------定义引脚--------------------
bit clr=0;
bit ok=0;
bit xiaoshu=0;
bit jiego=0;
bit first_1=1;
bit first_2=1;
sbit dout = P3^2;
sbit load = P2^0;
sbit din = P2^1;
sbit dclk = P2^2;
sbit beer=P0^1;
sbit LCD1602_RS=P2^3;
sbit LCD1602_RW=P2^4;
sbit LCD1602_E=P2^5;
//---------定义变量--------------------
uchar ch451_key=0xff;
uchar yun_sign;
uchar xiabiao=0;
uchar tab[32];
uchar tab1[]={"welcome to use!"};
uchar tab2[]={" make by JunRu!"};
uchar tab3[]={"ERR0R"};
float opr_1=0,opr_temp=0,end=0,a;
//---------声明函数--------------------
void ch451_init(void); //CH451初始化
void ch451_write(uint command);//写命令或数据到ch451
uchar ch451_read(void); //读按键值
uchar get_char(void);
void LCD_init(void);//初始化;
void delay(unsigned int k);//延时程序
void LCD_inter_command(unsigned char command);//写入控制字
void LCD_inter_dat(unsigned char dat);//写入要显示的数据
void set_xy(unsigned char x,unsigned char y);//找地址
void write(unsigned char date);//写入字符
void lcdbusy();//查忙时
void display(void);
void spec(void);
void get_end(void);
void hun_he(uchar n);
//-------- 主函数----------------------
void main()
{
uchar i;
LCD_init();//LCD初始化;
ch451_init();//CH451初始化
EA = 1;//打开中断
LCD_inter_command(0x01);//清屏
for(i=0;i<=14;i++)
{
LCD_inter_dat(tab1[i]);
beer=0;
delay(4000);//延时
beer=1;
}
LCD_inter_command(0xc0);//从第二行开始显示
for(i=0;i<=14;i++)
{
LCD_inter_dat(tab2[i]);
beer=0;
delay(4000);//延时
beer=1;
}
delay(0xffff);
delay(0xffff);
LCD_inter_command(0x01);
while(1)
{
if(ok)
{
display();
ok=0;clr=1;
}
}
}
//----------子函数--------------------
void hun_he(uchar n)
{int j;
switch(n)
{
case '+':opr_temp=opr_temp+opr_1;break;
case '-':opr_temp=opr_temp-opr_1;break;
case '*':opr_temp=opr_temp*opr_1;break;
case '/':
{
if(a==0)//减数为零显错
{ LCD_inter_command(0xc0);
for(j=0;j<=4;j++)
{
LCD_inter_dat(tab3[j]);
beer=0;
delay(4000);//延时
beer=1;
}
}
else
{opr_temp=opr_temp/opr_1;}
break;
}
default:break;}
}
void ch451_init(void)//CH451初始化
{
EX0 = 1;
din = 0;
din = 1;
ch451_write(0x403); //开显示
ch451_write(0x580); //BCD译码方式
}
void ch451_write(uint command)//写命令或数据到ch451
{ uchar i;
EX0 = 0;
load = 0;
for(i=0;i<12;i++)
{
din = command&1;
dclk = 0;
command>>=1;
dclk = 1;
}
load = 1;
EX0 = 1;
}
uchar ch451_read(void)//读按键值
{ uchar key=0x07;
uchar i;
EX0=0;
load = 0;
for(i=0;i<4;i++) //将0111读入
{
din = key &1;
dclk = 0;
key>>=1;
dclk =1;
}
load = 1;
key = 0;
for(i=0;i<7;i++) //从CH451读出按键值
{
key<<=1;
key|= dout;
dclk =0;
dclk =1;
}
EX0 =1;
return key;
}
void EX0_ISR(void)interrupt 0 //中断程序
{
uchar temp;
ch451_key=ch451_read(); //将读出的按键值赋给变量
spec();
if(clr) {LCD_inter_command(0x01);clr=0;}
temp=get_char();
if(temp){tab[xiabiao++]=temp; LCD_inter_dat(temp);}
if(xiabiao>=16)LCD_inter_command(0xc0);//若大于16,则从第2行开始显示
if(ok) get_end();
beer=0;
delay(3000);
beer=1;
}
uchar get_char(void)
{
uchar dis=0;
uint temp=0,temp1=0;
switch(ch451_key)
{
case 0x40:dis='1';break;
case 0x41:dis='2';break;
case 0x42:dis='3';break;
case 0x48:dis='4';break;
case 0x49:dis='5';break;
case 0x4A:dis='6';break;
case 0x50:dis='7';break;
case 0x51:dis='8';break;
case 0x52:dis='9';break;
case 0x58:dis='0';break;
case 0x43:dis='+';break;
case 0x4B:dis='-';break;
case 0x53:dis='x';break;
case 0x5B:dis='/';break;
case 0x44:dis='!';break;
case 0x5A:dis='=';
ok=1; //遇到“=”,开始运算
break;
case 0x59:dis='.';break; //小数点
case 0x5C: //删除键
LCD_inter_command(0x01);
xiabiao=0;
break;
default: break;
}
return dis;
}
void spec(void) //特殊功能键
{
switch(ch451_key)
{
case 0x4C:LCD_inter_command(0x10);{if(xiabiao>0)xiabiao-=1;}break; //左移
case 0x54:LCD_inter_command(0x14);{xiabiao+=1;}break; //右移
default:break;
}
}
void delay(unsigned int k)//延时程序
{
while (k--);
}
void LCD_inter_command(unsigned char command)//写入控制字
{
delay(5000);
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_E=1;
P1=command;
LCD1602_E=0;
lcdbusy();
}
void LCD_init(void)//初始化;
{delay(5000);
LCD_inter_command(0x01);//清屏
delay(5000);
LCD_inter_command(0x38);//设置为8位的数据接口,两行显示,5、7点字符
delay(5000);
LCD_inter_command(0x0E);//显示打开,光标开并闪烁
delay(5000);
}
void LCD_inter_dat(unsigned char dat)//写入要显示的数据
{
delay(5000);
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_E=1;
P1=dat;
LCD1602_E=0;
lcdbusy();
}
void lcdbusy()//查忙
{
P1=0xFF;
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_E=1;
while((P1&0x80)==1);
}
void display(void) //转化在LCD上显示计算结果
{
int temp=end; //浮点数
int i;
uint xiao_temp;
uint xx; //浮点数的整数部分
if (end>-32769&&end<32768)
{
xx=fabs(end);
xiao_temp=(fabs(end)-xx)*1000;//取出浮点数的小数部分
LCD_inter_command(0xc0);
if(end<0) LCD_inter_dat('-');beer=0;delay(4000); beer=1;//判断是否为负数,若是则显示负号
if(xx>9999) LCD_inter_dat((xx/10000)%10+'0'); beer=0;delay(4000);beer=1;
if(xx>999) LCD_inter_dat((xx/1000)%10+'0');beer=0;delay(4000);beer=1; //在LCD上显示千位的数
if(xx>99)LCD_inter_dat((xx/100)%10+'0'); beer=0;delay(4000);beer=1;//百位
if(xx>9)LCD_inter_dat((xx/10)%10+'0');beer=0;delay(4000); beer=1;//十位
LCD_inter_dat(xx%10+'0');beer=0;delay(4000); beer=1;//个位
if(xiao_temp!=0) //显示小数部分
{
LCD_inter_dat('.');beer=0;delay(4000);beer=1;
LCD_inter_dat((xiao_temp/100)%10+'0');beer=0;delay(4000);beer=1;
LCD_inter_dat((xiao_temp/10)%10+'0');beer=0;delay(4000);beer=1;
LCD_inter_dat(xiao_temp%10+'0');beer=0;delay(4000);beer=1;
}
}
else {LCD_inter_command(0xc0);//从第二行开始显示
for(i=0;i<=4;i++)
{ LCD_inter_dat(tab3[i]);
beer=0;
delay(4000);//延时
beer=1;
}
}
}
void get_end(void)//计算子程序
{ float xiaoshu=1;
uchar fu_flag=0;
uchar xiao_flag=0;
uchar lianji_sign;
uchar i=0;
uchar j;
uchar n;//正负标记符
while(i<=xiabiao)
{
while(tab[i]<=0x39&&tab[i]>=0x30)
{
n=0;
opr_1*=10;
opr_1+=tab[i++]-0x30;
n='+';
}
switch(tab[i])
{
case '.': xiao_flag=1;break;//遇到小数点跳到“if(xiao_flag)”里
case '!': fu_flag=1;break;
case '+': xiaoshu=1;yun_sign='+';if(opr_temp==0){end=opr_temp=opr_1;}else hun_he(lianji_sign);opr_1=0;lianji_sign='+'; break;
case '-': xiaoshu=1;yun_sign='-';if(opr_temp==0){end=opr_temp=opr_1;}else hun_he(lianji_sign);opr_1=0;lianji_sign='-'; break;
case 'x': xiaoshu=1;yun_sign='x';if(opr_temp==0){end=opr_temp=opr_1;}else hun_he(lianji_sign);opr_1=0;lianji_sign='*';break;
case '/': xiaoshu=1;yun_sign='/';if(opr_temp==0){end=opr_temp=opr_1;}else hun_he(lianji_sign);a=opr_1;opr_1=0;lianji_sign='/';break;
case '=':
switch(yun_sign)//进行运算
{
case '+':end=opr_temp+opr_1;break;
case '-':end=opr_temp-opr_1;break;
case 'x':end=opr_temp*opr_1;break;
case '/':{
if(a==0)//减数为零显错
{ LCD_inter_command(0xc0);
for(j=0;j<=4;j++)
{
LCD_inter_dat(tab3[j]);
beer=0;
delay(4000);//延时
beer=1;
}
}
else
{end=opr_temp/opr_1;}
break;
}
default:break;
}
ok=1;//开始进行显示,标志位置1
xiabiao=0;//小数的标志位清零
break;
default:break;
}
i++;
if(xiao_flag)//表示小数
{
while(tab[i]<=0x39&&tab[i]>=0x30)
{
xiaoshu*=0.1;
switch(n)
{
case '+': opr_1=opr_1+(tab[i++]-0x30)*xiaoshu;break;
case '-': opr_1=opr_1-(tab[i++]-0x30)*xiaoshu; break ;
default:break; }
xiao_flag=0;
}
}
if(fu_flag)
{
while(tab[i]<=0x39&&tab[i]>=0x30)
{
n=0;
opr_1=-opr_1*10;
opr_1=-(opr_1+(tab[i++]-0x30));
n='-';
fu_flag=0;
}
}
}
opr_1=0;
opr_temp=0;
xiabiao=0;
xiaoshu=1;
}