① 51单片机的硬件结构
本文主要讲解51单片机的硬件结构,而且只介绍重点知识。
由上图可以看出,51单片机组成结构包括以下几个部分:
时序信号:一类用于片内各功能的部件的控制,另一类用于片外存储器或IO端口的控制(这个对用户来说是比较重要的,在定时器部分会讲)
通过修改PSW中的RS1、RS0两位的状态,就能任选一个工作寄存器区。这个特点提高了MCS-51现场保护和现场恢复的速度。对于提高CPU的工作效率和响应中断的速度是很有利的。若在一个实际的应用系统中,不需要四组工作寄存器,那么这个区域中多余单元可以作为一般的数据缓冲器使用。
按存储结构可分为二类:一类是哈佛结构,另一类是普林斯顿结构。
①哈佛结构
哈佛结构是程序存储器地址空间与数据存储器地址空间分开的单片机结构,如80C51单片机采用哈佛结构,所以80C51单片机的程序存储器地址空间与数据存储器地址空间是分开的,各有64K存储空间。
②普林斯顿结构
普林斯顿结构是程序存储器地址空间与数据存储器地址空间合并的单片机结构,如MCS-96单片机采用普林斯顿结构,所以MCS-96单片机的程序存储器地址空间与数据存储器地址空间是合并的,共有64K存储空间。
P3口还有第二功能,表如下:
若TI 或 RI 被置位,必须用软件清零,硬件不能将其清零。
在不设置IP优先级寄存器的话,单片机内部会按这个默认顺序优先级去响应各个中断。
上电复位后除端口锁存器,堆栈指针,SBUF外,单片机内部的复位电路向所有的特殊功能寄存器写入00H。SBUF的值是不能确定的。
复位还使ALE和PSEN信号变为无效(高电平),而内部RAM不受影响。但由于VCC上电复位后,RAM内容不定,除非是退回低功耗方式的复位。
② 51单片机所必需的外部硬件电路
在构建51单片机最小系统时,我们只需考虑为单片机提供稳定电源。对于不同型号的51单片机,通常推荐的电源电压为3.3V或5V。这意味着,只要能够稳定提供所需电压的电源电路,就能满足51单片机的运行需求。
值得注意的是,过去的51单片机设计中,振荡电路、复位电路、看门狗电路以及外部扩展的RAM或ROM是必不可少的组成部分。这是因为早期的单片机芯片缺乏内部集成这些功能的能力,需要通过外部硬件来实现。
然而,随着技术的进步,现代的51单片机型号已经集成了上述所有功能。这不仅简化了硬件设计,还提高了单片机的整体性能和可靠性。因此,现在我们构建51单片机最小系统时,只需关注电源电路即可。
这种集成化的设计,不仅减少了外部硬件的复杂性,还降低了成本,使得51单片机在各种应用场景中更加易于使用。无论是工业控制、家电产品还是其他嵌入式系统,这种简化后的硬件设计都能提供更稳定、更可靠的性能。
综上所述,对于新一代51单片机,我们只需确保提供稳定的电源,而无需额外添加振荡、复位、看门狗、扩展RAM或ROM等外部硬件。这无疑提高了51单片机应用的便捷性和可靠性。
③ 怎样用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] = '