① 51单片机,使用keil软件,4字节加法或减法子程序
四个字节加上四个字节,和应该是4~5个字节。
本程序,需要三个地址指针,但是一般只有两个(R0和R1)可以用;如果换用工作区,就比较麻烦了。下面使用B充当“和”的地址指针,RESULT + 4单元,充当加数2的地址指针。
程序如下:
RESULT equ 30H ;和数的地址
ORG 0000H
;实验数据如下:
MOV 20H, #22H ;加数1
MOV 21H, #33H
MOV 22H, #44H
MOV 23H, #0F3H
MOV 24H, #12H ;加数2
MOV 25H, #34H
MOV 26H, #56H
MOV 27H, #78H
MOV R0, #20H ;给定地址
MOV R1, #24H
LCALL _4_JIA_4 ;调用加法子程序
NOP
SJMP$
_4_JIA_4:
MOV RESULT + 4, R1 ;保存加数2地址
MOV B, #RESULT ;保存和的地址
CLR C
MOV R2, #4
LOOP:
MOV A, @R0
INC R0
MOV R1, RESULT + 4
ADDC A, @R1 ;加上加数2
INC R1
MOV RESULT + 4, R1
MOV R1, B
MOV @R1, A ;保存和数
INC R1
MOV B, R1
DJNZ R2, LOOP
CLR A
ADDC A, #0
MOV RESULT + 4, A ;保存第五字节
RET
减法子程序,与上面的加法子程序雷同,只要把ADDC换成SUBB即可改为减法子程序。请楼主自行改写。
② 用c语言编写一个计数器(单片机为51型,数码管为共阴)要求有三个按键分别控制停止、加、减
一看到你说是计数器,又看到你要求有停止功能,意思是把Timer改为计数器,然后可以通过一个键停止计数对吧?
如果这样的话挺简单的,51单片机的计数器io口记得好像是P3^0和P3^1,但不管怎么,首先设置TMOD,将C/T位置1,这就改为计数器了,然后可以编写函数来对一个变量进行加减;同样利用51单片机的外部中断也可以实现计数功能,打开外部中断开关,在外部中断服务函数对计数变量进行加减;最简单的,直接利用io口高低电平变化来进行计数,编写if函数,只要某个io口电平变化了,就对计数变量进行加减。
如果你对这个有点陌生,那么回复我一起讨论或者我可以帮你写程序。
希望我的回答能帮助到你。
③ 求一个大学51单片机加减法计数器设计实验,高手进
这个不用高手吧,为什么不用一个加一个减呢?这样程序会更简单
④ 51单片机怎么实现两位数的加减
51单片机
51单片机是对所有兼容Intel 8051指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。
中文名
51单片机
外文名
mcu
定义
兼容Intel 8031系统的单片机统称
始祖
Intel公司始创的8004单片机
缺点
不具备自编程能力
快速
导航
功能
学习
仿真
区别
主要产品
*Intel(英特尔)的:80C31、80C51、87C51,80C32、80C52、87C52等;
*ATMEL(爱特梅尔)的:89C51、89C52、89C2051,89S51(RC),89S52(RC)等;
*Philips(飞利浦)、华邦、Dallas(达拉斯)、Siemens(西门子)等公司的许多产品;
STC(国产宏晶)单片机:89c51、89c52、89c516、90c516等众多品牌。
功能
·8位CPU·4kbytes程序存储器(ROM) (52为8K)
·128bytes的数据存储器(RAM) (52有256bytes的RAM)
·32条I/O口线·111条指令,大部分为单字节指令
·21个专用寄存器
·2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
·一个全双工串行通信口
·外部数据存储器寻址空间为64kB
·外部程序存储器寻址空间为64kB
·逻辑操作位寻址功能·双列直插40PinDIP封装
·单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。
学习
作为一个初学者,如何单片机入门?
实际上,其实不需要多少东西,会简单的C语言,知道51单片机的基本结构就可以了。一般的大学毕业生都可以了,自学过这2门课程的高中生也够条件。设备上,一般是建议购买一个仿真器,例如,的“双功能下载线”就具有良好的稳定性和较快的下载速度,上位机可扩展,可以下载更多的单片机及嵌入式芯片。通过实验,这样才可以进行实际的,全面的学习。日后在工作上,仿真器也大有用处。还有,一般光有仿真器是不行,还得有一个实际的电路,即学习板,如图,即为,单片机最小系统。
⑤ 怎样用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] = '