補充:1.變量前加code,從RAM區變成ROM區
2.三極管的原理就是PN結
3.裸機程序是單線程的,display時不能delay
一、獨立按鍵
1.高電平沒按,低電平按了
按鍵原理:輪詢方式(poll)-->以消耗大量CPU資源為代價
????????代碼:
int key_pressed(void)
{int ret = 0;if((P1 & (1 << 4)) == 0){ret = 1;}else if((P1 & (1 << 5)) == 0){ret = 2;}else if((P1 & (1 << 6)) == 0){ret = 3;}else if((P1 & (1 << 7)) == 0){ret = 4;}return ret;
}
二、中斷處理(由kernel處理)
1.中斷的概念:
????????當中央處理機CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方,繼續原來的工作,這樣的過程稱為中斷。
2.中斷源:能夠打斷當前工作任務的事件(外部中斷)
? ? ? ? eg:引腳的電平中斷
3.中斷的步驟:
1)中斷源發出中斷請求
2)CPU檢查是否響應中斷及該中斷源是否被屏蔽
3)檢查中斷優先級(高級別 > 低級別)
? ? ? ? 在51單片機中,中斷嵌套最多2個
? ? ? ? 優先級相同的中斷請求時,誰的號小誰先來
4)保護現場
5)執行中斷服務函數
6)恢復現場
? ? ? ? 4、5、6類似于C語言中調用函數
4.51單片機中5個中斷源:外部中斷0、定時器中斷0、外部中斷1、定時器中斷1、串口中斷
5.1)EA:中斷總開關
2)IE中斷允許寄存器(可位尋址)
3)IE0:外部中斷0請求源
IT0:低電平觸發? IT0 = 0;下降沿觸發 ITO = 1;
三、定時器(timer0、timer1)
1.TR0
????????TR0:定時器T0的運行控制位。該位由軟件置位和清0。當GATE(TMOD.3)=0,TR0=1時就允許T0開始計數,TR0=0時禁止T0計數。當GATE(TMOD.3)=1,TR1=0且INT0輸入
高電平時,才允許T0計數???
2.
3.16位定時器? ? 代碼:
void init_timer0(void)
{TMOD &= ~(0x0f << 0);TMOD |= (1 <<0);TH0 = g_n >> 8;TL0 = g_n;TCON |= (1 << 4);IE |= (1 << 7) | (1 << 1);
}
4.晶振(12MHZ、11.0592MHZ)
1s = 1000Ms? 1Ms = 1000us
????????計算HZ的方法:
5.PWM
????????高電平占的部分叫做占空比、從上升沿到下一個上升沿,叫一個周期
? ? ? ? 占空比 = 高電平 /? 周期
四、蜂鳴器(分為有源和無源)
1.源指的不是電源而是震蕩源
2.原理圖:
3.代碼:main.c
#include <reg52.h>
#include "timer.h"
#include "key.h"#define HZ200 63231
#define HZ400 64383
#define HZ600 64768
#define HZ800 64959int main(void)
{init_timer0();while(1){int key = key_pressed();if(1 == key){g_n = HZ200;}else if(2 == key){g_n = HZ400;}else if(3 == key){g_n = HZ600;}else if(4 == key){g_n = HZ200;} }
}
timer.c
#include "timer.h"
#include <reg52.h>unsigned int g_n;void init_timer0(void)
{TMOD &= ~(0x0f << 0);TMOD |= (1 <<0);TH0 = g_n >> 8;TL0 = g_n;TCON |= (1 << 4);IE |= (1 << 7) | (1 << 1);
}void timer0_handler(void) interrupt 1
{TH0 = g_n >> 8;TL0 = g_n;P2 ^= (1 << 1);
}