① 如何實現2個51單片機之間通過串口通信的源程序
匯編編寫的模擬串口通信程序
T2作為波特率控制
UART_RXD 是硬中斷0或1口,如果能進入中斷,說明該線有一個起始位產生,進入中斷後調
用下面的接收程序。退出硬中斷之前還需要將硬中斷標志重新復位。
UART_TXD是任何其它IO即可。
UART_SEND:
PUSH IE
PUSH DPH
PUSH DPL
PUSH PSW
PUSH 00H
PUSH ACC
CLR EA
SETB UART_TXD ;START BIT
MOV R0,A
CLR TR2 ;TR2置1,計數器2啟動,時間計數啟動。
MOV A,RCAP2L;計數器2重新裝載值
MOV TL2,A ;置計數器2初值 ;T2需要重新裝載
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A
MOV A,R0
SETB TR2 ;TR2置1,計數器
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
CLR UART_TXD ;START BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
MOV R0,#08H
UART_SEND_LOOP:
RRC A
MOV UART_TXD,C ;8 BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
DJNZ R0,UART_SEND_LOOP
SETB UART_TXD ;END BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
POP ACC
POP 00H
POP PSW
POP DPL
POP DPH
POP IE
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UART_REC:
PUSH IE
PUSH DPH
PUSH DPL
CLR EA
CLR TR2 ;TR2置1,計數器2啟動,時間計數啟動。
MOV A,RCAP2L;計數器2重新裝載值
MOV TL2,A ;置計數器2初值 ;T2需要重新裝載
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A
JB UART_RXD,$ ;REC
SETB TR2 ;TR2置1,計數器2啟動,時間計數啟動。
JNB TF2,$
CLR TF2 ;0.5 BIT
JNB TF2,$
CLR TF2 ;1 BIT
JNB TF2,$
CLR TF2 ;1.5 BIT
MOV C,UART_RXD
MOV ACC.0,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;2.5
MOV C,UART_RXD
MOV ACC.1,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;3.5
MOV C,UART_RXD
MOV ACC.2,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;4.5
MOV C,UART_RXD
MOV ACC.3,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;5.5
MOV C,UART_RXD
MOV ACC.4,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;6.5
MOV C,UART_RXD
MOV ACC.5,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;7.5
MOV C,UART_RXD
MOV ACC.6,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;8.5
MOV C,UART_RXD
MOV ACC.7,C
JNB TF2,$
CLR TF2 ;9.5
JNB UART_RXD,$ ;等待停止位,並重新復位計數器
SETB UART_RXD
POP DPL
POP DPH
POP IE
RET
補充回答:
串口調試
1. 發送:向匯流排上發命令
2. 接收:從匯流排接收命令,並分析是地址還是數據。
3. 定時發送:從內存中取數並向主機發送.
經過調試,以上功能基本實現,可以通過上位機對單片機進行實時控制。
程序如下:
//這是一個單片機C51串口接收(中斷)和發送常式,可以用來測試51單片機的中斷接收
//和查詢發送,發送沒有必要用中斷,因為程序的開銷是一樣的
#include <reg51.h>
#include<stdio.h>
#include <string.h>
#define INBUF_LEN 4 //數據長度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3 , flag,temp,ch;
bit read_flag=0;
sbit cp=P1^1;
sbit DIR=P1^2;
int i;
unsigned int xdata *RAMDATA; /*定義RAM地址指針*/
unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;
void init_serialcomm(void)
{
SCON=0x50; //在11.0592MHz下,設置串列口波特率為9600,方式1,並允許接收
PCON=0x00;
ES=1;
TMOD=0x21; //定時器工作於方式2,自動裝載方式
TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
TL1=0xfd;
TH1=0xfd;
ET0=1;
TR0=1;
TR1=1;
// TI=0;
EA=1;
// TI=1;
RAMDATA=0x1F45;
}
void serial () interrupt 4 using 3
{
if(RI)
{ RI=0;
ch=SBUF;
TI=1; //置SBUF空
switch(ch)
{
case 0x01 :printf("A"); TI=0;break;
case 0x02 :printf("B"); TI=0;break;
case 0x03 :printf("C"); TI=0;break;
case 0x04 :printf("D"); TI=0;break;
default :printf("fg"); TI=0;break;
}
}
}
//向串口發送一個字元
void timer0() interrupt 1 using 3{
// char i;
flag++;
TH0=0x00;
TL0=0x00;
if(flag==10)
{// cp=!cp;
// for(i=0;i<6;i++)
P2=0x25;
TI=1;
temp=*RAMDATA;
printf("%c",temp);
TI=0;
// RAMDATA--;
flag=0;
}
}
//主程序
main()
{
init_serialcomm(); //初始化串口
//向6264中送數據
{
*RAMDATA=0x33;
}
while(1)
{
*RAMDATA=0x33;;
}
}
調試需要注意的問題:
1. 發送過程:在發送時必須保證TI=1:即發送緩沖器為空,否則將導致數據發不出去,如果想強制發送可以用:TI=1.具體發送數據:利用printf(「abcd」);函數直接發送即可。
2. 接收過程:在接收時多選用中斷方式,這樣可以節約CPU的時間,提高效率,
② 51單片機的結構組成
上圖就是我們要研究學習的對象,51單片機摧部結構圖了。大家看看上圖,中間的一條雙橫線就是51單片機的內部匯流排了。其它的部件都是通過內部的匯流排與CPU相聯接的,在第一節課時我們已跟大家講述過,8051單片機是匯流排結構的。下面我們就51單片機內部的單個部件與大家進行講解。
中央處理器(CPU):
剛跟大家講過,需要提醒的是MCS-51的CPU能處理8位二進制數或代碼。CPU是單片機的主要核心部件,在CPU裡麵包含了運算器、控制器以及若干寄存器等部件給成。
內部數據存儲器(RAM):
MCS-51單片機晶元共有256個RAM單元,其中後128單元被專用寄存器佔用(稍後我們詳解),能作為寄存器供用戶使用的只是前128單元,用於存放可讀寫的數據。因此通常所說的內部數據存儲器就是指前128單元,簡稱內部RAM。地址范圍為00H~FFH(256B)。是一個多用多功能數據存儲器,有數據存儲、通用工作寄存器、堆棧、位地址等空間。
內部程序存儲器(ROM):
在前面也已講過,MCS-51內部有4KB/8KB位元組的ROM(51系列為4KB,51系列為8KB),用於存放程序、原始數據或表格。因此稱之為程序存儲器,簡稱內部RAM。地址范圍為0000H~FFFFH(64KB)。
定時器/計數器
51系列共有2個16位的定時器/計數器(52系列共有3個16位的定時器/計數器),以實現定時或計數功能,並以其定時或計數結果對計算機進行控制。定時時靠內部分頻時鍾頻率計數實現,做計數器時,對P3.4(T0)或P3.5(T1)埠的低電平脈沖計數。
並行I/O口
MCS-51共有4個8位的I/O口(P0、P1、P2、P3)以實現數據的輸入輸出。具體功能在後面章節中將會詳細論述。
串列口
MCS-51有一個可編程的全雙工的串列口,以實現單片機和其它設備之間的串列數據傳送。該串列口功能較強,既可作為全雙工非同步通信收發器使用,也可作為移位器使用。RXD( P3.0)腳為接收埠,TXD(P3.1)腳為發送埠。
中斷控制系統
MCS-51單片機的中斷功能較強,以滿足不同控制應用的需要。51系列有5個中斷源(52系列有6個中斷源),即外中斷2個,定時中斷2個,串列中斷1個,全部中斷分為高級和低級共二個優先順序別,優先順序別的設置我們也將在後面進行詳細的講解。
定時與控制部件
MCS-51單片機內部有一個高增益的反相放大器,基輸入端為XTAL1輸出端為XTAL2。MCS-51晶元的內部有時鍾電路,但石英晶體和微調電容需外接。時鍾電路為單片機產生時鍾脈沖序列。
③ 52單片機和51單片機有那些區別
52比51多了一個定時器2,還有內部RAM大了一倍,其它相同,所以你不使用定時器2的話就跟使用51是一樣的
記得採納啊
④ 求大家解釋51和52單片機的區別有哪些
51單片機和52單片機主要區別為:
1、51單片機內部有4K程序存儲器,52單片機有8K。
2、51單片機有5個中斷源,52單片機有6中斷源。多一個定時器2.
⑤ 51單片機p0p1p2p3口,到底有啥區別啊,他們的基本功能有啥
51單片機p0、p1、p2、p3口區別如下:
一、意思不同
P0口作輸出口用時,需加上拉電阻。P0口有復用功能。當對外部存儲器進行讀寫操作時,P0口先是
提供外部存儲器的低8位地址,供外部存儲器地址鎖存器鎖存,然後充當數據線,用於寫出或讀入數
據。P1口、P2口只是普通IO口。
二、功能不同
P0口第一個功能是數據介面,第二個功能是地址低八位,P2口第二個功能是地址高八位。另外除了
P0口沒有內部上拉電阻外,其他三個都有內部上拉電阻。
三、用法
信號輸出和交互介面,編程可以確定不同的功能,例如連接液晶屏,作為控制信號輸出輸入等。
由於沒有埠復用功能,所以,P0口的V1變成了一個上拉電阻。由於內部就有上拉電阻,所以,作
為GPIO時,P1口不需要接上拉電阻,當然,您接了也沒關系啦,就相當於兩個上拉電阻並聯。
基本功能:
一、P1 就沒多少功能,就是個准雙向I/O口。
二、P0當准IO口使用,也就是既可以用作輸出口,也可以用作輸入口。
三、P3口除了是個准雙向I/O口外。第二功能很重要P3.0 (RXD)串列數據接收端,P3.1 (TXD)
串列數據發送端,P3.2 (INT0)外部中斷0輸入,P3.3 (INT1)外部中斷1輸入;
P3.4(T0)Timer0計數器輸入,P3.5(T1)Timer1計數器輸入,P3.6(WR)寫外部存儲器的脈沖
輸出,P3.7(RD)讀外部存儲器的脈沖輸出。
(5)251單片機擴展閱讀
1、P0口:真正的雙向口,輸出鎖存,輸入緩沖,輸入前要先置1(KEIL包含的頭文件已經有動作
了,如果用匯編,要人工置1),輸出為漏極開路,輸出一般都要上拉電阻。輸入為高阻態,能驅動
8個TTL負載。當有片外存儲器時,作數據線使用。
2、P1口:最簡單的口,輸入也要先置1,無高阻態,只能是輸出或者輸入。能驅動4個TTL負載。
3、P2口:I/O(輸入/輸出)與P1口一樣,當有片外存儲器時,作地址線使用,定址64K片外數據存
儲器。能驅動4個TTL負載。
4、P3口:I/O(輸入/輸出)與P1口一樣,但無論輸入輸出都要先置1。具有很多復用功能。
⑥ 51單片機跟52單片機有什麼區別
1、種類不同:51系列單片機是指51內核,stc89c5X基本都是51內核的種類。
2、大小不同:最後一個數字表示E2prom的大小,E2prom=X*4K,c51就是4K,c52就是8k。
3、配件不同:52還多了一個定時器,所以可以說52是51(這個51是指stc89c51,不是51內核)的增強型。
如下圖,可以很清晰的看出兩者之間的差別:
(6)251單片機擴展閱讀:
STC89c52單片機主要是基於8051內核,是新一代增強型單片機,指令代碼完全兼容傳統8051,速度快8~12倍,帶ADC,4路PWM,雙串口,有全球唯一ID號,加密性好,抗干擾強。
51單片機主要是基於8051內核,是新一代安全防逆向型單片機,指令代碼完全兼容傳統8051,速度快8~12倍,帶有62 K FLASH ROM。
內置256位元組RAM和集成外置1024位元組RAM,白雜訊密碼-沒有規律可循,每顆晶元都有自己的密碼,同樣的密碼不可重用。
⑦ 51單片機最小系統原理圖
我是一名單片機工程師,下面的講解你參考一下.
.
51單片機共有40隻引腳.下面這個就是最小系統原理圖,就是靠這四個部分,這個單片機就可以運行起來了.(看下面的數字標記,1234)
.
這個腳是存儲器使用選擇腳,當這個腳接」地」時,那麼就是告訴單片機,選擇使用外部存儲器,當這個腳接」5V」時,說明單片機使用內部存儲器.
如果選擇外部的存儲器,太浪費單片機僅有的資源,所以這一腳永遠接電源5V(如上圖所示),使用單片機的內部存儲器.
5 如果內部存儲器不夠容量,最多選擇更高級的容量,就可以解決容量不夠的問題了,就是這么簡單
.
一天入門51單片機:點我學習
.
我是歲月哥,願你學習愉快!
⑧ 用2個51單片機進行串列通信(12位並行數據該成串列後再改並行)
1、設12位的數據為D_12bit
2、在A機中先把D_12bit分裝到兩個8位的無符號變數經X和Y里,即X=D_12bit%256(低8位)Y=D_12bit/256(高8位),然後把兩個位元組往串口送即可(SBUF=X;SBUF=Y)
3、在B機中把從串口接收來的兩位元組數據賦給個16位的int型變數,很簡單,假設接收來的低8位為X8位為Y:
unsigned
int
temp;
temp=256*y;//把Y變成16位並賦給temp的高8位
temp&=0xff00;//清空低8位
x=x*256;//X變成16位數據並賦給高8位
X>>=8;再把它移成低8位
temp=temp+X;//合並成16位數據
⑨ stc12c5a60s2 51單片機區別
stc12c5a60s2與51單片機區別:
1、同樣晶振的情況下,stc12c5a60s2速度是普通51的8~12倍 對於AT89c51,1個機器周期=12個震盪周期,對於STC12C5A60S2,1個機器周期=1個震盪周期;
2、stc12c5a60s2有8路10位AD;
3、stc12c5a60s2多了兩個定時器,帶PWM功能;
4、stc12c5a60s2有SPI介面;
5、stc12c5a60s2有EEPROM;
6、stc12c5a60s2有1K內部擴展RAM;
7、stc12c5a60s2有WATCH_DOG;
8、stc12c5a60s2多一個串口;
9、stc12c5a60s2的IO口可以定義,有四種狀態;
10、stc12c5a60s2中斷優先順序有四種狀態可定義。
⑩ 51單片機和52機有什麼區別
單片機簡介
單片微型計算機簡稱單片機,簡單來說就是集CPU(運算、控制)、RAM(數據存儲-內存)、ROM(程序存儲)、輸入輸出設備(串口、並口等)和中斷系統處於同一晶元的器件,在我們自己的個人電腦中,CPU、RAM、ROM、I/O這些都是單獨的晶元,然後這些晶元被安裝在一個主板上,這樣就構成了我們的PC主板,進而組裝成電腦,而單片機只是將這所有的集中在了一個晶元上而已。
51單片機和STM32單片機
51單片機是對所有兼容Intel8031指令系統的單片機的統稱,這一系列的單片機的始祖是Intel的8031單片機,後來隨著flash ROM技術的發展,8031單片機取得了長足的進展成為了應用最廣泛的8bit單片機之一,他的代表型號就是ATMEL公司的AT89系列。
STM32單片機則是ST(意法半導體)公司使用arm公司的cortex-M為核心生產的32bit系列的單片機,他的內部資源(寄存器和外設功能)較8051、AVR和PIC都要多的多,基本上接近於計算機的CPU了,適用於手機、路由器等等。
DSP、AVR和PIC單片機、8051單片機之間區別
AVR和PIC都是跟8051單片機的機構不同的8位單片機,因為結構不同,所以他的匯編指令也不同,並且他們都是使用的RISC指令集,只有幾十條指令,大部分的還都是單周期的指令,所以在相同的晶振頻率下,比8051速度要快。
DSP其實也是一種特殊的單片機,他從8bit到32bit的都有,他專門是用來計算數字信號的,在某些計算公式上,他甚至比現在的家用計算機的最快CPU還要快,比如說一個32bit的DSP能在一個指令周期內完成一個32bit數乘以32bit數再加上一個32bit數的計算。
8051、8031、89C51和89S51關系
我們平常老是講8051,又有什麼8031,現在又有89C51,89s51它們之間究竟是什麼關系?
MCS51是指由美國INTEL公司生產的一系列單片機的總稱,這一系列單片機包括了好些品種,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的產品,該系列其它單片機都是在8051的基礎上進行功能的增、減、改變而來的,所以人們習慣於用8051來稱呼MCS51系列單片機,而8031是前些年在我國最流行的單片機,所以很多場合會看到8031的名稱。INTEL公司將MCS51的核心技術授權(賣)給了很多其它公司,所以有很多公司在做以8051為核心的單片機,當然,功能或多或少有些改變,以滿足不同的需求,其中89C51就是這幾年在我國非常流行的單片機。至於國內用到的很多的AT系列的單片機其實就是ATMEL公司在8031內核之外添加其他功能生產了系列的單片機