⑴ 單片機串口中斷執行流程
流程是:(主程序中)發送數據―等待中斷―發送成功產生中斷―進入中斷清除TL,再次發送―中斷返回―等待中斷―發送成功產生中斷―進入中斷清除TL,再次發送。。。。循環而已。
⑵ 我想問下關於單片機與單片機之間串口通信的電路圖
1、最簡單的話,如果距離不是太遠,直接兩個單片機的RXD和TXD交叉相連就行了。
2、如果距離遠一點,用串口也行,你可以查一下RS232電路,TTL轉RS232電平。
⑶ 單片機串口通信步進電機控製程序流程
一樓的說的有道理啊,還是得靠自己的
給你個類似的你參考一下吧!我也不會的
實驗實現的功能主要是:用PC上的一個軟體通過串口通訊控制單片機I/O口的輸出。本次實驗主要涉及PC端上位機的程序編寫(用VC)與單片機程序的編寫(用Keil)。為了簡化實驗,PC端軟體設計成具有8個按鈕的對話框,每個按鈕分別控制單片機P2口的一個引腳的高低電平。為了體現直觀的結果,P2口上接上8個發光二極體。
PC與單片機的通訊協議如下:採用4800波特率,無校驗位,8個數據位,1個停止位,一次傳輸一個控制位元組。
一、上位機軟體的編寫
本來控制單片機只需單向傳輸數據即可,為了熟悉PC端接受數據的功能,在應用軟體將控制數據傳輸到單片機端後,單片機端回傳數據給應用軟體,並用16進制格式顯示在編輯控制項中。
VC實現對串口的控制主要有兩種方式:mscomm控制項與api函數。由於mscomm控制項實現簡單,本實驗採用該方式。
1. 在VC中創建一個基於對話框的應用程序,在該程序中插入Mscomm控制項。修改對話框資源,增加Mscomm及8個按鈕控制項與一個編輯框。並為Mscomm控制項增加一個控制項變數m-com。
2. 在對話框的OnInitDialog()函數中初始化串口,代碼如下:
if(m_com.GetPortOpen())
m_com.SetPortOpen(FALSE);
m_com.SetCommPort(1);//選擇com1
if(!m_com.GetPortOpen())
m_com.SetPortOpen(TRUE);//打開串口
else
MessageBox("無法打開串口!");
m_com.SetSettings("4800,n,8,1");//波特率4800,無校驗,8個數據位,1個停止位
m_com.SetInputMode(1); //1:表示以二進制方式檢取數據
m_com.SetRThreshold(1);//參數1表示每當串口接收緩沖區中有多於
//或等於1個字元時將引發一個接收數據的OnComm事件
m_com.SetInputLen(0); //設置當前接收區數據長度為0
m_com.GetInput();//先預讀緩沖區以清除殘留數據
3.為每個按鈕添加命令函數。下面為其中一個函數的代碼,其他與此類似。
void CComDlg::OnP20()
{
// TODO: Add your control notification handler code here
Output.Format("%c",0x01);
m_com.SetOutput(COleVariant(Output));
}
4.接受數據時採用Mscomm控制項的響應函數進行對事件的捕捉。處理代碼如下:
void CComDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT Input;
CString temp;
long k,len;
COleSafeArray OleArray;
BYTE rxdata[10];
if (2==m_com.GetCommEvent())
{
Input=m_com.GetInput();
OleArray=Input;
len=OleArray.GetOneDimSize();
for (k=0;k<len;k++)
{
OleArray.GetElement(&k,rxdata+k);
BYTE bt=*(char *)(rxdata+k);
temp.Format("%02X ",bt);
m_recv+=temp;
}
}
UpdateData(FALSE);
}
二、單片機程序的編寫。
單片機程序編寫相對容易,只需進行初始話串口,接受數據,發送數據等工作即可。代碼如下:
#i nclude <reg51.h>
unsigned char inbuf;
unsigned char flag;
//初始化函數
void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr,0101000b
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload,0010000b
PCON |= 0x80; //SMOD=1;10000000b
TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
inbuf=0;
P2=0;
// TI=1;
}
//向串口發送一個字元
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//串口接收中斷函數
void serial () interrupt 4 using 3
{
if(RI)
{
RI = 0;
inbuf=SBUF;
}
flag=1;
}
main()
{
init_serialcomm(); //初始化串口
while(1)
{
if(flag)
{
P2=inbuf;
send_char_com(inbuf);
flag=0;
}
}
}
⑷ 單片機程序流程圖,速求。只要流程圖,不要太復雜,簡單點最好。
1開機初始化
2串口中斷接收
3當串口接收到 + 號 P1最低位 輸出高 延時加5US --關P1最低位
4當串口接收到 - 號 P1最低位 輸出高 延時減5US --關P1最低位
5重復3,4步驟
此處不能畫圖,只能這樣描述
⑸ 51單片機和計算機之間實現串口通信的電路圖
串口通訊參考程序如下:
來源:深入淺出AVR單片機
#include<reg51.h>
unsignedcharUART_RX;//定義串口接收數據變數
unsignedcharRX_flag;//定義穿行接收標記
/*********************************************************************************************
函數名:UART串口初始化函數
調用:UART_init();
參數:無
返回值:無
結果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(佔用)
備註:振盪晶體為12MHz,PC串口端設置[4800,8,無,1,無]
/**********************************************************************************************/
voidUART_init(void){
EA=1;//允許總中斷(如不使用中斷,可用//屏蔽)
ES=1;//允許UART串口的中斷
TMOD=0x20;//定時器T/C1工作方式2
SCON=0x50;//串口工作方式1,允許串口接收(SCON=0x40時禁止串口接收)
TH1=0xF3;//定時器初值高8位設置
TL1=0xF3;//定時器初值低8位設置
PCON=0x80;//波特率倍頻(屏蔽本句波特率為2400)
TR1=1;//定時器啟動
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:UART串口接收中斷處理函數
調用:[SBUF收到數據後中斷處理]
參數:無
返回值:無
結果:UART串口接收到數據時產生中斷,用戶對數據進行處理(並發送回去)
備註:過長的處理程序會影響後面數據的接收
/**********************************************************************************************/
voidUART_R(void)interrupt4using1{//切換寄存器組到1
RI=0;//令接收中斷標志位為0(軟體清零)
UART_RX=SBUF;//將接收到的數據送入變數UART_data
RX_flag=1;//標記接收
//用戶函數內容(用戶可使用UART_data做數據處理)
//SBUF=UART_data;//將接收的數據發送回去(刪除//即生效)
//while(TI==0);//檢查發送中斷標志位
//TI=0;//令發送中斷標志位為0(軟體清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:UART串口發送函數
調用:UART_T(?);
參數:需要UART串口發送的數據(8位/1位元組)
返回值:無
結果:將參數中的數據發送給UART串口,確認發送完成後退出,採用非中斷方式
備註:
/**********************************************************************************************/
voidUART_T(unsignedcharUART_data){//定義串口發送數據變數
ES=0;//禁止穿行中斷
SBUF=UART_data;//將接收的數據發送回去
while(TI==0);//檢查發送中斷標志位
TI=0;//令發送中斷標志位為0(軟體清零)
ES=1;//打開穿行中斷
}
/*********************************************************************************************
函數名:UART串口發送字元串函數
調用:UART_S(?);
參數:需要UART串口發送的數據(8位/1位元組)
返回值:無
結果:將參數中的數據發送給UART串口,確認發送完成後退出,採用非中斷方式
備註:
/**********************************************************************************************/
voidUART_S(unsignedchar*str)
{
while(1)
{
if(*str=='