對於STC單片機中表示串口控制寄存器SCON中的一位
SM1和SM0共同設置,可以配置串口的4中工作方式中的哪一種
比如SM0=0SM1=1則配置成8位UART波特率可變
具體的可以看下STC的官方手冊關於講解串口的那一段
Ⅱ 單片機如何實現220v交流電壓下的永磁同步電機60SM60的控制
永磁同步電機是的步進頻率和驅動電源的頻率同步,所以要做速度控制就需要做變頻控制。做變頻的話,如果要求不高負載不重的話,用51還勉強可以,產生6路PWM信號去控制6個IGBT切換導通就可以了。如果不考慮變頻調速就更簡單,直接用一個電容移相後接在電機上,電機效率會低一些但可以運轉可帶輕負載。這種控制用一個可控硅和觸發光藕就可以了。至於時鍾,就看你的要求了,要求較高且可以用如H1380,PCF8563等時鍾晶元,要求不高就用單片機自己的時鍾,然後用程序實現。
Ⅲ 51單片機串口發送「」是怎麼回事
一、51單片機串口概念
1、51單片機的串列口
51單片機的串列口是一個可編程全雙工的通信介面,具有UART(通用非同步收發器)的全部功能。
2、51單片機的硬體連接
簡單雙向串口通信有兩根數據通信線:
發送端TXD(Transmit Data)
接收端RXD(Receive Data)
TXD和RXD要交叉連接
3、51單片機串口通信的基本結構
51單片機的串列口主要是由兩個獨立的串列數據緩存器SUBF(一個發送緩存寄存器,一個接收緩存寄存器)和發送控制器、接收控制器、輸入移位寄存器及若干控制門電路組成。串列口的基本結構如圖所示:
關於SUBF:串口數據緩存寄存器,物理上是兩個獨立的寄存器,但是佔用相同的地址。寫操作時,寫入的是發送寄存器;讀操作時,讀出的是接收寄存器。
①:接收端:數據通過RXD接收引腳,再通過移位寄存器將數據轉存到接收寄存器中
②:發送端:講數據從發送寄存器中移出,通過TXD發送引腳將數據發送出去
③:波特率:通過設置定時器1的初值,獲取T1溢出率,通過SMOD模式的設置求取波特率
④:中斷:通過發送中斷標志位或接收中斷標志位是否被置位,判斷是否進入串口中斷程序,在接收數據完成後,會將RI置位,產生一個接收中斷;在發送完成後,會將TI置位,產生發送中斷
4、傳播速率——比特率
比特率是指每秒傳送的比特(bit)數。單位為bps(bit per second)也可表示為b/s,比特率越高,單位時間傳送的數據量(位數)越大。
5、波特率
在串口通信中,收發雙方對發送或接收數據的速率有約定,即雙方要有相同的波特率,我們可以通過編程對單片機串列口設定4中工作方式:
其中,T1的溢出率 = 1/T1溢出的時間
①:關於定時器1方式的選擇
在說選取定時器1方式之前插一句:這里的定時器1方式2不是串口那4中方式中的方式2;
在學習定時器的相關知識的時候,我們知道定時器有4種不同的工作方式,在串口通信的實驗中,我們選擇的是定時器1的工作方式2;
定時器T1工作於方式0:溢出所需周期數=8192-x
定時器T1工作於方式1:溢出所需周期數=65536-x
定時器T1工作於方式2:溢出所需周期數=256-x
為什麼不選擇定時器1的工作方式1:
如果我們使用定時器1的工作方式1在中斷中裝初值的方法來T1溢出率的話,在進入中斷、重裝值、出中斷這個過程中很容易產生時間上的微小的誤差,當多次操作時微小的誤差不斷累積,終會產生錯誤;
為什麼選擇定時器1的工作方式2:
因為方式2為自動重裝初值的8位定時器/計數器模式(自動重裝載就是在定時器溢出後自動裝入設定的初值,這樣的好處當然是顯而易見的,不需要在中斷伺服器裏手動賦值了,所以可以精確的定時)所以用它來做波特率發生器最恰當。
②:波特率的計算
在上面介紹串口四種方式的時候提到了波特率的計算公式,由公式可以看出,串口方式0和方式2的波特率是固定的;方式1和方式3的波特率是可變的(根據定時器T1的溢出率來控制)
話不多說,根據題來理解:
根據已知波特率,如何計算定時器1方式2下計數寄存器中的初值:
已經波特率 = 9600,系統的晶振頻率 = 12Mhz,求給TH1和TL1的初值:
由此可見,當系統的晶振頻率為12Mhz時,定時器的初值不是整數;經過計算可得,當晶振頻率為11.0592Mhz時,(256-x) = 3;
當時鍾頻率選用11.0592MHZ時,取易獲得標準的波特率,所以很多單片機系統選用這個看起來「怪」的晶振就是這個道理。
6、波特率與比特率關系與區別
碼元:在數字通信中常常用時間間隔相同的符號來表示一個 二進制數字 ,這樣的時間間隔內的信號稱為 (二進制)碼元。
在信息傳輸通道中,攜帶數據信息的信號單元叫碼元,每秒鍾通過信道傳輸的碼元數稱為碼元傳輸速率,簡稱波特率。即波特率是指數據信號對載波的調制速率,它用單位時間內載波調制狀態改變次數來表示。每秒鍾通過信道傳輸的信息量稱為位傳輸速率,簡稱比特率。比特率表示有效數據的傳輸速率。波特率與比特率的關系是比特率=波特率X單個調制狀態對應的二進制位數。波特率是傳輸通道頻寬的指標。
二、串口通信有關寄存器
1、數據緩存寄存器
SBUF是可以直接定址的專用寄存器。物理上,它對應著兩個寄存器,即一個發送寄存器一個接收寄存器,CPU寫SBUF就是修改發送寄存器;讀SBUF就是讀接收寄存器。接收器是雙緩沖的,以避免在接收下一幀數據之前,CPU未能及時的響應接收器的中斷,沒有把上一幀的數據讀走而產生兩幀數據重疊的問題。對於發送器,為了保持最大的傳輸速率,一般不需要雙緩沖,因為發送時CPU是主動的,不會產生重疊問題。
2、電源寄存器PCON
該寄存器是用來管理單片機的電源部分,包括上電復位檢測,掉電模式,空閑模式等
在串口通信中,我們僅僅需要關注SMOD這一位
SMOD = 0且串口方式為1、2、3時,波特率正常
SMOD = 1且串口方式為1、2、3時,波特率加倍
3、狀態寄存器SCON(98H)
SM0 SM1:工作方式選擇位,串列口有四種工作方式,他們由SM0和SM1設定,其對應關系表如下:
SM2:多機通信時的接收允許標志位
REN:允許串列接收位
TB8,RB8:發送接收數據的第9位,當串口工作於方式2或3 時使用到,指向的是串列傳輸的第9位數據;
1)SM2=0,在方式2或3下,TB8、RB8 發送與接收第9位奇偶校驗位;
2)SM2=1,多機通信時的接收允許位,並且在方式2或3下工作;
TI:發送中斷標志位,在方式0時,當串列發送第8位數據結束時,或在其他方式,串列發送停止位的開始時,由其內部硬體使TI置1,向CPU發出中斷申請。在中斷服務程序中,必須用軟體將其清 0,取消此中斷申請。
RI:接收中斷標志位,在方式0時,當串列接收第8位數據結束時,或在其他方式,串列接收停止位的中間時,由內部硬體使RI置1,向CPU發出中斷申請。也必須在中斷服務程序中,用軟體將其清0,取消此中斷申請。
三、串口通信代碼
串列口在工作之前,應對其進行初始化,主要是設置產生波特率的定時器1,串列口控制和中斷控制。
void usart_init()
{
TMOD = 0x20; //選擇定時器1的工作方式2
TH1 = 0xF3; //通過設置定時器1的初值來選擇波特率
TL1 = 0xf3;
TR1 = 1; //打開計數器
SCON = 0x50; //0101 0000
PCON = 0x80;
ES = 1; //打開通信中斷 ①
EA = 1; //打開總中斷 ②
}
或者
void usart_init()
{
TMOD = 0x20;
TH1 = 253;
TL1 = 253;
TR1 = 1;
SM0 = 0;
SM1 = 1;
// REN = 1
// EA = 1;
// ES = 1;
}
在編寫串口發送端程序時,無需用到接收數據和中斷服務函數,所以REN、EA、ES不需要對他們進行操作
Ⅳ 51單片機波特率計算公式和定時器初值
51單片機晶元的串口可以工作在幾個不同的工作模式下,其工作模式的設置就是使用SCON 寄存器。它的各個位的具體定義如下:
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1 為串列口工作模式設置位,這樣兩位可以對應進行四種模式的設置。串列口工作模式設置。
波特率在使用串口做通訊時,一個很重要的參數就是波特率,只有上下位機的波特率一樣時才可以進行正常通訊。波特率是指串列埠每秒內可以傳輸的波特位數。這里所指的波特率,如標准9600 不是每秒種可以傳送9600個位元組,而是指每秒可以傳送9600 個二進位,而一個位元組要8 個二進位,如用串口模式1 來傳輸那麼加上起始位和停止位,每個數據位元組就要佔用10 個二進位,9600 波特率用模式1 傳輸時,每秒傳輸的位元組數是9600÷10=960 位元組。
51晶元的串口工作模式0的波特率是固定的,為fosc/12,以一個12M 的晶振來計算,那麼它的波特率可以達到1M。模式2的波特率是固定在fosc/64 或fosc/32,具體用那一種就取決於PCON 寄存器中的SMOD位,如SMOD 為0,波特率為focs/64,SMOD 為1,波特率為focs/32。
模式1和模式3的波特率是可變的,取決於定時器1或2(52晶元)的溢出速率,就是說定時器1每溢出一次,串口發送一次數據。那麼我們怎麼去計算這兩個模式的波特率設置時相關的寄存器的值呢?可以用以下的公式去計算。
上式中如設置了PCON寄存器中的SMOD位為1時就可以把波特率提升2倍。通常會使用定時器1工作在定時器工作模式2下,這時定時值中的TL1做為計數,TH1做為自動重裝值,這個定時模式下,定時器溢出後,TH1的值會自動裝載到TL1,再次開始計數,這樣可以不用軟體去干預,使得定時更准確。在這個定時模式2下定時器1溢出速率的計算公式如下:
溢出速率=(計數速率)/(256-TH1初值)
溢出速率=fosc/[12*(256-TH1初值)]
上式中的「計數速率」與所使用的晶體振盪器頻率有關,在51 晶元中定時器啟動後會在每一個機器周期使定時寄存器TH 的值增加一,一個機器周期等於十二個振盪周期,所以可以得知51晶元的計數速率為晶體振盪器頻率的1/12,一個12M 的晶振用在51晶元上,那麼51的計數速率就為1M。通常用11.0592M 晶體是為了得到標準的無誤差的波特率,那麼為何呢?計算一下就知道了。如我們要得到9600 的波特率,晶振為11.0592M 和12M,定時器1 為模式2,SMOD 設為1,分別看看那所要求的TH1 為何值。代入公式:
11.0592M
9600=(2÷32)×((11.0592M/12)/(256-TH1))
TH1=250
12M
9600=(2÷32)×((12M/12)/(256-TH1))
TH1≈249.49
上面的計算可以看出使用12M晶體的時候計算出來的TH1不為整數,而TH1的值只能取整數,這樣它就會有一定的誤差存在不能產生精確的9600 波特率。當然一定的誤差是可以在使用中被接受的,就算使用11.0592M 的晶體振盪器也會因晶體本身所存在的誤差使波特率產生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計。
Ⅳ 單片機數碼管小數點閃爍
假設4個數碼管,每個亮2ms,一輪掃描共亮8ms,我們可以讓其以120次為周期(0.96s),掃描前60次小數點亮,後60次小數點不亮,這樣小數點就 以大約1HZ的速度閃爍。
例如,小數點在第二位,數碼管七段碼table[]中不含小數點
顯示部分如下
if(a<60)
{dataport=(table[a1]);
sm1=0; Delay1ms(2);sm1=1;
dataport=(table[a2])|0x80;//第二位多個小數點
sm2=0; Delay1ms(2);sm2=1;
dataport=(table[a3]);
sm3=0; Delay1ms(2);sm3=1;
dataport=(table[a4]);
sm4=0; Delay1ms(2);sm4=1;
ia++;
}
else {dataport=(table[a1]);
sm1=0; Delay1ms(2);sm1=1;
dataport=(table[a2]); //第二位無小數點
sm2=0; Delay1ms(2);sm2=1;
dataport=(table[a3]);
sm3=0; Delay1ms(2);sm3=1;
dataport=(table[a4]);
sm4=0; Delay1ms(2);sm4=1;
ia++;
}
if(a==120) a=0;//120次後重新歸零
Ⅵ 51單片機的串列口有幾種工作方式它們的幀格式是如何規定的
串列口分四種工作方式,由SM0、SM1二位決定,其定義如下:
SM0、SM1 工作方式 功能描述 波特率
0 0 方式0 8位移位寄存器 Fosc/12
0 1 方式1 10位UART 可變
1 0 方式2 11位UART Fosc/64或fosc/32
1 1 方式3 11位UART 可變
(1)方式0:串列口的工作方式0為移位寄存器I/O方式,可外接移位寄存器,一擴展I/O口,也可外接同步I/O設備。
發送操作:當執行一條「MOV SBUF,A」指令時,啟動發送操作,由TXD輸出移位脈沖,由RXD串列SBUF中的數據。發送完8位數據後自動置TI=1.請求中斷。要繼續發送時,TI必須有指令清零。
接收操作:REN是串列口接收允許控制位。REN=0時禁止接收;REN=1時允許接收。當軟體將REN置「1」時,即開始從RXD埠以fosc/12波特率輸入數據,當接收到8位數據時,將中斷標志RI置「1」。再次接收數據之前,必須用軟體將RI清0。
(2)方式1:串列口位10位通用非同步介面。發送或接收一幀數據信息為10位,包括1位起始位「0」、8位數據位、1位停止位「1」。
發送數據:數據從TXD埠輸出,當數據寫入發送緩沖器SBUF時,就啟動發送器發送。發送完一幀數據後,置中斷標志TI=1,申請中斷,通知CPU可以發送下一個數據了。
接收數據:首先使REN=1(允許接收數據),串列口從RXD接收數據,當采樣到1至0跳變時,確認是起始位「0」,就開始接收一幀數據,當接收完一幀數據時,置中斷標志RI=1,申請中斷,通知CPU從SBUF取走接收到的數據
(3)方式2:串列口為11位非同步通信介面。發送或接收一幀信息包括1位起始位「0」、8位數據位、1位可編程位、1位停止位「1」。
發送數據:發送前,先根據通信協議由軟體設置TB8為「奇偶校驗位」或「數據標識位」,然後將要發送的數據寫入SBUF,即能啟動發送器。發送過程是由執行任何一條以SBUF為目的寄存器的指令而啟動的,把8位數據裝入SBUF,同時還把TB8裝到發送移位寄存器的第9位上,然後從TXD(P3.1)埠輸出一幀數據。
接收數據:先置REN=1,使串列口為允許接收狀態,同時還要將RI清「0」。然後再根據SM2的狀態和所接收到的RB8的狀態決定此串列口在信息到來後是否置R1=1,並申請中斷,通知CPU接收數據。當SM2=0時,不管RB8為「0」還是為「1」,都置RI=1,此串列口將接收發送來的信息。當SM2=1時,且RB8=1,表示在多機通信情況下,接收的信息為「地址幀」, 此時置RI=1, 串列口將接收發來的地址。當SM2=1時,且RB8=0,表示在多機通信情況下,接收的信息為「數據幀」, 但不是發給本從機的,此時RI不置為「1」,因而SBUF中接收的數據幀將丟失。
(4)方式3:為波特率可變的11位非同步通信方式,除了波特率有所區別之外,其餘方式都與方式2相同。