導航:首頁 > 操作系統 > 51單片機模擬串口

51單片機模擬串口

發布時間:2022-09-20 00:01:24

① 感測器的A0和D0接51單片機哪個串口

A0指的是模擬信號輸出口,而D0表示數字信號輸出口。那麼,我們可以看到Arino板上的A0~A5是用來對接模擬信號引腳的。所以火焰感測器的A0引腳接板上的A0~A5中的任意一個引腳都可以。
A0模擬輸出,D0是數字輸出;計AO根據收到的信號,輸出0~1023模擬信號,DO根據設定的閥值輸出0或1。
感測器是一種檢測裝置,能感受到被測量的信息,並能將感受到的信息,按一定規律變換成為電信號或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲、顯示、記錄和控制等要求。

② 如何實現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單片機IO口模擬串口通信的

你不用中斷服務程序來置標志,當溢出是TF0自動置1,你只需清0就OK了。
你的問題肯定是波特率不一致造成的,一是你兩個設備的波特率是否一致,你查探一下,另一個是因為你用中斷服務程序處理標志,會影響波特率的,給其造成誤差。

④ 單片機模擬串口通信有什麼利弊

串口通信,或者 IIC 通信,應該是由專門的硬體,來完成的。

CPU 對這些硬體,設置一下,再傳送一下數據,就可以等待結果了。

有些單片機,太簡陋,沒有相應的硬體,只能用軟體編程,模擬硬體,來實現。

執行這些程序,當然,必須佔用 CPU 的時間。這就是《佔用大量的cpu資源》。

有時,還要使用定時器、中斷源,這也是《佔用大量的資源》。

⑤ 51單片機模擬通訊通訊的啟動串口接收函數,TL0 = 256 - ((256-TH0)>>1)這句話怎麼分析

首先你要明白溢出率怎麼算,溢出率等於每溢出一次時間的導數,也就是定時時間的導數。256-TH0算出來的是定時時間,右移以為相當於除2。然後再用256減去,付給TL0

⑥ 51 單片機模擬串口的問題 目前發送數據沒有問題,接收數據時只能接收前兩位,如發送010203 只能接收到01

我前幾天也做模擬串口程序,也遇到了與你類似的問題,不過現在解決了。
數據格式由一個起始位,八個數據位,一個或兩個結束位組成。在數據發送是結束位是不能省。
但在數據接收時,程序中就沒有必要等待結束位了,因為在等待結束位的過程中,把下一個數據的起始中斷也等待過去了。
把函數uchar RByte()中的最後一個WaitTF0();刪除,程序就能連續接收數據了。
下面是我的程序,你看一下就明白了。
/*
模擬串口收發程序
改程序發送口採用任一IO口,接收口採用外部中斷0口,實現了9600bit/s的串口通信
信號產生與接收採用定時器定時溢出標志來進行控制
注意問題:
1、中斷的中斷標志要保證狀態正確
2、定時器定時要精確
*/

#include<reg52.h>
sbit txd=P3^1;
sbit rxd=P3^2;
sbit en=P1^7;
sbit clk=P3^7;

#define uchar unsigned char

uchar number,flag;
uchar num[10]={0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

void wait(uchar i);
void send(uchar aa);

void main()
{
uchar i;
IE=0;EA=1;
TMOD=0x12;
TR0=0;EX0=1;
IT0=1;en=0;
while(1)
{
if(num[0]==0x49&&num[1]==0x85&&num[2]==0x54&&num[3]==0x31&&num[4]==0x59&&num[5]==0x87&&num[6]==0x91&&num[7]==0x25&&num[8]==0x34&&num[9]==0x62)
{
en=1;
number=0;
for(i=0;i<10;i++)
{send(num[i]);num[i]=0x00;}
en=0;
}
}
}

void send(uchar aa)
{
uchar i;
txd=0;
wait(0xb9);
for(i=0;i<8;i++)
{txd=aa&0x01;aa>>=1;wait(0xb9);}
txd=1;
wait(0xb9);
flag=0;
}

void int0() interrupt 0
{
uchar i;
EX0=0;clk=!clk;
wait(0xad);
for(i=0;i<7;i++)
{
number>>=1;clk=!clk;
if(rxd)number=0x80|number;
else number=0x00|number;
wait(0xb9);
}

number>>=1;clk=!clk;
if(rxd)number=0x80|number;
else number=0x00|number;
wait(0xd9);

num[flag]=number;
flag++;clk=!clk;
IE0=0;EX0=1;
if(flag>=10)flag=0;
}

void wait(uchar i)
{
TF0=0;
TH0=i;TL0=i;
TR0=1;
while(TF0==0);
TF0=0;TR0=0;
}

⑦ 51單片機要接電腦的usb口模擬串口,需不需要接其他的晶元

需要電壓轉換晶元 即驅動晶元。
單片機一般是3.3V或者5V的,電腦的串口在主板上有一個電源轉換晶元,將低壓升級到RS232標准電壓,+-12V,因此,單片機和電腦轉口連接,也需要一個電壓轉換晶元。
這種那個晶元很多,如MAX232等,可以實現2路串口電壓轉換。

⑧ 51單片機通過串口實現數據的發送與接收程序

串口收發,要有通信協議。也就是什麼時候開始接收,接收到指令後,轉發什麼數據。這個要知道,才可以寫。而且使用不同的51單片機,其內部寄存器配置是不同的。
一般來說,過程如下:
1,配置串口參數、波特率等,開啟串口中斷;
void Init_UART()
{

}
2,中斷函數里寫中斷響應函數,根據接收的指令或者數據,執行相應的動作;
程序一般為:
void UART_ISR() interrupt x using y
{
;串口中斷處理函數
}
x - 單片機的C51中斷號
y - 指定使用的當前工作寄存器組號(0-3 PSW中的RS0,RS1組合)

3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//數據發送函數
}
}

⑨ 51單片機多串口同時通信

51單片機是通過sbuf這個串口專用寄存器和串口模塊來收發數據的。發送時,只要將數據送入到sbuf,等等ti狀態到1就發送完畢。同樣接收時,ri為1,那麼說明sbuf接收完畢一幀數據,可以直接從sbuf讀取數據了。

⑩ 51單片機在筆記本電腦里找不到串口而且查上電腦沒有顯示

單片機開發板,一般需要購買一個USB轉串口的配件,這個配件會提供windows系統的驅動程序光碟,需要安裝驅動程序才可以識別。
如果是很舊的配件,有可能沒有支持windows10的驅動程序。這種情況,除了購買新的USB串口,或者使用舊的win7或XP操作系統。

閱讀全文

與51單片機模擬串口相關的資料

熱點內容
linux使用靜態庫編譯過程 瀏覽:99
android平滑滾動效果 瀏覽:841
什麼是編譯器指令 瀏覽:219
微控制器邏輯命令使用什麼匯流排 瀏覽:885
程序員在學校里是學什麼的 瀏覽:601
oraclejava數據類型 瀏覽:890
程序員考注冊會計師 瀏覽:957
怎麼使用access的命令按鈕 瀏覽:899
有點錢app在哪裡下載 瀏覽:832
博途v15解壓後無法安裝 瀏覽:205
什麼是根伺服器主機 瀏覽:438
安卓手游怎麼申請退款 瀏覽:555
安卓系統如何分享網頁 瀏覽:278
ad如何編譯pcb工程 瀏覽:414
除了滴滴app哪裡還能用滴滴 瀏覽:399
截圖怎麼保存文件夾然後壓縮 瀏覽:8
幻影伺服器怎麼樣 瀏覽:28
具體哪些廣東公司招程序員 瀏覽:872
嵌入式編譯器教程 瀏覽:307
ssl數據加密傳輸 瀏覽:88