實驗七單片機串口通信_第1頁
實驗七單片機串口通信_第2頁
實驗七單片機串口通信_第3頁
實驗七單片機串口通信_第4頁
實驗七單片機串口通信_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實 驗 七 串口通信實驗【實驗目的】1、理解單片機串行口的工作原理;2、學習使用單片機的TXD、RXD口;3、學習PC機的串口通訊原理。【實驗內容】 任務:1.單片機與電腦串口通訊,將單片機與電腦相連,借助串口調試助手,單片機發送“Everything is possible _”。2.串口調試助手中輸入“turnonled1 ”、 “turnonled2 ”、 “turnonled3 ”中一個,相應的led點亮,單片機再發送“Turn on LED1 has been executed!”消息提示輸入下一個需要點亮的燈。通訊波特率:9600bps,信息格式:無校驗位8個數據位1個停止位,傳送

2、方式,單片機采用中斷方式接收信息。原理:串行口控制寄存器SCON的格式如下: SM0 SM1 SM2 REN TB8 RB8 T1 RISM0、SM1:由軟件置位或清零,用于選擇串行口四種工作方式。SM2:多機通信控制位。在方式2和方式3中,如SM2=1,則接收到的第9位數據(RB8)為0時不啟動接收中斷標志RI(即RI=0),并且將接收到的前8位數據丟棄;RB8為1時,才將接收到的前8位數據送入SBUF,并置位RI,產生中斷請求。當SM2=0時,則不論第9位數據為0或1,都將前8位數據裝入SBUF中,并產生中斷請求。在方式0時,SM2必須為0。REN:允許串行接收控制位。若REN=0,則禁止

3、接收;REN=1,則允許接收,該位由軟件置位或復位。TB8:發送數據D8位。在方式2和方式3時,TB8為所要發送的第9位數據。在多機通信中,以TB8位的狀態表示主機發送的是地址還是數據:TB8=0為數據,TB8=1為地址;也可用作數據的奇偶校驗位。該位由軟件置位或復位。RB8:接收數據D8位。在方式2和方式3時,接收到的第9位數據,可作為奇偶校驗位或地址幀或數據幀的標志。方式1時,若SM2=0,則RB8是接收到的停止位。在方式0時,不使用RB8位。TI:發送中斷標志位。在方式0時,當發送數據第8位結束后,或在其它方式發送停止位后,由內部硬件使TI置位,向CPU請求中斷。CPU在響應中斷后,必須

4、用軟件清零。此外,TI也可供查詢使用。RI:接收中斷標志位。在方式0時,當接收數據的第8位結束后,或在其它方式接收到停止位的中間由內部硬件使RI置位,向CPU請求中斷。同樣,在CPU響應中斷后,也必須用軟件清零。RI也可供查詢使用。電源控制寄存器PCON的格式如下:SMOD-CF1CF0PDIDLPCON的最高位SMOD是串行口波特率系數控制位。SMOD=1時,波特率增大一倍。其余各位與串行口無關。波特率設置:串行口的4種工作方式對應著三種波特率模式。對于方式0,波特率是固定的,為fosc/12。對于方式2,波特率由振蕩頻率fosc和SMOD(PCON.7)所決定。其對應公式為波特率=2SMO

5、D×fosc/64。當SMOD=0時,波特率為fosc/64;當SMOD=1時,波特率為fosc/32。對于方式1和方式3,波特率由定時器/計數器T1的溢出率和SMOD決定,即由下式確定:波特率=2SMOD×定時器/計數器T1溢出率/32鑒于8051單片機輸入、輸出電平均為TTL/CMOS電平,而計算機配置的是RS232標準串行接口,使用的是RS232標準電平(邏輯0:+3V+15V,邏輯1:約-3V-15V),二者的電氣規范不一致,因此要完成PC機與單片機的數據通訊,必須進行電平轉換。實驗參考程序:一、任務11.main.c程序/*程序名稱:串口發送數據(晶振頻率18.4

6、32MHz) 功能說明: 通過串口1發送“Everything is possible!” 波特率9600,數據位8,奇偶效驗無,停止位1,數據流控制無 */#include "iap15w4k58s4.h" #include <intrins.h> / 加入此頭文件后,可使用_nop_庫函數#include "delay.h" / 延時函數頭文件#include "uart.h" / 串行通信函數頭文件/=/ 函數: void SYS_Init(void)/ 描述: 單片機端口初始化/=void SYS_Init()P0

7、M0=0x20;P0M1=0x20;P1M0=0x3C;P1M1=0x3C;P2M0=0x00;P2M1=0x00;P3M0=0x00;P3M1=0x00;P4M0=0x00;P4M1=0x00;P5M0=0x00;P5M1=0x00;/=/ 函數: void main(void)/ 描述: 主函數/=void main() / 主函數 SYS_Init(); DelayMS(100); UartInit(); / 初始化串口DelayUS(100); while (1) / 主循環 DelayMS(2000);/ 延時2秒 SendString("Everything is pos

8、sible _rn");/ 發送字符串 2. uart.c程序/*程序名稱:串口1通訊函數(晶振頻率18.432MHz) 功能說明: 串口1初始化,字符發送與字符串發送函數,波特率9600bps*/ #include "iap15w4k58s4.h"#include "intrins.h"void SendData(unsigned char ch);void SendString(char *s);void UartInit(void);/*-串口初始化-*/void UartInit(void)/9600bps18.432MHzPCON &

9、amp;= 0x7F;/波特率不倍速SCON = 0x50;/8位數據,可變波特率AUXR |= 0x40;/定時器1時鐘為Fosc,即1TAUXR &= 0xFE;/串口1選擇定時器1為波特率發生器TMOD &= 0x0F;/清除定時器1模式位TMOD |= 0x20;/設定定時器1為8位自動重裝方式TL1 = 0xC4; /設定定時初值TH1 = 0xC4;/設定定時器重裝值ET1 = 0;/禁止定時器1中斷TR1 = 1;/啟動定時器1/*-發送串口數據-*/void SendData(unsigned char ch) SBUF = ch; /寫數據到UART數據寄存器

10、while(TI = 0);TI = 0;/*-發送字符串-*/void SendString(char *s) while (*s) /檢測字符串結束標志 SendData(*s+); /發送當前字符 3.uart.h程序 #ifndef _UART_H_#define _UART_H_void SendData(unsigned char ch);void SendString(char *s);void UartInit(void);#endif4.delay.c程序/*程序名稱:延時函數(晶振頻率18.432MHz)功能說明: 延時毫秒與微秒*/#include "iap15

11、w4k58s4.h" / 單片機STC15F2K60S2頭文件,可以不再加入reg51.h#include <intrins.h> / 加入此頭文件后,可使用_nop_庫函數#include <stdio.h>void Delay1us()/18.432MHzunsigned char i;i = 2;while (-i);void Delay1ms()/18.432MHzunsigned char i, j;i = 18;j = 235;dowhile (-j); while (-i);void DelayMS(int t)while(t-)Delay1ms

12、();void DelayUS(int t)while(t-)Delay1us();5.delay.c 程序#ifndef _DELAY_H_#define _DELAY_H_void DelayUS(int t);void DelayMS(int t);#endif 二、任務2 擴展部分程序串口1中斷控制,串口控制單片機上的三只LED燈的開啟和關閉,串口1收到數據,如果數據為“turnonled1"、"turnonled2"、"turnonled3"對應LED點亮2秒后,再熄滅。(上一工程的主程序換成如下程序)Main.c/* 程序名稱:串口

13、1中斷控制測試(晶振頻率18.432MHz) 功能說明: 串口1收到數據,如果數據為“turnonled1"、"turnonled2"、"turnonled3"對應LED點亮2秒后,再熄滅。 波特率9600,數據位8,奇偶效驗無,停止位1,數據流控制無*/#include "iap15w4k58s4.h"#include <intrins.h> / 加入此頭文件后,可使用_nop_庫函數#include "delay.h" / 延時函數頭文件#include "uart.h"

14、; / 串行通信函數頭文件#include<string.h> #define Buf_Max 20 /串口數據緩存長度unsigned char Rec_BufBuf_Max; /串口數據緩存unsigned char i = 0; /綬存指針void CLR_Buf(void); /數據清零bit Hand(unsigned char *a); /對串口緩存數據進行識別,是否包含已知的命令sbit LED1 = P50; / 定義LED1為P5.0 sbit LED2 = P51;/ 定義LED2為P5.1sbit LED3 = P52;/ 定義LED3為P5.2/=/ 函數:

15、 void SYS_Init(void)/ 描述: 單片機端口初始化/=void SYS_Init()P0M0=0x20;P0M1=0x20;P1M0=0x3C;P1M1=0x3C;P2M0=0x00;P2M1=0x00;P3M0=0x00;P3M1=0x00;P4M0=0x00;P4M1=0x00;P5M0=0x00;P5M1=0x00;/=/ 函數: void main(void)/ 描述: 主函數/= void main() / 主函數 SYS_Init(); DelayMS(100); UartInit(); / 初始化串口DelayUS(100); ES=1; / 開串口1中斷 EA

16、=1; / 開總中斷LED1 = 1;SendString("Please enter your command:rn"); while (1) / 主循環 if(Hand("turnonled1")ES = 0; LED1 = 0;DelayMS(1000);DelayMS(1000);LED1 = 1;CLR_Buf();SendString("Command: Turn on LED1 has been executed!rn");ES = 1;else if(Hand("turnonled2")ES = 0

17、; LED2 = 0;DelayMS(1000);DelayMS(1000);LED2 = 1;CLR_Buf();SendString("Command: Turn on LED2 has been executed!rn");ES = 1;else if(Hand("turnonled3")ES = 0; LED3 = 0;DelayMS(1000);DelayMS(1000);LED3 = 1;CLR_Buf();SendString("Command: Turn on LED3 has been executed!rn");ES = 1; bit Hand(unsigned char *a) / 串口命令識別函數 if(strstr(Rec_Buf,a)!=NULL) return 1;elsereturn 0;void CLR_Buf(void) / 串口緩存清理unsigned char k; for(k=0;k<B

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論