国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

51單片機(jī)-串口

發(fā)布時(shí)間:2011-3-22 11:38    發(fā)布者:techshare
關(guān)鍵詞: 51單片機(jī) , 串口
單片機(jī)通信是指單片機(jī)與計(jì)算機(jī)或單片機(jī)與單片機(jī)之間的信息交換,通常單片機(jī)與計(jì)算機(jī)之間的通信我們用的較多。通信有并行和串行兩種方式。串行通信又有兩種方式:異步串行通信和同步串行通信。





異步通信是以字符(構(gòu)成的幀)為單位進(jìn)行傳輸,字符與字符之間的間隙(時(shí)間間隔)是任意的,但每個(gè)字符中的各位是以時(shí)間傳送的,即字符之間不一定有“位間隔”的整數(shù)倍關(guān)系,但同一字符內(nèi)的各位之間的距離均為“位間隔”的整數(shù)倍。

DB25與DB9:




80C51串行口的結(jié)構(gòu):



有兩個(gè)物理上獨(dú)立的接受,發(fā)送寄存器SBUF,它們占用同一地址99H;接收器是雙緩沖結(jié)構(gòu);發(fā)送
緩沖器,因?yàn)榘l(fā)送時(shí)CPU是主動(dòng)的,不會(huì)產(chǎn)生重疊錯(cuò)誤。





RS232C標(biāo)準(zhǔn)接口主要引腳定義:




串行口控制寄存器SCON是一個(gè)特殊功能的寄存器,用以設(shè)定串行口的工作方式,接受發(fā)送控制及設(shè)
置狀態(tài)標(biāo)志。



SM0,SM1工作方式選擇位,SM2多機(jī)通信控制位,REN允許串行接收位,TI發(fā)送中斷標(biāo)志位,RI接
收中斷標(biāo)志位。串行發(fā)送停止位的開始時(shí),由內(nèi)部硬件使TI置1,向CPU發(fā)出中斷申請(qǐng)。在中斷服務(wù)
程序中,必須用軟件將其清0,取消此中斷申請(qǐng)。
電源管理寄存器PCON也是一個(gè)特殊功能寄存器,字節(jié)地址為87H,不能位尋址,PCON用來管理單片
機(jī)的電源部分,包括上電復(fù)位檢測(cè),掉電模式,空閑模式等。單片機(jī)復(fù)位時(shí)PCON全部被清0。



SMOD該位與串口波特率有關(guān),SMOD=0,串口方式1,2,3時(shí),波特率正常。SMOD=1,串口方式1,2,3時(shí),波特率加倍。

用軟件置REN為1時(shí),接收器會(huì)以所選擇波特率的16倍速采樣RXD引腳電平,檢測(cè)到RXD引腳輸入電平發(fā)生
負(fù)跳變時(shí),則說明起始位有效,將其移入輸入移位寄存器,并開始接受這一幀信息的其余位。接受過
程中,數(shù)據(jù)從輸入移位寄存器的右邊輸入,起始位移至輸入移位寄存器最左邊時(shí),控制電路進(jìn)行最后
一次移位。當(dāng)RI = 0,且SMOD = 0(或接受到的停止位為1)時(shí),將接收到的9位數(shù)據(jù)的前8位數(shù)據(jù)
裝入接受SBUF,第9位進(jìn)入RB8,并置RI=1,向CPU中斷請(qǐng)求。

在具體操作串行口之前,需要對(duì)單片機(jī)一些與串行口有關(guān)的特殊功能寄存器進(jìn)行初始化設(shè)置:

確定T1的工作方式(編程TMOD寄存器)
計(jì)算T1的初值,裝載TH1,TL1
開啟T1(編程TCON中的TR1位)
設(shè)置串口的工作方式(編程SCON寄存器)
串行口工作在中斷方式下,要進(jìn)行中斷設(shè)置(IE寄存器)

波特率計(jì)算公式:
方式0的波特率=fosc/12。
方式1的波特率=(2^smod/32)*(T1溢出率)。
方式2的波特率=(2smod/64)*fosc。
方式3的波特率=(2smod/32)*(T1溢出率)。
T1溢出率=fosc/{12*[256-(TH1)]}

fosc為系統(tǒng)晶振頻率,通常為12MHZ或11.05926MHZ
異步串口通信兩種方式:輪詢和中斷
下面是一個(gè)中斷程序,使用串口調(diào)試工具發(fā)出什么返回什么。


#include <reg52.h>

unsigned char a,flag;

void main(){
        TMOD = 0x20;         //工作方式2,8位自動(dòng)重裝定時(shí)/計(jì)數(shù)器
        TH1 = 0xfd;          //波特率為9600bps,系統(tǒng)晶振頻率為11.0592MHZ時(shí)需要裝入的
        TL1 = 0xfd;          //TH1,TL1的值可以通過公式 T1溢出率=fosc/{12*[256-(TH1)]}
        EA = 1;              //開啟CPU中斷允許位
        ES = 1;              //開始串口中斷允許位
        SM1 = 1;             //設(shè)置串口的工作方式為01即方式1,10位異步收發(fā)(8位數(shù)據(jù))
        TR1 = 1;             //T1開啟
        REN = 1;             //允許串行接受位
        while(1){
                 if(flag == 1){                              
                        ES = 0;             //關(guān)閉串口中斷,防止發(fā)送數(shù)據(jù)時(shí)產(chǎn)生中斷
                        SBUF = a;    //將數(shù)據(jù)送到發(fā)送緩沖寄存器
                        while(!TI);         //發(fā)送當(dāng)停止位開始時(shí),會(huì)產(chǎn)生中斷,把TI置1
                        TI = 0;                 
                        flag = 0;
                        ES = 1;                 //允許中斷
                }
        }
}

void uart() interrupt 4{
        a = SBUF;             //當(dāng)產(chǎn)生RI中斷時(shí)說明數(shù)據(jù)接收完畢,把數(shù)據(jù)賦給變量a  
      RI = 0;                    //軟件方法把RI置0
        flag = 1;
}

輪詢方式,如果有數(shù)據(jù)輸入發(fā)送給串口,當(dāng)停止位開始時(shí),蜂鳴器響起。
#include <reg52.h>
#define uchar unsigned char   
sbit buzzer=P3^4;
                     
void delay(uchar z)
{
        uchar x,y;
        for(x=1000;x>1;x--)
                for(y=z;y>1;y--);
}

void main(){
        TMOD = 0x20;         //工作方式2,8位自動(dòng)重裝定時(shí)/計(jì)數(shù)器
        TH1 = 0xfd;          //波特率為9600bps,系統(tǒng)晶振頻率為11.0592MHZ時(shí)需要裝入的
        TL1 = 0xfd;          //TH1,TL1的值可以通過公式 T1溢出率=fosc/{12*[256-(TH1)]}
        EA = 1;              //開啟CPU中斷允許位
        ES = 1;              //開始串口中斷允許位
        SM1 = 1;             //設(shè)置串口的工作方式為01即方式1,10位異步收發(fā)(8位數(shù)據(jù))
        TR1 = 1;             //T1開啟
        REN = 1;             //允許串行接受位
        while(1){
                 if(RI == 1){    //大循環(huán)進(jìn)行輪詢,如果串行發(fā)送停止位開始,則RI會(huì)被硬件置1
                        RI = 0;
                        buzzer=0;
                        delay(10);
                        buzzer=1;
                        delay(10);
                }
        }
}




兩個(gè)糾結(jié)的程序:



由上位機(jī)發(fā)送1給單片機(jī)時(shí),蜂鳴器以400ms頻率發(fā)聲,發(fā)2時(shí)以200ms頻率發(fā)聲,發(fā)3時(shí)以100ms頻率發(fā)聲,發(fā)4時(shí)關(guān)閑蜂鳴器。


#include<reg52.h>
unsigned char flag,a,num,benum;
sbit beep=P3^4;
void main()
{

        TMOD=0x21;//設(shè)置定時(shí)器1為工作方式2
        TH1=0xfd;
        TL1=0xfd;
        TH0=(65536-50000)/255;
        TL0=(65536-50000)%255;
        TR1=1;
        ET0=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        while(1)
        {
                if(flag==1)
                {
                        EA=0;
                        flag=0;
                        TR0=1;
                        if(a==1)
                                benum=4;
                        if(a==2)
                                benum=2;
                        if(a==3)
                                benum=1;
                        if(a==4)
                        {
                                TR0=0;
                                beep=1;        
                        }
                        EA=1;
                }
        }
}

void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag=1;
}

void time0() interrupt 1
{
        TH0=(65536-50000)/255;
        TL0=(65536-50000)%255;
        num++;
        if(num>=benum)
        {
                num=0;
                beep="beep;
        }        
}


以2400bps從計(jì)算機(jī)發(fā)送任一字節(jié)數(shù)據(jù),當(dāng)單片機(jī)收到該數(shù)據(jù)后,在此數(shù)據(jù)前加上一序號(hào)然后連同此數(shù)據(jù)一起發(fā)送至計(jì)算機(jī),當(dāng)序號(hào)超過255時(shí)歸零。

#include<reg52.h>
unsigned char flag,a,num,num1;
sbit beep=P3^4;
void main()
{

        TMOD=0x20;//設(shè)置定時(shí)器1為工作方式2
        TH1=0xf4;
        TL1=0xf4;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        while(1)
        {
                if(flag==1)
                {
                        ES=0;
                        flag=0;
                        num1++;
                        if(num1==255)
                                num1=0;
                        SBUF=num1;
                        while(!TI);
                        TI=0;
                        SBUF=a;
                        while(!TI);
                        TI=0;
                        ES=1;
                }
        }
}

void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag=1;
}


李萬(wàn)鵬
本文地址:http://m.qingdxww.cn/thread-59320-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
williamkmcn 發(fā)表于 2011-7-7 17:03:20
好東西值得收藏
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級(jí)模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区在线观看 | 色香蕉影院 | 伊人久久久综在合线久久在播 | 自拍视频在线看 | 欧美一级做一a做片性视频 欧美一级做性受 | 91麻豆精品国产高清在线 | h成年同人动漫在线观看网站 | 久久99久久99精品免观看 | 亚洲精品嫩草研究院久久 | 亚洲精品网址 | 污网站导航| 国产满18av精品免费观看视频 | 91最新在线播放 | 99国产精品免费观看视频 | 91美女精品app| 欧美精品在线一区二区三区 | 黄色影视在线免费观看 | 日本免费人成在线网站 | 国产手机在线 | 国内精品久久久久激情影院 | 欧美亚洲日本 | 四虎国产精品免费视 | 一区二区在线观看视频在线 | 国产高清精品一级毛片 | 国产特级毛片aaaaaaa高清 | 日本久久久久久久中文字幕 | 国产综合激情在线亚洲第一页 | 色综久久天天综合绕视看 | 玖玖色在线 | 91www| 碰操 | 青青国产成人久久91网站站 | 亚洲免费影视 | 免费高清不卡毛片在线看 | 99久久国产综合精麻豆 | 女人洗澡一级特黄毛片 | 99久久精品免费观看国产 | 重口调教女虐女长篇小说 | 国产淫语对白在线视频 | 啦啦啦资源视频在线观看4 啦啦啦中文在线影院观看 啦啦啦在线观看视频免费观看4 | 日本道在线 |