51單片機必會驅動
數碼管驅動
動態掃描顯示
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA = P2^2;//三八譯碼器輸入端,位選
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰極數碼管段碼
void delay(u16 i)
{
while(i--);
}
void digDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch (i)
{
case 0:
LSA = 0;LSB = 0;LSC = 0;break;
case 1:
LSA = 1;LSB = 0;LSC = 0;break;
case 2:
LSA = 0;LSB = 1;LSC = 0;break;
case 3:
LSA = 1;LSB = 1;LSC = 0;break;
case 4:
LSA = 0;LSB = 0;LSC = 1;break;
case 5:
LSA = 1;LSB = 0;LSC = 1;break;
case 6:
LSA = 0;LSB = 1;LSC = 1;break;
case 7:
LSA = 1;LSB = 1;LSC = 1;break;
}
P0 = smgduan[7-i];
delay(100);
P0 = 0x00;//消隱
}
}
void main()
{
while(1)
{
digDisplay();
}
}
靜態顯示
這裏寫代碼片
串口驅動
相關原理
- 串行通信分類
異步通信:異步通信是以字符(構成的幀)爲單位進行傳輸,字符之間時間間隔任意
同步通信:同步通信時要建立發送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。傳輸數據的位之間的距離均爲“位間隔”的整數倍 ,同時傳送的字符間不留間隙,即保持位同步關係,也保持字符同步關係。可通過外同步和自同步實現。 - 傳輸方向:單工、半雙工(分時雙向通信)、全雙工。
- 傳輸速率:比特率。即每秒鐘傳輸二進制代碼的位數
- 串行通信接口標準:
a) RS-232C接口
有25針和9針接口
特點: (1)傳輸距離短,傳輸速率低 (2) 有電平偏移 (3)抗干擾能力差
b) RS-422A接口(全雙工)
RS-422A輸出驅動器爲雙端平衡驅動器,差分電路避免或大大減弱地線干擾和電磁干擾的影響,RS-422A傳輸速率(90Kbps)時,傳輸距離可達1200米。
c) RS-485接口(半雙工)
RS-485是RS-422A的變型,需要兩根傳輸線,抗干擾性極好,傳輸距離可達1200米,傳輸速率可達1Mbps。 - 串口控制寄存器SCON
SCON 是一個特殊功能寄存器,用以設定串行口的工作方式、接收/發送控制以及設置狀態標誌:
SM0、SM1:工作方式選擇位,有四種方式可選
SM2:多機通信控制位,主要用於方式2和方式3。
if(SM2==1)
{
if(RB8==0)
不激活RI,丟棄收到的信息;
else
收到的數據進入SBUF,激活RI;
}else
{
無視RB8,數據進入SBUF,激活RI;
}
在方式0時,SM2必須是0。在方式1時,如果SM2=1,則只有接收到有效停止位時,RI才置1。
REN:允許串行接受位
TB8:在方式2或方式3中,是發送數據的第九位
RB8:在方式2或方式3中,是接收數據的第九位
TI:發送中斷標誌位
RI:接收中斷標誌位
6. 功率控制寄存器PCON
SMOD:波特率倍增位,爲1時波特率提高一位
7. 80C51串行口工作方式
a) 方式0
這種工作方式比較特殊,與常見的微型計算機的串行口不同,它又叫同步移位寄存器輸出方式。在這種方式下,數據從 RXD 端串行輸出或輸入,同步信號從 TXD 端輸出,波特率固定不變,爲振盪率的 1/12 。該方式是以 8 位數據爲一幀,沒有起始位和停止位,先發送或接收最低位。
b) 方式1
方式1是10位數據的異步通信口。TXD爲數據發送引腳,RXD爲數據接收引腳。其中1位起始位,8位數據位,1位停止位。
用軟件置REN爲1時,接收器以所選擇波特率的16倍速率採樣RXD引腳電平,檢測到RXD引腳輸入電平發生負跳變時,則說明起始位有效,將其移入輸入移位寄存器,並開始接收這一幀信息的其餘位。接收過程中,數據從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時,控制電路進行最後一次移位。
當RI=0,且SM2=0(或接收到的停止位爲1)時,將接收到的9位數據的前8位數據裝入接收SBUF,第9位(停止位)進入RB8,並置RI=1,向CPU請求中斷。
c) 方式2和方式3
方式2和方式3時起始位1位,數據9位(含1位附加的第9位,發送時爲SCON中的TB8,接收時爲RB8),停止位1位,一幀數據爲11位。方式2的波特率固定爲晶振頻率的1/64或1/32,可由 PCON 的最高位選擇。方式3的波特率由定時器T1的溢出率決定。
採用這種方式可接收或發送 11 位數據,以 11 位爲一幀,比方式 1 增加了一個數據位,其餘相同。第 9 個數據即 D8 位具有特別的用途,可以通過軟件控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51 單片機串行口適用於多機通信。方式 2 的波特率固定,只有兩種選擇,爲振盪率的 1/64 或 1/32 ,
SM0 SM1 方式 功 能 說 明
0 0 0 同步移位寄存器方式(用於擴展I/O口)
0 1 1 8位異步收發,波特率可變(由定時器控制)
1 0 2 9位異步收發,波特率爲fosc/64或fosc/32
1 1 3 9位異步收發,波特率可變(由定時器控制)
8. 波特率的計算
方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時器T1的溢出率來決定。四種工作方式共有三種波特率。
方式0的波特率 = fosc/12
方式2的波特率 =(2^(SMOD)/64)· fosc
方式1的波特率 =(2^(SMOD)/32)·(T1溢出率)
方式3的波特率 =(2^(SMOD)/32)·(T1溢出率)
T1 溢出率 = fosc /{12×[256-TH1)]}
9. 串口使用方法
配置產生波特率的定時器1、串行口控制和中斷控制的參數
a) 確定T1的工作方式(編程TMOD寄存器);
b) 計算T1的初值,裝載TH1、TL1;
c) 啓動T1(編程TCON中的TR1位);
d) 確定串行口控制(編程SCON寄存器);
串行口在中斷方式工作時,要進行中斷設置(編程IE、
IP寄存器)。
代碼
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
void UsartInit()/*完成串口初始化工作*/
{
TMOD = 0x20;//T1的M1M0:10 選擇方式2 8位自動重裝定時器 C/~T 位爲0 是定時器
TH1 = 0xF3;//因爲是8位 所以TH和TL一樣 波特率4800 SMOD:1 計算之後的初值
TL1 = 0xF3;
PCON = 0x80;//最高位爲1 波特率翻倍
TR1 = 1;//運行定時器T1
SCON = 0x50;//串口控制寄存器 SM0SM1:01 採用方式1(10位異步收發器 8位數據)REN:1 允許串口接收
ES = 1;//串口中斷開
EA = 1;//總中斷開
}
void main()
{
UsartInit();
while(1);
}
void Usart() interrupt 4
{
u8 receiveData;
receiveData = SBUF;//從數據緩衝區SBUF中讀取數據至receiveData變量中
RI = 0;//接收中斷標誌位 置0以接收下組數據
SBUF = receiveData ;//給SBUF賦值 意在向串口發送數據
while(!TI);//判斷是否發送完成 若完成會被置1 向CPU請求中斷
TI = 0;//發送中斷標誌位 置0以發送下組數據
}