版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、51單片機(jī)串口通信1./*打開串口調(diào)試程序,將波特率設(shè)置為9600,無奇偶校驗晶振11.0592MHz,發(fā)送和接收使用的格式相同,如都使用字符型格式,在發(fā)送框輸入 hello,I Love MCU ,在接收框中同樣可以看到相同字符,說明設(shè)置和通信正確*/#include /*主程序*/void main (void) SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload*/ TH1 = 0xFD; /* TH1: reload value for 96
2、00 baud 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打開總中斷*/ ES = 1; /*打開串口中斷*/while (1) /*主循環(huán)不做任何動作*/ void UART_SER (void) interrupt 4 /串行中斷服務(wù)程序 unsigned char Temp; /定義臨時變量 if(RI) /判斷是接收中斷產(chǎn)生 RI=0; /標(biāo)志位清零 Temp=SBUF; /讀入緩沖區(qū)的值 P1=Temp; /把值輸出到P1口,用于觀察 SBUF=Temp; /把接收到的值再發(fā)回電腦端 if(TI) /如果是發(fā)送標(biāo)志
3、位,清零 TI=0; 2.51單片機(jī)與電腦串口通信的C程序,最好是中斷方式的#include #include unsigned char ch;bit read_flag= 0 ; void init_serialcom( void ) /串口通信初始設(shè)定 SCON = 0x50 ; /UART為模式1,8位數(shù)據(jù),允許接收 TMOD |= 0x20 ; /定時器1為模式2,8位自動重裝 PCON |= 0x80 ; /SMOD=1; TH1 = 0xFD ; /Baud:19200 fosc=11.0592MHz IE |= 0x90 ; /Enable Serial Interrupt T
4、R1 = 1 ; / timer 1 run TI=1; /向串口發(fā)送一個字符 void send_char_com( unsigned char ch) SBUF=ch; while (TI= 0); TI= 0 ; void serial () interrupt 4 using 3 /串口接收中斷函數(shù) if (RI) RI = 0 ; ch=SBUF; read_flag= 1 ; /就置位取數(shù)標(biāo)志 main() init_serialcom(); /初始化串口 while ( 1 ) if (read_flag) /如果取數(shù)標(biāo)志已置位,就將讀到的數(shù)從串口發(fā)出 read_flag= 0
5、; /取數(shù)標(biāo)志清0 send_char_com(ch); 3./ 單片機(jī)串行口發(fā)送/接收程序,每接收到字節(jié)即發(fā)送出去/ 和微機(jī)相接后鍵入的字符回顯示在屏幕上/ 可用此程序測試#include #define XTAL / CUP 晶振頻率#define baudrate 9600 / 通信波特率void main(void) unsigned char c; TMOD = 0x20; / 定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率 TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate); TL1=(unsigned char)(2
6、56 - (XTAL / (32L * 12L * baudrate); / 定時器0賦初值SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; / 禁止任何中斷 while(1) while(RI = 0); RI = 0; c = SBUF; / 從緩沖區(qū)中把接收的字符放入c中 SBUF = c; / 要發(fā)送的字符放入緩沖區(qū) while(TI = 0); TI = 0; 4./ /E51Pro.c/Easy 51Pro編程器主程序,負(fù)責(zé)通訊,管理編程操作/#include BYTE ComBuf18;/串口通訊數(shù)據(jù)緩存,發(fā)送和接收都使用UINT nAd
7、dress;/ROM中地址計數(shù)UINT nTimeOut;/超時計數(shù)ProWork pw;/編程器一般操作void Delay_us(BYTE nUs)/微秒級延時255us TH0=0; TL0=0; TR0=1; while(TL0nUs)/利用T0做定時計數(shù)器,循環(huán)采樣,直到達(dá)到定時值 TR0=0;void Delay_ms(UINT nMs)/豪秒級的延時65535ms UINT n=0; TR0=1; while(nnMs)/利用T0做定時計數(shù)器,循環(huán)采樣,直到達(dá)到定時值 TH0=0; TL0=20; while(TH04) n+; TR0=0; BOOL WaitComm()/等待
8、上位機(jī)的命令,18字節(jié) BYTE n=0; RI=0; while(!RI)/等待第一個字節(jié) ComBufn=SBUF; RI=0; n+; for(n;n10000)/后17個字節(jié)都有超時限制 return 0; ComBufn=SBUF; RI=0; return 1;BOOL WaitResp()/等待上位機(jī)回應(yīng),1字節(jié),有超時限制 nTimeOut=0; RI=0; while(!RI) nTimeOut+; if(nTimeOut50000) return 0; RI=0; ComBuf0=SBUF; return 1;BOOL WaitData()/寫器件時等待上位機(jī)數(shù)據(jù),18字節(jié)
9、,有超時限制 BYTE n; RI=0; for(n=0;n10000) return 0; RI=0; ComBufn=SBUF; return 1;void SendData()/發(fā)送數(shù)據(jù)或回應(yīng)操作完成,18字節(jié) BYTE n=0; for(n;n=17;n+) TI=0; SBUF=ComBufn; while(!TI) TI=0; void SendResp()/回應(yīng)上位機(jī)1個字節(jié),在寫器件函數(shù)中使用 TI=0; SBUF=ComBuf0; while(!TI) TI=0;void SetVpp5V()/設(shè)置Vpp為5v P3_4=0; P3_3=0;void SetVpp0V()/設(shè)
10、置Vpp為0v P3_3=0; P3_4=1;void SetVpp12V()/設(shè)置Vpp為12v P3_4=0; P3_3=1;void RstPro()/編程器復(fù)位 pw.fpProOver();/直接編程結(jié)束 SendData();/通知上位機(jī),表示編程器就緒,可以直接用此函數(shù)因為協(xié)議號(ComBuf0)還沒被修改,下同void ReadSign()/讀特征字 pw.fpReadSign(); SendData();/通知上位機(jī),送出讀出器件特征字void Erase()/擦除器件 pw.fpErase(); SendData();/通知上位機(jī),擦除了器件void Write()/寫器件
11、 BYTE n; pw.fpInitPro();/編程前的準(zhǔn)備工作 SendData();/回應(yīng)上位機(jī)表示進(jìn)入寫器件狀態(tài),可以發(fā)來數(shù)據(jù) while(1) if(WaitData()/如果等待數(shù)據(jù)成功 if(ComBuf0=0x07)/判斷是否繼續(xù)寫 for(n=2;n=17;n+)/ComBuf217為待寫入數(shù)據(jù)塊 if(!pw.fpWrite(ComBufn)/ 調(diào)用寫該器件一個單元的函數(shù) pw.fpProOver();/出錯了就結(jié)束編程 ComBuf0=0xff; SendResp();/回應(yīng)上位機(jī)一個字節(jié),表示寫數(shù)據(jù)出錯了 WaitData();/等待上位機(jī)的回應(yīng)后就結(jié)束 return;
12、 nAddress+;/下一個單元 ComBuf0=1;/回應(yīng)上位機(jī)一個字節(jié),表示數(shù)據(jù)塊順利完成,請求繼續(xù) SendResp(); else if(ComBuf0=0x00)/寫器件結(jié)束 break; else/可能是通訊出錯了 pw.fpProOver(); return; else/等待數(shù)據(jù)失敗 pw.fpProOver(); return; pw.fpProOver();/編程結(jié)束后的工作 Delay_ms(50);/延時等待上位機(jī)寫線程結(jié)束 ComBuf0=0;/通知上位機(jī)編程器進(jìn)入就緒狀態(tài) SendData();void Read()/讀器件 BYTE n; pw.fpInitPro
13、();/先設(shè)置成編程狀態(tài) SendData();/回應(yīng)上位機(jī)表示進(jìn)入讀狀態(tài) while(1) if(WaitResp()/等待上位機(jī)回應(yīng)1個字節(jié) if(ComBuf0=0)/ComBuf0=0表示讀結(jié)束 break; else if(ComBuf0=0xff)/0xff表示重發(fā) nAddress=nAddress-0x0010; for(n=2;n=17;n+)/ComBuf217保存讀出的數(shù)據(jù)塊 ComBufn=pw.fpRead();/調(diào)用寫該器件一個單元的函數(shù) nAddress+;/下一個單元 ComBuf0=6;/向上位機(jī)發(fā)送讀出的數(shù)據(jù)塊 SendData(); else break;
14、/等待回應(yīng)失敗 pw.fpProOver();/操作結(jié)束設(shè)置為運(yùn)行狀態(tài) ComBuf0=0;/通知上位機(jī)編程器進(jìn)入就緒狀態(tài) SendData();void Lock()/寫鎖定位 pw.fpLock(); SendData();/所支持的FID,請在這里繼續(xù)添加/extern void PreparePro00();/FID=00:AT89C51編程器extern void PreparePro01();/FID=01:AT89C2051編程器extern void PreparePro02();/FID=02:AT89S51編程器void main() SP=0x60; SetVpp5V()
15、;/先初始化Vpp為5v SCON=0x00; TCON=0x00; /PCON=0x00;/波特率*2 IE=0x00; /TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0 / 0 0 1 0 0 0 0 1 TMOD=0x21;/T0用于延時程序 TH1=0xff; TL1=0xff;/波特率28800*2,注意PCON /SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI / 0 1 0 1 0 0 0 0 SCON=0x50; TR1=1; Delay_ms(1000);/延時1秒后編程器自舉 ComBuf0=0; SendData();
16、while(1)/串口通訊采用查詢方式 if(!WaitComm()/如果超時,通訊出錯 Delay_ms(500); ComBuf0=0;/讓編程器復(fù)位,使編程器就緒 switch(ComBuf1)/根據(jù)FID設(shè)置(ProWork)pw中的函數(shù)指針 case 0: /at89c51編程器 PreparePro00(); break; case 1: /at89c2051編程器 PreparePro01(); break; case 2:/at89s51編程器 PreparePro02(); break; /case 3:支持新器件時,請繼續(xù)向下添加 / break; /case 4: / b
17、reak; default: ComBuf0=0xff; ComBuf1=0xff; /表示無效的操作 break; switch(ComBuf0)/根據(jù)操作ID跳到不同的操作函數(shù) case 0x00: RstPro();break; / /編程器復(fù)位 case 0x01: ReadSign();break; /讀特征字 case 0x02: Erase();break;/擦除器件 case 0x03: Write();break;/寫器件 case 0x04: Read();break;/讀器件 case 0x05: Lock();break;/寫鎖定位 default: SendData(
18、);break; 5.void InitSerial(void) TMOD = 0x20; / T1 方式2 PCON=0x00; / PCON=00H,SMOD=0 PD = PCON.2 = 1 進(jìn)入掉電模式 TH1 = TL1 = BAUD_9600; / BAUD: 9600 SCON = 0x50; / 串行通信方式1 REN=1 允許接收 ET1 = 0; / 不允許中斷 TR1 = 1; / 開啟定時器1 IE = 0; / 關(guān)閉所有中斷允許位 memset(&SerialBuf, 0x00, SERIAL_BUF_LEN); / 初始化SerialBufSERIAL_BUF_L
19、EN/*名稱:SendByte()*功能:串口發(fā)送一個字節(jié)*輸入:ucData*返回:無*說明:無*/void SendByte(unsigned char ucData) SBUF = ucData; while(!TI) _CLRWDT_; TI = 0; RS232串口通信程序#include unsigned char code dispcode1= welcome! ;unsigned char code dispcode2=;unsigned char i,j,k,l,DData;sbit RS = P35; sbit RW = P36; sbit
20、E = P37;unsigned char m=0;void delay()for(l=0;l=100;l+)void enable() /write orderRS=0;RW=0;E=0;delay();E=1;void enable2() /write dataRS=1;RW=0;E=0;delay();E=1;void initializtion() /lcd initializtionfor(i=0;i16) m=0;ES=1;void system_initial(void) /system initializtion TMOD=0x21;/ 定時器1工作方式2, 定時器0工作方式1
21、 PCON=0x00;/數(shù)據(jù)傳輸率選擇。 SCON=0x50;/串口工作方式選擇, 并打開接收允許。 TH1=0xfd;/定時器賦初值。 TL1=0xfd;/波特率9600bit/s TR1=1;/啟動定時器。 EA = 1; /開總中斷。 ES = 1; void main() initializtion(); P0=0x80;enable(); for(j=0;j=15;j+) P0=dispcode1j; enable2(); P0=0xC0;enable(); for(k=0;k=15;k+) P0=dispcode2k; enable2(); system_initial(); wh
22、ile(1);RS232串口通信單片機(jī)接收發(fā)送數(shù)據(jù)的C51程序這是一個單片機(jī)C51串口接收(中斷)和發(fā)送例程,可以用來測試51單片機(jī)的中斷接收和查詢發(fā)送。關(guān)于RS232串口通信原理詳解見:/gilbertjuly/blog/item/902a3f11d4b42b0b203f2e39.html關(guān)于單片機(jī)串口控制寄存器設(shè)置見:/embedded/51danpianji/danpianji06_chuankou.html#include #include #define length 4 /數(shù)據(jù)長度unsigned char inbufleng
23、th;unsigned char checksum,counter;bit flag = 0; /取數(shù)標(biāo)記main()init_serial(); /串行口初始化while (1)if (flag!=0) /如果取數(shù)標(biāo)志已置位,就將讀到的數(shù)從串口發(fā)出flag= 0; /取數(shù)標(biāo)志清0send_string(inbuf,length); /向串口發(fā)送字符串/* 串行口初始化 */void init_serial( void ) SCON = 0x50; /串行工作方式1, 8位異步通信方式TMOD |= 0x20; /定時器1, 方式 2, 8位自動重裝PCON |= 0x80; /SMOD=1,
24、表示數(shù)據(jù)傳輸率加倍TH1 = 0xF4; /數(shù)據(jù)傳輸率:4800 fosc=11.0592MHzIE |= 0x90; /允許串行中斷TR1 = 1; /啟動定時器1/* 向串口發(fā)送一個字符 */void send_char( unsigned char x)SBUF=x;while (TI= 0 );TI= 0;/* 向串口發(fā)送一個字符串,string_length為該字符串長度 */void send_string( unsigned char *s, unsigned int string_length)unsigned int i= 0;dosend_char(*(s + i); /向
25、串口發(fā)送一個字符i+;while ( i 127 )counter= 0;inbufcounter=x;checksum= x- 128;elsecounter+;inbufcounter=x;checksum = x;if (counter=(length- 1) & (!checksum)flag= 1; /如果串口接收的數(shù)據(jù)達(dá)到length個, 且校驗沒錯,/就置位取數(shù)標(biāo)志手把手教你用增強(qiáng)型51實驗板實現(xiàn)RS232串口通信下面我們一起來完成一個用單片機(jī)從串行口接收PC機(jī)數(shù)據(jù),并在數(shù)碼管上顯示出來的實驗。先介紹一下串口通信基本知識。目前較為常用的串口有9針串口(DB9)和25針串口(DB2
26、5)。最為簡單且常用的是三線制接法,即地、接收數(shù)據(jù)和發(fā)送數(shù)據(jù)三腳相連,本文只涉及到最為基本的接法,且直接用RS232相連。串口引腳定義如圖1所示。9針串口(DB9) 25針串口(DB25) 針號 功能說明 縮寫 針號 功能說明 縮寫 1 數(shù)據(jù)載波檢測 DCD 8 數(shù)據(jù)載波檢測 DCD 2 接收數(shù)據(jù) RXD 3 接收數(shù)據(jù) RXD 3 發(fā)送數(shù)據(jù) TXD 2 發(fā)送數(shù)據(jù) TXD 4 數(shù)據(jù)終端準(zhǔn)備 DTR 20 數(shù)據(jù)終端準(zhǔn)備 DTR 5 信號地 GND 7 信號地 GND 6 數(shù)據(jù)設(shè)備準(zhǔn)備好 DSR 6 數(shù)據(jù)準(zhǔn)備好 DSR 7 請求發(fā)送 RTS 4 請求發(fā)送 RTS 8 清除發(fā)送 CTS 5 清除發(fā)送
27、CTS 9 振鈴指示 DELL 22 振鈴指示 DELL 我們來看一下本次實驗的電路圖,如圖2所示,即增強(qiáng)型51實驗板實現(xiàn)串口通信及數(shù)碼管顯示的電路部分。圖2中的4個三極管分別與4個共陽數(shù)碼管相連,是各個數(shù)碼管的使能端,分別通過單片機(jī)的P2.0,P2.1,P2.2,P2.3來控制,數(shù)碼管顯示的詳細(xì)工作原理,我們已在前幾期雜志中作過介紹,有興趣的朋友可以去看一下以前幾期的內(nèi)容。圖2中MAX232芯片起到RS232與TTL電平轉(zhuǎn)換的作用,我們通過9芯串口與PC機(jī)相連。 下面是我們完成本次實驗的源程序代碼,使用Keil編譯軟件,將其編譯生成HEX文件,然后,通過A51編程器燒入AT89S51芯片即可
28、。#include reg51.h #include Unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char dat;void Init_Com(void)TMOD = 0x20; /定時器工作方式2,初值自動裝入PCON = 0x00; /波特率不增倍SCON = 0x50; /串行工作方式設(shè)定 TH1 = 0xFd; /定時器初值高位TL1 = 0xFd; /定時器初值低位TR1 = 1; /啟動定時器 /*函數(shù)功能:LED數(shù)碼管延時程序*/void delay(void)
29、int k;for(k=0;k600;k+);/*函數(shù)功能:LED數(shù)碼管顯示程序*/void display(int k)P2=0xfe; /位選 P0=tabk/1000; /顯示千位數(shù)字delay(); /延時P2=0xfd; /位選P0=tabk%1000/100; /顯示百位數(shù)字delay(); /延時P2=0xfb; /位選P0=tabk%100/10; /顯示十位數(shù)字delay(); /延時P2=0xf7; /位選P0=tabk%10; /顯示個位數(shù)字delay(); /延時P2=0xff; /位選/*函數(shù)功能:主程序*/void main() P2=0xff; /端口初始化,關(guān)L
30、ED顯示P0=0xff;Init_Com(); /調(diào)用串口初始化程序while(1) /主循環(huán)if ( RI ) /判斷是否收到數(shù)據(jù)dat = SBUF; /接收數(shù)據(jù)RI = 0; /軟件清除標(biāo)志位display(dat-48); /顯示收到的數(shù)據(jù) 我們來一起分析一下程序代碼,main主程序首先將P2口和P0口全部輸出高電平,即數(shù)據(jù)管不顯示任何內(nèi)容,Init_Com函數(shù)用來初始化串口設(shè)置,如波特率設(shè)置,工作方式的設(shè)置,這些都是程序運(yùn)行的一切初始化設(shè)置。然后,我們看到了一個while(1)語句,該語句的作用是產(chǎn)生死循環(huán),即單片機(jī)上電復(fù)位后,我們就不斷地去接收由PC機(jī)發(fā)過來的串口數(shù)據(jù),同時將接收到
31、的數(shù)據(jù)放在dat 這個變量中,每接收完一次數(shù)據(jù),我們需要執(zhí)行RI = 0這條語句,用來清除串口數(shù)據(jù)接收標(biāo)志位,現(xiàn)在我們已經(jīng)收到了PC機(jī)傳過來的數(shù)據(jù)了,余下的任務(wù)就是要將數(shù)字通過數(shù)碼管顯示出來,我想大家看了我們前幾期的介紹,已經(jīng)并不陌生數(shù)碼管的使用了,在這里,我們也寫得非常簡潔,通過display這個函數(shù)將數(shù)字顯示出來,因為我們收到的是字符型的ASCII碼數(shù)據(jù),如數(shù)字“0”的ASCII碼值是48,所以,我們要顯示“0”的話,還需要將其值減去48后才是真正要顯示的數(shù)據(jù)。數(shù)碼管我們采用動態(tài)掃描法進(jìn)行顯示,delay函數(shù)的作用是產(chǎn)生一定時間的延時,對于人眼來說是分辨不出來的,在display的函數(shù)體內(nèi)
32、,我們先將數(shù)據(jù)裝載到P0口,如我們在程序開始時定義的:unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90語句,意思相當(dāng)于:數(shù)字“0”對應(yīng)的數(shù)碼管段碼值為“0xc0”, 數(shù)字“1”對應(yīng)的數(shù)碼管段碼值為“0xf9”, 數(shù)字“2”對應(yīng)的數(shù)碼管段碼值為“0xa4”以此類推,最后通過數(shù)碼管的使能端來顯示各位數(shù)碼管的值。至此,整個程序的功能就輕松地實現(xiàn)了我們所需要的功能,看到這里相信你現(xiàn)在對串行通信感到并不是原來想的那么深奧了吧。 現(xiàn)在我們已經(jīng)將程序?qū)懞茫肓藛纹瑱C(jī)芯片,下面我們要做的就是用串口線將增強(qiáng)型51
33、實驗板和PC機(jī)相連起來,同時給實驗板接上電源,然后就是通過PC機(jī)軟件來發(fā)數(shù)據(jù)了,要在PC機(jī)上向串口發(fā)送數(shù)據(jù)一定要借助相應(yīng)軟件,打開光盤內(nèi)附帶的串口調(diào)試軟件,它設(shè)置方便、靈活,界面簡潔明。因為我們得告訴實驗板來顯示哪些數(shù)字,程序的功能是發(fā)送“1”、“2”、“3”.“8”、“9”、“0”等字符,增強(qiáng)型51實驗板收到數(shù)據(jù)后通過數(shù)碼管顯示出來,所以我們得在軟件發(fā)送區(qū)內(nèi)填上我們所需要發(fā)送的數(shù)字,如圖3所示。 串口調(diào)試軟件中,設(shè)置參數(shù)如下:串口:COM1;波特率:9600;校驗位:無;數(shù)據(jù)位:8位;停止位:1位;發(fā)送內(nèi)容:5當(dāng)我們點(diǎn)擊“手動發(fā)送”按鈕后,我們可以看到增強(qiáng)型51實驗板上的數(shù)碼管已顯示數(shù)字“5
34、”的字樣,如圖4所示。當(dāng)然,我們也可以選擇“自動發(fā)送”,即每隔一定的時間,由軟件自動發(fā)送“發(fā)送緩沖區(qū)”內(nèi)的數(shù)據(jù),時間周期可以在軟件界面中設(shè)置?,F(xiàn)在,你已經(jīng)可以自由發(fā)揮來接收PC機(jī)發(fā)過來的數(shù)據(jù)了,只要發(fā)揮你的想象力,定義好PC機(jī)和單片機(jī)兩端的數(shù)據(jù)通信協(xié)議,你可以做出任何通過電腦來對單片機(jī)進(jìn)行控制的程序,實現(xiàn)各種各樣的數(shù)據(jù)傳輸,遠(yuǎn)程控制功能,比如通過PC機(jī)來控制液晶顯示、控制步進(jìn)電機(jī)的轉(zhuǎn)動、控制蜂鳴器奏樂等等,您也可以將本期所講的知識與前幾期所講的關(guān)聯(lián)起來,完成功能更多,更實用的具體應(yīng)用實例。因此,到本期的學(xué)習(xí),我們已經(jīng)可以將單片機(jī)與PC相連,借助PC機(jī)強(qiáng)大而靈活的功能,就可以為我們解決各類實際生
35、產(chǎn)及應(yīng)用型問題提供了方便。這一期的內(nèi)容我們就介紹到這里,增強(qiáng)型51實驗板更多的學(xué)習(xí)內(nèi)容,我們將在以后幾期陸續(xù)為大家作介紹,祝大家學(xué)習(xí)順利。簡潔的RS232串口通信電路與串口通信測試程序RS232串口通信電路往往是采用專用的串口傳輸芯片MAX232(5V)或MAX3232(3.3V),芯片起到驅(qū)動、匹配、隔離、保護(hù)等作用,這種電路常用于實際系統(tǒng)中的遠(yuǎn)距離串口通信。多數(shù)愛好者搭建串口通信電路只是用于學(xué)單片機(jī),其實沒有必要用上述專用的驅(qū)動芯片,向大家推薦一種用兩只三極管組成的串口通信電路(如圖),經(jīng)本人測試,穩(wěn)定性絲毫不減,對于大家來學(xué)習(xí)單片機(jī)足矣。 我也是第一次做AT89S52的串口通信實驗,分享
36、這個測試程序:/*程序名稱:51串口通信測試、演示程序,晶振11.0592M程序功能:單片機(jī)依次發(fā)送0F這16個數(shù)至上位機(jī),通過串口調(diào)試軟件 進(jìn)行hex觀察*/#include #define uchar unsigned char#define uint unsigned intuchar dis=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;/*n(ms)延時子程序*/void delayms(uint ms) /延時ms uchar i;while(ms-) for(i=0;i120;i+);/*主程序*/void main()int i; TMOD=0x2
37、0; /定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率TH1=0xFD; /波特率9600TL1=0xFD;SCON=0x50; /設(shè)定串行口工作方式TR1=1; /啟動定時器1while(1) for(i=0;i16;i+) SBUF=disi; while(!TI); /等特數(shù)據(jù)傳送 TI=0; /清除數(shù)據(jù)傳送標(biāo)志 delayms(500); 程序功能是依次向上位機(jī)發(fā)送0F這16個數(shù),用串口調(diào)試助手觀察,需要勾選“HEX顯示”選項,如圖:51串口實驗:數(shù)碼管顯示電腦鍵盤按鍵ASCII值這不僅可以通過一個按鈕控制單片機(jī)向電腦發(fā)送字符串,而且還可以通過數(shù)碼管顯示電腦鍵盤上按鍵的ASCII值。 本實驗除需要單片機(jī)最小系統(tǒng)外,還需用到自制多功能數(shù)碼管顯示實驗板一文中的數(shù)碼管實驗板和簡潔的RS232串口通信電路與串口測試程序文中的串口通信電路,另需一只輕觸式按鈕。 系統(tǒng)連接:P1.0接輕觸式按鈕K1,P0口輸出數(shù)碼管段碼,P2口為數(shù)碼管位選信號,在此實驗中只用到了十位和個位顯示。 操作說明:打開串口調(diào)試助手之類的軟件(這次不要勾選“HEX顯示”),當(dāng)按下單片機(jī)系統(tǒng)的K1按鈕時,單片機(jī)向主機(jī)發(fā)送字符串歡迎光臨萬用電路板/,在串口調(diào)試軟件中看得到;當(dāng)按下電腦鍵盤上任一按鍵時,數(shù)碼管則顯示出該鍵的ASCII鍵值。程序如下:/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家庭心理治療師招聘合同
- 幼教志愿者招聘合同
- 科技研發(fā)中心施工合同糾紛模板
- 智能能源工程合同范本節(jié)能
- 曲棍球場地坪施工協(xié)議
- 倉儲物流土地招投標(biāo)居間合同
- 空調(diào)安裝班組施工合同
- 教育機(jī)構(gòu)教師聘用合同范本
- 新人教部編版四年級數(shù)學(xué)下冊練習(xí)課
- 食品安全事件處理程序
- 專職會計勞務(wù)合同模板
- 2024年秋新滬教牛津版英語三年級上冊課件 Unit 5 第2課時
- 中圖版七年級下冊信息技術(shù) 2.1規(guī)劃影片任務(wù) 教學(xué)設(shè)計
- 2024中科院心理咨詢師考試復(fù)習(xí)題庫(官方版)-上單選題匯
- 2024新人教版道法一年級上冊第四單元:我們講文明大單元整體教學(xué)設(shè)計
- GB/T 44421-2024矯形器配置服務(wù)規(guī)范
- DB50-T 771-2017 地下管線探測技術(shù)規(guī)范
- 2024年P(guān)MP項目管理師考試試卷及答案指導(dǎo)
- 憲法是根本法教案-2.憲法是根本法-六年級上冊道德與法治(新版)
- 商家入駐進(jìn)場協(xié)議書范本
- 2024年全國職業(yè)院校技能大賽中職組(嬰幼兒保育賽項)考試題庫-下(多選、判斷題)
評論
0/150
提交評論