通信方式 并行適合短距離通信,并行通信控制簡單、相對(duì)傳輸速度快(8位一起傳輸)。 串行只能一位一位的傳送。 同步(了解)建立發(fā)送方時(shí)鐘對(duì)接收方時(shí)鐘的直接控制,使雙方達(dá)到完全同步。此時(shí),傳輸數(shù)據(jù)的位之間的距離均為“位間隔”的整數(shù)倍,同時(shí)傳送的字符間不留間隙。 發(fā)送方對(duì)接收方的同步可以通過外同步和自同步 異步(常)以字符(構(gòu)成的幀)為單位進(jìn)行傳輸。數(shù)據(jù)位從低到高傳送。 格式: 這里的空閑時(shí)間是任意的。 串行通信的制式(傳輸方向) 單工(僅能沿一個(gè)方向) 半雙工(可進(jìn)行雙向,但需分時(shí)) 全雙工 串行通信的錯(cuò)誤校驗(yàn) 奇偶校驗(yàn)在發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)位尾隨的1位為奇偶校驗(yàn)位(1/0)。奇校驗(yàn)時(shí),數(shù)據(jù)中1的個(gè)數(shù)與檢驗(yàn)位1的個(gè)數(shù)之和應(yīng)為奇數(shù);偶校驗(yàn)時(shí),數(shù)據(jù)中1的個(gè)數(shù)與校驗(yàn)位1的個(gè)數(shù)之和應(yīng)為偶數(shù)。接收字符時(shí),對(duì)1的個(gè)數(shù)進(jìn)行校驗(yàn),若字符不一致,則說明傳輸數(shù)據(jù)過程中出現(xiàn)錯(cuò)誤。 代碼和校驗(yàn)發(fā)送方將所發(fā)數(shù)據(jù)塊求和(或各字節(jié)異或),產(chǎn)生一個(gè)字節(jié)的校驗(yàn)字符(校驗(yàn)和)附加到數(shù)據(jù)塊末尾。接收方接收數(shù)據(jù)時(shí),同時(shí)對(duì)數(shù)據(jù)塊(除校驗(yàn)字節(jié)外)求和(或各字節(jié)異或),將所得的結(jié)果與發(fā)送方的“校驗(yàn)和”進(jìn)行比較,一致則無差。 循環(huán)冗余校驗(yàn)通過某種數(shù)學(xué)預(yù)算實(shí)現(xiàn)有效信息與校驗(yàn)位之間的循環(huán)校驗(yàn),常用語對(duì)磁盤信息的傳輸、存儲(chǔ)區(qū)的完整性校驗(yàn)。 串口的基本結(jié)構(gòu) SBUF:51單片機(jī)中的特殊寄存器,串行數(shù)據(jù)緩沖器(一個(gè)接收一個(gè)發(fā)送),兩個(gè)其實(shí)是共用的一個(gè)地址99H,但是兩個(gè)在物理上面是分開的。 當(dāng)發(fā)送使用時(shí),就采用SBUF=XXX; (XXX為需要傳送的數(shù)據(jù)) 當(dāng)接收使用時(shí),采用XXX=SBUF; 記得因?yàn)槭谴械乃詡鬏敹际且晃灰晃贿M(jìn)行的。 T1溢出率:T1計(jì)時(shí)器的溢出頻率(就是計(jì)時(shí)器每次低位計(jì)滿向高位進(jìn)位時(shí)間的倒數(shù)) 用處:用于計(jì)算波特率(每秒傳輸二進(jìn)制代碼的位數(shù)) 實(shí)現(xiàn)單片機(jī)與電腦之間的互相傳送字符串通信代碼:
- #include <reg52.h>
- #include <stdio.h> //printf頭文件
- #define uc unsigned char
- #define uint unsigned int
-
- uc flag,i,flag_t,s[50]="",j=0,flag_n=0;
- uc code table[]="I get ";
-
- void init()
- {
- TMOD=0x20; //定時(shí)器工作方式,選擇了定時(shí)器1,工作方式2 八位初值自動(dòng)重裝的8位定時(shí)器。
- TH1=0xfd; //定時(shí)器1初值 ,設(shè)置波特率為9600 晶振11.0529MHZ?
- TL1=0xfd;
- TR1=1; //開啟定時(shí)器1
-
- SM0=0;
- SM1=1; //10位異步接收,(8位數(shù)據(jù))波特率可變
- REN=1; //允許串行口接收位
- EA=1; //允許中斷(總閘)
- ES=1; //允許串口中斷
- }
- void main()
- {
- init();
- while(1)
- {
- if(flag==1)
- { if(flag_n!=0) //使第二個(gè)及以后I get xx 換行,不與You transfer在一行(單純?yōu)榱烁袷胶每矗?nbsp;
- {TI=1;
- printf("\n");
- while(!TI);
- TI=0;
- }
- for(i=0;i<6;i++)
- {
- SBUF=table[i];
- while(!TI);
- TI=0;
- }
- for(i=0;s[i]!='#'&&i<50;i++)
- {
- SBUF=s[i];
- while(!TI);
- TI=0;
- }
- flag=0;
- }
- if(flag_t==1) //發(fā)送完畢之后,在電腦端輸出。
- {
- TI=1; //printf之前必須將T1置為1才行。
- printf ("\nYou transfer %s",s);
- while(!TI);
- TI=0;
- flag_t=0;
- }
- }
- }
-
- void ser() interrupt 4
- {
- if(RI) //接收數(shù)據(jù),手動(dòng)將RI清0
- {
- RI=0;
-
- if(flag==0&&j!=0)//1.循環(huán)賦值為'\0'(字符串結(jié)尾標(biāo)志符),j=0,為了第二次傳遞字符串是又是從頭輸出
- { //2.flag為0和j不為0時(shí),保證是第二次及以后,傳輸字符串(控制輸出格式)
- flag_n++;
- for(j=0;s[j]!='#'&&j<50;j++)
- s[j]='\0';
- j=0;
- }
- s[j]=SBUF;
- flag=1;
- if(s[j]=='#'||j==49) //以'#'作為傳送字符串的結(jié)尾符,我定義的字符數(shù)組最長為50所以49也應(yīng)該結(jié)束。
- flag_t=1;
- else
- j++;
- }
-
- if(TI) //發(fā)送數(shù)據(jù)
- {
- }
- }
復(fù)制代碼
運(yùn)行截圖: 代碼解讀:基本上就是幾個(gè)模塊:計(jì)時(shí)器、中斷以及串口通信中斷寄存器介紹IE(interrupt enable):(可位尋址)設(shè)定各個(gè)中斷源的打開和關(guān)閉 IP(interrupt prior)中斷優(yōu)先級(jí)寄存器:(可位尋址)用來設(shè)定各個(gè)中斷源屬于兩級(jí)中斷中的哪一級(jí) 中斷源: 中斷響應(yīng)條件:1.中斷源有中斷請(qǐng)求 2.此中斷源的中斷允許位為1 3.CPU開中斷(EA=1) 代碼書寫:1.先開總中斷EA 2 .然后再開特定的中斷去控制 3.如果有特殊需要優(yōu)先級(jí)問題再設(shè)置IP 4.中斷函數(shù)書寫 格式 void 函數(shù)名() interrupt 中斷號(hào)(上面圖示的序號(hào)) //中斷函數(shù)返回值一定是void //函數(shù)名隨便寫 //中斷號(hào)用來判斷是哪個(gè)中斷源 計(jì)時(shí)器寄存器介紹TCON 支持位尋址 :控制寄存器,控制T1、T0的啟動(dòng)和停止及設(shè)置溢出標(biāo)志 TMOD,不支持位尋址:定時(shí)/計(jì)數(shù)器的工作方式寄存器,確定工作方式和功能 計(jì)時(shí)器代碼書寫步驟:1.EA=1;2.ETX=1; //開啟計(jì)時(shí)器X中斷 3.配置工作方式 TMOD=0x..; //根據(jù)自己需求按照上表來配 3.配置計(jì)時(shí)器初值//THX=(65535-N)/256; //TLX=(65535-N)%256; //N由你要計(jì)時(shí)的時(shí)長決定。計(jì)時(shí)器計(jì)一個(gè)數(shù)花費(fèi)一個(gè)時(shí)鐘周期來計(jì)算。 4.TRX=1; //開啟計(jì)時(shí)器X 串口通信寄存器介紹PCON電源管理寄存器 :(不可位尋址) 用來管理單片機(jī)的電源部分,包括上電復(fù)位檢測、掉電模式 、空閑模式等 SCON:(可位尋址)用以設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志 波特率計(jì)算 SMOD就是PCON中的第一位,默認(rèn)為0 fosc為晶振頻率,所以自己設(shè)定不同波特率時(shí),也要考慮晶振不同的問題。 代碼書寫1.上面都書寫完畢之后 2.還需要ES=1 3.傳輸數(shù)據(jù)時(shí),SBUF=XX 接收數(shù)據(jù)時(shí),XX=SBUF 4.中斷函數(shù)書寫 一定要將RI清0,但是TI的清0在主函數(shù)中進(jìn)行 //因?yàn)門I在中斷中進(jìn)行,(1)沒有if(TI)的判斷,那么就會(huì)和RI的處理混淆(2)如果有TI判斷 //那么有可能永遠(yuǎn)進(jìn)行不了傳輸數(shù)據(jù),因?yàn)樽铋_始TI是為0的,無法進(jìn)入TI條件,就無傳 //輸數(shù)據(jù)(SBUF=XX)。而且在傳輸數(shù)據(jù)的時(shí)候會(huì)又一次進(jìn)入中斷,就是還沒處理中 //斷就又進(jìn)入了另外一個(gè)中斷,導(dǎo)致通信出現(xiàn)異常。
完整的Word格式文檔51黑下載地址:
單片機(jī)串口詳解.doc
(958 KB, 下載次數(shù): 506)
2018-2-25 11:46 上傳
點(diǎn)擊文件名下載附件
|