导航:首页 > 源码编译 > 在单片机编程计算法

在单片机编程计算法

发布时间:2022-05-23 03:04:20

单片机简易计算器设计的程序

展开全部
首先会按键扫描,再会数码管或液晶屏显示,基本上可以了
程序
流程:
扫描按键(最多5次,最大65536,简易计算器吗)获得一个数,再扫描按键获得加减乘除符号
扫描按键获得另一个数
扫描按键获得“=”,显示计算结果
由于程序比较长,且与硬件有关,因此只贴出主程序:
void
main()
{
while(1)
{
c=1;
while(c<6)//输入第1个5
位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:b1=keyval;
break;
case
2:b2=keyval;
break;
case
3:b3=keyval;
break;
case
4:b4=keyval;
break;
case
5:b5=keyval;
break;
}
c++;
}
display1(b1,b2,b3,b4,b5);
}
while(c==6)
//输入计算符号
{
keyval=keyscan();
if((keyval>=10)&&(keyval<14))
//10-13代表加减乘除
4种符号
{
d=keyval;
}
c=1;
display3(d);
}
while(c<6)
//输入第2个5
位数
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case
1:d1=keyval;
break;
case
2:d2=keyval;
break;
case
3:d3=keyval;
break;
case
4:d4=keyval;
break;//

case
5:d5=keyval;
break;
}
c++;
}
display2(d1,d2,d3,d4,d5);
}
bb=
b1*10000+b2*1000+b3*100+b4*10+b5;//5个按键数值合成一个数
dd=d1*10000+d1*1000+d3*100+d4*10+d5;
//另外5个按键数值也合成一个数
while(keyval!=14)
//等待按下"="
{
keyval=keyscan();
}
Delay1ms(10);
switch(d)
{
case
10:ee=bb+dd;
break;//+
case
11:
flag1=1;//结果是负数的标志,先假定是负数
if(bb>=dd)
{
ee=bb-dd;
//结果不是负数
flag1=0;
}
else
ee=dd-bb;
//减数和被减数交换
break;
case
12:ee=bb*dd;
break;//*可能会溢出
case
13:ee=bb/dd;
//除法小数部分会丢失,保留2位
ff=bb%dd;
fd1=ff*10/dd;
fd2=ff*100/dd%10;
break;
}
f10=ee/1000000000%10;
f9=ee/100000000%10;
f8=ee/10000000%10;
f7=ee/1000000%10;
f6=ee/100000%10;
f5=ee/10000%10;
f4=ee/1000%10;
f3=ee/100%10;
f2=ee/10%10;
f1=ee%10;
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2);
while(keyval!=15)
{
keyval=keyscan();
}
b1=0;b2=0;b3=0;b4=0;b5=0;
d1=0;d2=0;d3=0;d4=0;d5=0;
bb=0;dd=0;ee=0;
init2();
}
}

② 51单片机键盘矩阵实现个位加法计算器,用c编程

KEYBUF
EQU
40H
;键号存放单元
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
KEYBUF,#0
;初始键号设位0,也可以为任意值
MOV
R0,#30H
;显示首地址
MOV
R2,#0CH
;计算数据存放单元个数
CLR
A
QING:
MOV
@R0,A
;将数据存放单元清零
INC
R0
DJNZ
R2,QING
MOV
P0,#8FH
;关闭显示
MOV
R1,#30H
;将显示首地址存放R1里

③ 单片机编程计算

MOV A, X MOV B, #10 MUL AB MOV Z, A MOV Z+1, B MOV A, Y MOV B, #5 DIV AB ADD A, Z JNC NEXT INC Z+1 NEXT: CLR C SUBB A, #5 MOV Z, A JNC NEXT2 INC Z+1 NEXT2: END X,Y为位于内部RAM30H,31H单元的单字节变量, Z位于32H33H,低字节在前。

④ 如何用51单片机做计算器(要求用C语言编程) 由于是新手所以没积分 对不住各位了

给你参考一下的,我最近做的:

我的实验板上的键不够,所以只能做加法运算,而且两数之和不能大于十。

嘿嘿,没错这个给某种人用的。

//**********myh.h***********有两个文件,一个是头文件myh.h一个是js.c

#include<reg52.h>

typedefunsignedcharuchar;

typedefunsignedintuint;

typedefbitBOOL;

//**

sbitrs=P2^6;

sbitrw=P2^5;

sbite=P2^7;

//**

ucharKey_Down(void);//返回0到12的键盘的编码

voiddelay(uchar);//延时

voidInit(void);

voidWrite_Cmd(uchar);

voidWrite_Data(uchar);

BOOLIf_Busy();

//**

ucharcodeLcd_tab[]="0123456789+=";

ucharcodeKey_tab[]={0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee};

//**********

uintQ0;

uintQ1;

uintQ2;

//*************js.c********

#include"myh.h"

//**************

voidmain()

{ucharm_key;

ucharm_inc=0;

Init();

Write_Cmd(0x80);

while(1)

{Q1=0;

Q0=0;

Q2=0;

m_key=Key_Down();

Write_Cmd(0x01);

Write_Data(Lcd_tab[m_key]);

Q0=m_key;

m_key=Key_Down();

Write_Data(Lcd_tab[m_key]);

m_key=Key_Down();

Write_Data(Lcd_tab[m_key]);

Q1=m_key;

m_key=Key_Down();

Write_Data(Lcd_tab[m_key]);

Q2=Q0+Q1;

Write_Data(Lcd_tab[Q2]);

}

}

//************************

ucharKey_Down(void)

{ucharKey_number=0;

ucharm_cx;

ucharm_cy;

ucharm_cxy;

P3=0x0f;

m_cx=P3;

while(1)

{if(m_cx!=0x0f)

{delay(500);

m_cx=P3;

if(m_cx!=0x0f)

break;}

else{P3=0x0f;m_cx=P3;}

}

P3=0x0f;

m_cx=P3&0x0f;

P3=0xf0;

m_cy=P3&0xf0;

m_cxy=m_cx|m_cy;

for(Key_number=0;Key_number<12;Key_number++)

{if(m_cxy==Key_tab[Key_number])

break;

}

returnKey_number;}

//**********

voiddelay(uchartime)

{ucharj;

for(;time>0;time--)

for(j=0;j<200;j++);

}

//**************

voidinit()

{delay(10);

Write_Cmd(0x38);

delay(10);

Write_Cmd(0x38);

delay(10);

Write_Cmd(0x38);

delay(10);

Write_Cmd(0x0c);

delay(10);

Write_Cmd(0x06);

delay(10);

Write_Cmd(0x01);

}

//***********

voidWrite_Cmd(ucharcmd)

{//while(If_Busy());

e=0;

rw=0;

rs=0;

delay(4);

P0=cmd;

delay(4);

e=1;

delay(10);

e=0;

}

//***

voidWrite_Data(uchardat)

{//while(If_Busy());

e=0;

rw=0;

rs=1;

delay(4);

P0=dat;

delay(4);

e=1;

delay(10);

e=0;

}

//**

BOOLIf_Busy()

{

BOOLresult;

rw=1;

rs=0;

e=1;

delay(4);

result=(BOOL)(P2&0x80);

e=0;

returnresult;

}

⑤ 单片机编程

1:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
SETB ET0
SETB EA
MOV A,#0FEH
SJMP $
T0INT:
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
MOV P1,A
RL A
RETI
END
2:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#0FEH
MOV TL0,#0CH
SETB TR0
SETB ET0
SETB EA
SJMP $
T0INT:
CLR TR0
MOV TH0,#0FEH
MOV TL0,#0CH
SETB TR0
CPL P1.1
RETI
END

⑥ 单片机做计算器的程序

1、直接调用库函数。

⑦ 单片机如何编程计算该16个单元的数值之和

QIHE:
MOVR0,#30H
MOVR2,#16
MOVR3,#0
MOVR4,#0
LOOP:
MOVA,@R0
ADDA,R4
MOVR4,A
CLRA
ADDCA,R3
MOVR3,A
INCR0
DJNZR2,LOOP
RET

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

1、硬件仿真图

4、程序源代码

#include <reg51.h>#include <intrins.h>

#include <ctype.h>

#include <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 < 9;i++)

{

operand1[i] = '';

operand2[i] = '';

}

while(1)

{

ckey = keyscan();

if(ckey != '#')

{

if(isdigit(ckey))

{

switch(bool)

{

case 0:

operand1[cut1] = ckey;

operand1[cut1+1] = '';

value1 = atoi(operand1);

cut1++;

buf(value1);

disp();

break;

case 1:

operand2[cut2] = ckey;

operand2[cut2+1] = '';

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;

}

}

(8)在单片机编程计算法扩展阅读:

PROTEUS 是单片机课堂教学的先进助手

PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。

它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。

课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台

随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。相信在单片机开发应用中PROTEUS也能茯得愈来愈广泛的应用。

使用Proteus 软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;

在单片机课程设计和全国大学生电子设计竞赛中,我们使用 Proteus开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。

实践证明,在使用 Proteus 进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。因此,Proteus 有较高的推广利用价值。

⑨ 单片机指令周期的计算

计算方法:PIC单片机的每四个时钟周期为一个内部指令周期,例如:8MHz的晶振,则内部指令周期为1/(8/4)= 0.5 uS

实例一:35us, 8MHz的晶振, 8位定时器, 分频比1/2 , 初值 E4

实例二:156.25us , 32768Hz的晶振, 8位定时器, 分频比1/32 , 初值 FC

计算方法一: 35 = =(256-初值)*分频*4/晶振 + 14/分频 =(256-初值)+14/2

计算方法二:0.015625 =(256-初值)*分频*4/晶振 = (256-初值)*32*4/32768

特别注意:分频比1-8 需要加上一个14/分频

指令周期是指令周期执行某一条指令所消耗的时间,它等于机器周期的整数倍。传统的80C51单片机的指令周期大多数是单周期指令,也就是指令周期=机器周期,少部分是双周期指令。

(9)在单片机编程计算法扩展阅读


在MCS-51系统中,有单周期指令,双周期指令。四周期指令只有乘,除两条指令。指令的运算速度和它的机器周期直接相关,机器周期数较小则执行速度快。

在编程时要注意选用具有同样功能而机器周期数小的指令。每一条指令的执行都可以包括取指和执行两个阶段。在取指阶段,CPU从内部或者外部ROM中取出指令操作码及操作数,然后再执行这条指令。

在8051指令系统中,根据各种操作的繁简程度,其指令可由单字节,双字节和三字节组成。从机器执行指令的速度看,单字节和双字节指令都可能是单周期或双周期,

而三字节指令都是双周期,只有乘,除指令占四个周期,一条指令的字节数表征这条指令在存储器中所占空间大小,而周期数表征运行这条指令所花时间长短,即运行速度。

⑩ 单片机上怎样计数

做一个旋转编码的数据表,如果能直接计算的,可以写出转换公式。用一个寄存器或是地址存放当前旋转位置的值,根据值查表或转换得出相应的编码。
正转对该寄存器inc,反转就dec即可。如何控制正反计数和计数总值就不用讲了吧?

阅读全文

与在单片机编程计算法相关的资料

热点内容
南京解压车要带什么 浏览:562
天堂2编译视频教程 浏览:392
服务器没有进程怎么办 浏览:784
阿里云发布新物种神龙云服务器 浏览:59
数据结构递归算法统计二叉树节点 浏览:666
ev3怎么编程 浏览:702
gzip压缩教程 浏览:349
解压模拟例子 浏览:984
流媒体服务器如何实现视频转发 浏览:57
linux字符串md5 浏览:302
支撑突破选股源码怎么设置 浏览:934
湖南戴尔服务器维修云主机 浏览:494
解压到文件夹的视频都自动隐藏了 浏览:569
阅读器支持php 浏览:222
人生需求怎么解压 浏览:795
pdf打印机找不到 浏览:1001
如何同时使用两个apache服务器 浏览:723
国外php论坛 浏览:966
灾难是命令 浏览:604
linux火狐浏览器安装 浏览:71