中斷系統
1.什么是中斷
當CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方,繼續原來的工作,這樣的過程稱為中斷
2.為什么要設置中斷系統
中斷系統是為使CPU具有對外界緊急事件的實時處理能力而設置的
3.中斷優先級:在執行中斷的過程中,如果外界又發生一次中斷,比較中斷優先級,優先處理優先級高的中斷
4.外部中斷:引腳電平變化所引發的中斷(P3_2由高電平變為低電平 觸發中斷)
3.中斷的執行流程是什么?
中斷源發出中斷請求;
CPU檢查該中斷源是否被屏蔽,處理器內核是否允許處理中斷;
查詢中斷優先級;
保護現場;
執行中斷服務函數;
恢復現場;
4.中斷源
51單片機只有前五個中斷源,優先級自上而下
外部中斷0, 定時器0, 外部中斷1, 定時器1, 串口通信
中斷向量表
中斷向量表是一個函數指針數組,在內存中有固定的存儲單元地址,每個地址對應一個中斷源的中斷服務程序入口,當中斷源觸發中斷時,CPU會自動跳轉到該中斷源在向量表中對應的固定地址
51單片機外設
1.GPIO類
? ? ? ? ds18b20,DHT11,HCSR04
2.ADC類
? ? ? ? MQ系列,氣體濃度,煙霧濃度
3.I2C
? ? ? ? MPU6050六軸加速度傳感器
? ? ? ? MAX301000血氧濃度傳感器
? ? ? ? BH1750光照強度傳感器
SPI類
? ? ? ? ADXL345三軸加速度傳感器
UART類
? ? ? ? GPS傳感器
三大總線
? ? ? ? 地址總線:專門用于傳輸地址信息,由CPU單向傳輸,指向內存和外設
? ? ? ? 數據總線:CPU和內存/外設雙向傳輸
? ? ? ? 控制總線:CPU向內存/外設發出指令,內存/外設向CPU反饋狀態
GPIO
通用輸入輸出端口,51單片機與外界交互最基本的方式
引腳:兩種模式 輸入模式 輸出模式
輸出功能:引腳獨立去輸出一個高電平(5V)/低電平(0V)
輸入功能:檢測引腳電平狀態? ? ? ? 按鍵
PWM
脈沖寬度調制
高電平所占的總周期的比例叫占空比?
有源蜂鳴器---接入直流電就可以發聲,只能發出固定頻率的聲音
無源蜂鳴器---需要脈沖信號,不同頻率不同音調? ? ? ? ? ? 源->震蕩源
通信方式
? ? ? ? 單工:兩個主機之間通過一根數據線進行傳輸,發送方和接收方是固定的,數據傳輸方向是固定的
????????半雙工:兩個主機之間通過一根數據線進行傳輸,通信的雙方既可以作為發送方也可以作為接收方,數據的傳輸方向是雙向的
????????全雙工:兩個主機之間通過兩根線進行傳輸,通信的雙方既可以作為發送方也可以作為接收方,數據的傳輸方向是雙向的
串行:傳輸數據時通過一根線實現,需要按照1個bit1個bit的次序先后傳輸(資源消耗小->1根線,傳輸速度慢)
并行:多個bit在多根數據線上同時進行傳輸(傳輸速度快,資源消耗大,需要多根線)
串口通信-全雙工串行通信
TTL工作流程
①空閑時數據線為高電平
②發送一個低電平表示起始位
③發送的第一個比特是最低位(最右邊)?
④校驗位分為奇校驗,偶校驗和無校驗
⑤為保證下一個字節發送前的起始位能夠表現出來,校驗位之后發送一個停止位1
串口通信時序
? ? ? ? 起始位+數據位(8bit)+校驗位(奇偶校驗)+停止位
波特率bps:每秒傳輸的bit數量
9600,n,8,1? ? ? ? ? ? ?9600bps,無校驗,8位數據位,1位停止位
同步和異步
? ? ? ? 串口通信通過波特率實現同步
? ? ? ? I2C通過時鐘線實現同步
UART
通用異步收發器
代碼
中斷寄存器配置
1.IE寄存器:中斷控制寄存器
? ? ? ? EA(B7):手動置1,代表CPU響應所有的中斷
? ? ? ? EX0(B1):手動置1,代表允許外部中斷0產生中斷
2.TCON寄存器? 定時器控制寄存器
IT0(B0):置1,代表外部中斷0(P3_2)在下降沿觸發中斷
main.c
#include <reg51.h>
#include "led.h"
void init_eint(void)
{P3 |= (1 << 2) | (1 << 3);IE |= (1 << 7) | (1 << 0) | (1 << 2);TCON |= (1 << 0) | (1 << 2);
}void eint0_handler(void) interrupt 0
{Led_Allon();
}void enin1_handler(void) interrupt 2
{Led_Alloff();
}
int main(void)
{init_eint();Led_Init();while (1){}
}
led.c
#include <reg51.h>void Led_Init(void)
{P2 = 0xFF;
}void Led_Allon(void)
{P2 = 0;
}void Led_Alloff(void)
{P2 = 0xFF;
}
PWM控制蜂鳴器
蜂鳴器以400HZ工作時
代碼
timer.c
#include "timer.h"
#include "led.h"
#include <reg51.h>
unsigned int g_t = 0;void Timer0_Handler(void) interrupt 1 //定時器0中斷服務函數
{ P2 ^= (1 << 1); //指定位翻轉TH0 = 64383 >> 8; //高位TL0 = 64383; //低位
}
void Timer0_Init(void) //定時器0初始化
{IE |= (1 << 7) | (1 << 1);//打開中斷總控制和T0溢出中斷//初始化定時器寄存器TMOD &= ~(0x0F << 0);TMOD |= (1 << 0);TH0 = 64383 >> 8;TL0 = 64383;TCON |= (1 << 4);
}
main.c
#include "timer.h"
#include "led.h"
#include "key.h"
int main(void)
{ Timer0_Init();while (1){ } return 0;
}