当前位置:首页 » 课程大全 » 51单片机计算器课程设计

51单片机计算器课程设计

发布时间: 2020-11-29 20:52:04

Ⅰ 怎样用51单片机做计算器啊

1、首先第一步就是要进行查找元器件并放入到原理图中,如下图所示。



(1)51单片机计算器课程设计扩展阅读


电脑仿真:

单片机有了开发系统,随着单片机的发展开发系统也在不断发展。 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<reg51.h>
#define uchar unsigned char;
uchar LED1,LED2,LED3,LED4;
uchar keyval,calflag,s_dat,d_dat;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned int number,r_dat;

void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
void dealdat()
{
switch(calflag)
{
case 0:
r_dat=s_dat+d_dat;
break;
case 1:
r_dat=s_dat-d_dat;
break;
case 2:
r_dat=s_dat*d_dat;
break;
case 3:
r_dat=s_dat/d_dat;
break;
default:break;
}
LED1=(r_dat/1000)%10;
LED2=(r_dat/100)%10;
LED3=(r_dat/10)%10;
LED4=r_dat%10;
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}

void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}

void t0isr() interrupt 1
{
TH0=0xf4;
TL0=0x48;
switch(number)
{
case 0:P2=0x04;P0=distab[LED1];break;
case 1:P2=0x08;P0=distab[LED2];break;
case 2:P2=0x01;P0=distab[LED3];break;
case 3:P2=0x02;P0=distab[LED4];break;
default:break;
}
number++;
if(number>3)number=0;
}
main()
{
TMOD = 0x01;
number = 0;
TH0=0xf4;
TL0=0x48;
TR0=1;
ET0=1;
EA=1;
LED1=0;
LED2=0;
LED3=0;
LED4=0;
while(1)
{
getkey();
switch(keyval)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
LED3=LED4;
LED4=keyval;
LED1=0;
LED2=0;
break;
case 10:break;//"ON"
case 11://"="
d_dat=LED3*10+LED4;
dealdat();
break;
case 12://"/"
calflag=3;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 13://"*"
calflag=2;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 14://"-"
calflag=1;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 15://"+"
calflag=0;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
default:break;
}
}
}

Ⅲ 基于51单片机的简易计算器设计,急

^

//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零 表3-1 3.2 计算器的软件设计

#include<reg51.h> //头文件

#define uint unsigned int //

#define uchar unsigned char

sbit lcden=P2^3; //定义引脚

sbit rs=P2^4;

sbit rw=P2^0;

sbit busy=P0^7;

char i,j,temp,num,num_1;

long a,b,c; //a,第一个数 b,第二个数 c,得数

float a_c,b_c;

uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号

uchar code table[]={ 7,8,9,0, 4,5,6,0, 1,2,3,0, 0,0,0,0};

uchar code table1[]={

7,8,9,0x2f-0x30,

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30};

void delay(uchar z) // 延迟函数

{

uchar y;

for(z;z>0;z--)

for(y=0;y<110;y++);

} void check() // 判断忙或空闲

{

do{

P0=0xFF;

rs=0; //指令

rw=1; //读

lcden=0; //禁止读写

delay(1); //等待,液晶显示器处理数据

lcden=1; //允许读写

}while(busy==1); //判断是否为空闲,1为忙,0为空闲

}

void write_com(uchar com) // 写指令函数

{

P0=com; //com指令付给P0口

rs=0;

rw=0;

lcden=0;

check();

lcden=1;

}

void write_date(uchar date) // 写数据函数

{

P0=date;

rs=1;

rw=0;

lcden=0;

check();

lcden=1;

}

void init() //初始化

{

num=-1;

lcden=1; //使能信号为高电平

write_com(0x38); //8位,2行

write_com(0x0c); //显示开,光标关,不闪烁*/

write_com(0x06); //增量方式不移位 显竟獗暌贫 柚?

write_com(0x80); //检测忙信号

write_com(0x01); //显示开,光标关,不闪烁

num_1=0;

i=0;

j=0;

a=0; //第一个参与运算的数

b=0; //第二个参与运算的数

c=0;

flag=0; //flag表示是否有符号键按下,

fuhao=0; // fuhao表征按下的是哪个符号

}

void keyscan() // 键盘扫描程序

{

P3=0xfe;

if(P3!=0xfe)

{

delay(20); //延迟20ms

if(P3!=0xfe)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=0;

break;

case 0xd0:num=1;

break;

case 0xb0:num=2;

break;

case 0x70:num=3;

break;

}

}

while(P3!=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=4;//4表示除号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfd;

if(P3!=0xfd)

{

delay(5);

if(P3!=0xfd)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=4;

break;

case 0xd0:num=5;

break;

case 0xb0:num=6;

break;

case 0x70:num=7;

break;

}

}

while(P3!=0xfd);

if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=3;//3表示乘号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfb; if(P3!=0xfb)

{

delay(5);

if(P3!=0xfb)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=8;

break;

case 0xd0:num=9;

break;

case 0xb0:num=10;

break;

case 0x70:num=11;

break;

}

}

while(P3!=0xfb);

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

{

if(j!=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else if(num==11)//如果按下的是'-'

{

flag=1;

fuhao=2;//2表示减号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xf7;

if(P3!=0xf7)

{

delay(5);

if(P3!=0xf7)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=12;

break;

case 0xd0:num=13;

break;

case 0xb0:num=14;

break;

case 0x70:num=15;

break;

}

}

while(P3!=0xf7);

switch(num)

{

case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"

break;

case 13:{ //按下的是"0"

if(flag==0) //没有按过符号键

{

a=a*10;

write_date(0x30);

P1=0;

}

else if(flag==1)//如果按过符号键

{

b=b*10;

write_date(0x30);

}

}

break;

case 14:{j=1;

if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处

write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格

c=a+b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d); //再写"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==2){write_com(0x80+0x4f); //光标前进至第二行最后一个显示处

write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格

//(这个照理说顺序不对,可显示和上段一样)

if(a-b>0)

c=a-b;

else

c=b-a;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

if(a-b<0)

write_date(0x2d);

write_date(0x3d); //再写"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==3){write_com(0x80+0x4f);

write_com(0x04);

c=a*b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==4){write_com(0x80+0x4f);

write_com(0x04);

i=0;

c=(long)(((float)a/b)*1000);

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

i++;

if(i==3)

write_date(0x2e);

}

if(a/b<=0)

write_date(0x30);

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

}

break;

case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}

break;

}

}

}


main()

{

init();

while(1)

{

keyscan();

}

}

Ⅳ 怎么用51单片机做简易计算器

你好!
单片机做计算器的设计,本身就是难点;
你是用仿真还是要做实物呢?
最多计算位数需要几位?

Ⅳ 求助各位大神:用51单片机制作的简单计算器程序

#include<reg51.h>
#define uchar unsigned char;
uchar LED1,LED2,LED3,LED4;
uchar keyval,calflag,s_dat,d_dat;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned int number,r_dat;
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
void dealdat()
{
switch(calflag)
{
case 0:
r_dat=s_dat+d_dat;
break;
case 1:
r_dat=s_dat-d_dat;
break;
case 2:
r_dat=s_dat*d_dat;
break;
case 3:
r_dat=s_dat/d_dat;
break;
default:break;
}
LED1=(r_dat/1000)%10;
LED2=(r_dat/100)%10;
LED3=(r_dat/10)%10;
LED4=r_dat%10;
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}
void t0isr() interrupt 1
{
TH0=0xf4;
TL0=0x48;
switch(number)
{
case 0:P2=0x04;P0=distab[LED1];break;
case 1:P2=0x08;P0=distab[LED2];break;
case 2:P2=0x01;P0=distab[LED3];break;
case 3:P2=0x02;P0=distab[LED4];break;
default:break;
}
number++;
if(number>3)number=0;
}
main()
{
TMOD = 0x01;
number = 0;
TH0=0xf4;
TL0=0x48;
TR0=1;
ET0=1;
EA=1;
LED1=0;
LED2=0;
LED3=0;
LED4=0;
while(1)
{
getkey();
switch(keyval)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
LED3=LED4;
LED4=keyval;
LED1=0;
LED2=0;
break;
case 10:break; //"ON"
case 11: //"="
d_dat=LED3*10+LED4;
dealdat();
break;
case 12: //"/"
calflag=3;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 13: //"*"
calflag=2;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 14: //"-"
calflag=1;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 15: //"+"
calflag=0;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
default:break;
}
}
}

Ⅵ 51单片机做简易计算器

这样的一个计算器相信应该在一两天时间都可以做好,这最好自己去做,不是很复杂的系统

Ⅶ 51单片机 简易计算器

浮点是单片机的弱项,初学难度有点大。

用keil C51,加入
#include<math.h>
就行了。
但你要注意了版!要进行浮点运算,你的程序权存储器一定要大,因为一个乘除法需要几百个字节,开方需要更多,而且好像算得不太准。慎用!

乘法,除法 用加减法代替!!
平方开放 再想想办法。

单片机忌违浮点运算!

Ⅷ 课程设计:用51单片机设计一个简易计算器

‘哦啦啦啊呀呀有个子系统好吗啉了解我在不在’

Ⅸ 用51单片机实现一个简单计算器的功能

给你一个参考程序,这个是可行的哦,你看看这个程序
#include <</font>reg51.h>
#include <</font>intrins.h>
#include <</font>ctype.h>
#include <</font>stdlib.h>
#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 <</font> 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<</font>8;n++)
{
P2=bsel;
P0=table[dbuf[n]];
bsel=_crol_(bsel,1);
delay(3);
P0=0xff;
}
}

热点内容
武汉大学学生会辅导员寄语 发布:2021-03-16 21:44:16 浏览:612
七年级学生作文辅导学案 发布:2021-03-16 21:42:09 浏览:1
不屑弟高考成绩 发布:2021-03-16 21:40:59 浏览:754
大学毕业证会有成绩单 发布:2021-03-16 21:40:07 浏览:756
2017信阳学院辅导员招聘名单 发布:2021-03-16 21:40:02 浏览:800
查询重庆2018中考成绩查询 发布:2021-03-16 21:39:58 浏览:21
结业考试成绩怎么查询 发布:2021-03-16 21:28:40 浏览:679
14中医医师资格笔试考试成绩查分 发布:2021-03-16 21:28:39 浏览:655
名著赏析课程标准 发布:2021-03-16 21:27:57 浏览:881
北京大学商业领袖高端培训课程 发布:2021-03-16 21:27:41 浏览:919