① 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] = '