0x06 LED矩陣
74HC595
教程:https://www.bilibili.com/video/av25104575?from=search&seid=1047628661288106627
工作原理
D0到D7從下到上
P0到P7從右往左
代碼示例
0x07 驅動直流電機
驅動原理
本例中使用的是UNL2003芯片
可以看到和非門類似,輸入低電平就為高電平,輸入高電平就為低電平
吧直流電機一端接在5V電源上(高電平),另外一端接四個管腳的其中一個
要控制直流電機,要使直流電機兩端電平不同,一端已經(jīng)接了高電平(5V),所以因為UNL2003類似非門,輸入高電平時才是低電平,所以UNL2003芯片的輸入應該也為高電平
代碼
讓直流電機運行一小會
注意最后一定要加while(1);
單片機默認會循環(huán)的執(zhí)行程序,所以不加的話可能就會一直運行或者運行一會停止又馬上運行
#include <reg51.h>
#include "intrins.h"
sbit moto = P1^0;
typedef unsigned char u8;
typedef unsigned int u16;
void delay(u16 t){
while(t--);
}
void main(){
moto = 0; //?????
delay(5000);
//??????
moto = 1;
delay(50000);
moto = 0;// ?????
while(1){}
}
注意:
默認直流電機為開啟狀態(tài),如果打開電源后電機總是處在運行狀態(tài)沒有停止與代碼不相符,一定要檢查是否控制錯了管腳,本例中控制的是P01
0x07 中斷
1. 中斷的概念
中斷即指單品機停止當前所作的工作A,轉向工作B,稍后在來完成工作A
引起CPU中斷的根源洞焙,稱為中斷源摊崭。中斷源向CPU提出的中斷請求。CPU暫時中斷原來的事務A钻弄,轉去處理事件B稼稿。對事件B處理完畢后薄榛,再回到原來被中斷的地方(即斷點),稱為中斷返回让歼。實現(xiàn)中斷功能的部件稱為中斷系統(tǒng)敞恋。
2. 中斷的類型
STC89C5X 系列單片機提供了 8 個中斷請求源,它們分別是:外部中斷 O(INTO)谋右、外部中斷 1(INT1)耳舅、外部中斷 2(INT2)、外部中斷 3(INT3)倚评、定時器 0 中斷浦徊、定時器 1 中斷、定時器 2 中斷天梧、串口(UART)中斷
注意:51 系列單片 機一定有基本的 5 個中斷盔性,但不全有 8 個中斷,需要查看芯片手冊呢岗,通常我們 使用的都是基本的 5 個中斷:INT0冕香、INT1、定時器 0/1后豫,串口中斷
中斷號會體現(xiàn)在代碼中!
3. 單片機中斷系統(tǒng)
89C51/52的中斷系統(tǒng)有5個中斷源 悉尾,2個優(yōu)先級,可實現(xiàn)二級中斷嵌套 挫酿。
從上到下優(yōu)先級遞增
4. 中斷的條件
1.1 中斷允許控制
CPU對中斷系統(tǒng)所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的构眯。
- EX0(IE.0),外部中斷0允許位早龟;
- ET0(IE.1)惫霸,定時/計數(shù)器T0中斷允許位;
- EX1(IE.2)葱弟,外部中斷0允許位壹店;
- ET1(IE.3),定時/計數(shù)器T1中斷允許位芝加;
- ES(IE.4)硅卢,串行口中斷允許位;
- EA (IE.7), CPU中斷允許(總允許)位将塑。如果置0不能發(fā)生中斷
1.2 中斷請求標志
- IT0(TCON.0)脉顿,外部中斷0觸發(fā)方式控制位。
- 當IT0=0時抬旺,為電平觸發(fā)方式弊予。
- 當IT0=1時祥楣,為邊沿觸發(fā)方式(下降沿有效)开财。
- IE0(TCON.1),外部中斷0中斷請求標志位误褪。
- IT1(TCON.2)责鳍,外部中斷1觸發(fā)方式控制位。
- IE1(TCON.3)兽间,外部中斷1中斷請求標志位历葛。
- TF0(TCON.5),定時/計數(shù)器T0溢出中斷請求標志位嘀略。
- TF1(TCON.7)恤溶,定時/計數(shù)器T1溢出中斷請求標志位。
1.3 中斷響應條件
- 中斷源有中斷請求.如當IT0 = 1時發(fā)生了下降沿
- 此中斷源的中斷允許位為1,如外部中斷0, EX0 =1
- CPU開中斷(即EA=1)帜羊。
以上三條同時滿足時咒程,CPU才有可能響應中斷。
4. 使用中斷讼育,程序員需要做什么帐姻?
- 你想使用的中斷是哪個?選擇相應的中斷號奶段;
- 你所希望的觸發(fā)條件是什么饥瓷?
- 你希望在中斷之后干什么?
中斷服務函數(shù):
void int0 () interrupt 0 using 1
{
do anything that you want
}
using 1可以省略不用
0x08 定時器/計數(shù)器中斷
51 單片機有兩組定時器/計數(shù)器痹籍,因為既可以定時呢铆,又可以計數(shù),故稱之 為定時器/計數(shù)器蹲缠。
1. 四個周期
- 振蕩周期:為單片機提供定時信號的振蕩源的周期(晶振周期或外加振蕩 周期)
- 狀態(tài)周期:2 個振蕩周期為 1 個狀態(tài)周期刺洒,用 S 表示。振蕩周期又稱 S 周 期或時鐘周期
- 機器周期:1 個機器周期含 6 個狀態(tài)周期吼砂,12 個振蕩周期逆航。
- 指令周期:完成 1 條指令所占用的全部時間,它以機器周期為單位
渔肩,51 單片機相關周期的具體值為:
振蕩周期=1/12us; 狀態(tài)周期=1/6us;
機器周期=1us; 指令周期=1~4us;
2. 定時器工作原理
STC89C5X 單片機內有兩個可編程的定時/計數(shù)器 T0因俐、T1 和一個特殊功能定 時器 T2。定時/計數(shù)器的實質是加 1 計數(shù)器(16 位),由高 8 位和低 8 位兩 個寄存器 THx 和 TLx 組成抹剩。它隨著計數(shù)器的輸入脈沖進行自加 1撑帖,也就是每來一 個脈沖,計數(shù)器就自動加 1澳眷,當加到計數(shù)器為全 1 時胡嘿,再輸入一個脈沖就使計數(shù) 器回零,且計數(shù)器的溢出使相應的中斷標志位置 1钳踊,向 CPU 發(fā)出中斷請求(定時 /計數(shù)器中斷允許時)衷敌。如果定時/計數(shù)器工作于定時模式,則表示定時時間已到拓瞪; 如果工作于計數(shù)模式缴罗,則表示計數(shù)值已滿〖拦。可見面氓,由溢出時計數(shù)器的值減去計數(shù) 初值才是加 1 計數(shù)器的計數(shù)值。
注意:
①定時器/計數(shù)器和單片機的 CPU 是相互獨立的蛆橡。定時器/計數(shù)器工作的過程 是自動完成的舌界,不需要 CPU 的參與。
②51 單片機中的定時器/計數(shù)器是根據(jù)機器內部的時鐘或者是外部的脈沖信 號對寄存器中的數(shù)據(jù)加 1泰演。
2.1 51 單片機定時/計數(shù)器結構
T0對應 P3.4管腳
T1對應P3.5 管腳
51單片機定時/計數(shù)器的工作由兩個特殊功能寄存器控制.
- TMOD: 確定工作方式
- TCON: 控制定時器/計數(shù)器的啟動,停止與設置溢出標志
2.2 工作方式寄存器TMOD
工作方式寄存器 TMOD 用于設置定時/計數(shù)器的工作方式呻拌,低四位用于 T0,高 四位用于 T1粥血。其格式如下:
GATE 是門控位, GATE=0 時柏锄,用于控制定時器的啟動是否受外部中斷源信號 的影響。只要用軟件使 TCON 中的 TR0 或 TR1 為 1复亏,就可以啟動定時/計數(shù)器工作趾娃; GATA=1 時,要用軟件使 TR0 或 TR1 為 1缔御,同時外部中斷引腳 INT0/1 也為高電平 時抬闷,才能啟動定時/計數(shù)器工作。即此時定時器的啟動條件耕突,加上了 INT0/1 引腳 為高電平這一條件
C/T :定時/計數(shù)模式選擇位笤成。C/T =0 為定時模式;C/T =1 為計數(shù)模式。 M1M0:工作方式設置位眷茁。工作方式詳見下節(jié)
例如要使用定時器0,那么就設置TMOD |= 0x01(使用或運算是為了不使之前TMOD的值收到干擾)
即
- GATE = 0 ,此時將TCON中的TR0設置為1即可工作
- C/T = 0定時模式
- M1M0 = 01 為模式1
2.3 控制寄存器TCON
TCON 的低 4 位用于控制外部中斷,已在前面介紹炕泳。TCON 的高 4 位用于控制定 時/計數(shù)器的啟動和中斷申請。其格式如下:
TF1(TCON.7):T1 溢出中斷請求標志位上祈。T1 計數(shù)溢出時由硬件自動置 TF1 為 1培遵。CPU 響應中斷后 TF1 由硬件自動清 0浙芙。T1 工作時,CPU 可隨時查詢 TF1 的 狀態(tài)籽腕。所以嗡呼,TF1 可用作查詢測試的標志。TF1 也可以用軟件置 1 或清 0皇耗,同硬 件置 1 或清 0 的效果一樣南窗。 TR1(TCON.6):T1 運行控制位。TR1 置 1 時郎楼,T1 開始工作万伤;TR1 置 0 時, T1 停止工作箭启。TR1 由軟件置 1 或清 0壕翩。所以蛉迹,用軟件可控制定時/計數(shù)器的啟動 與停止傅寡。 TF0(TCON.5):T0 溢出中斷請求標志位,其功能與 TF1 類同北救。 TR0(TCON.4):T0 運行控制位荐操,其功能與 TR1 類同。
如果要使用定時器0,需要將TR1 置為1,才能打開控制,當溢出時TF0 為1,清零將TF0置零即可
3. 定時器工作方式
定時/計數(shù)器有四種工作方式珍策。
3.1 方式0
方式 0 為 13 位計數(shù)托启,由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位組成。 TL0 的低 5 位溢出時向 TH0 進位攘宙,TH0 溢出時屯耸,置位 TCON 中的 TF0 標志,向 CPU 發(fā)出中斷請求蹭劈。其結構圖如下所示:
3.2 方式1
方式 1 的計數(shù)位數(shù)是 16 位疗绣,由 TL0 作為低 8 位,TH0 作為高 8 位铺韧,組成了 16 位加 1 計數(shù)器多矮。其結構圖如下所示:
3.3 方式2
方式 2 為自動重裝初值的 8 位計數(shù)方式。工作方式 2 特別適合于用作較 精確的脈沖信號發(fā)生器哈打。其結構圖如下所示:
4. 定時器配置
在使用定時器時塔逃,應該如何配置使其工作?其步驟如下(各步驟順序可任 意):①對 TMOD 賦值料仗,以確定 T0 和 T1 的工作方式湾盗,如果使用定時器 0 即對 T0 配 置,如果使用定時器 1 即對 T1 配置立轧。 ②根據(jù)所要定時的時間計算初值,并將其寫入 TH0格粪、TL0 或 TH1丙挽、TL1。 ③如果使用中斷匀借,則對 EA 賦值颜阐,開放定時器中斷。 ④使 TR0 或 TR1 置位吓肋,啟動定時/計數(shù)器定時或計數(shù)凳怨。 上述中有一個定時/計數(shù)器初值的計算,下面我們來看下如何計算定時/計數(shù) 器初值是鬼。
5. 計算初值
定時器本質上其實就是計數(shù)器,只不過是根據(jù)機器周期把計數(shù)的次數(shù)轉化成了時間而已
可以自己計算,也可以使用軟件計算
自己計算的方法如下
定時器初值計算方法
前面我們介紹過機器周期的概念肤舞,它是 CPU 完成一個基本操作所需要的時間。 其計算公式是:機器周期=1/單片機的時鐘頻率均蜜。51 單片機內部時鐘頻率是外部 時鐘的 12 分頻李剖,也就是說當外部晶振的頻率輸入到單片機里面的時候要進行 12 分頻。比如說你用的是 12MHZ 晶振囤耳,那么單片機內部的時鐘頻率就是 12/12MHZ篙顺, 當你使用 12MHZ 的外部晶振的時候,機器周期=1/1M=1us充择。如果我們想定時 1ms 172
的初值是多少呢德玫?1ms/1us=1000。也就是要計數(shù) 1000 個椎麦,初值=65535-1000+1 (因為實際上計數(shù)器計數(shù)到 66636(2 的 16 次方)才溢出宰僧,所以后面要加 1) =64536=FC18H,所以初值即為 THx=0XFC观挎,TLx=0X18琴儿。
如果要計算太多的時間,可以以一個比較小的時間為基本單位:如1ms,
6. 實驗代碼
控制小燈間隔1s閃爍
別忘了在main函數(shù)中調用Timer0Init()函數(shù)!!!
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P2^0;
void Timer0init(){
// ???????????TMOD????????????,????M0M1,????|????
TMOD |= 0x01; //???????0????1,??TMOD?????λ????,????λ??????????
//???1ms ????????1us ???????? 1ms/1us = 1000 c????65536-1000 = FC18H
//??????????μ???????????м???
//???ó??
TH0 = 0xFC;
TL0 = 0x18;
//?????1????ж???λ ET0
ET0 = 1;
// ???ж?
EA = 1;
//???п???λ,??1???????
TR0 = 1;
}
void main(){
Timer0init();
while(1)
{
}
}
//?????0???ж???1,?????1???ж???3
void Timer0() interrupt 1{
static u16 i = 0;
TH0 = 0xFC;
TL0 = 0x18;
i++;
//??i????1s
if(i==1000){
i = 0;
led = ~led;
}
}