1.首先是特殊功能寄存器。 認為指的是P0,P1,P2,P3,P4. 在頭文件<reg52.h>有對特殊功能寄存器的地址分配。 另一個是sbit,是對P0等的8個口的定義。例sbit LED = P0^0,就相當於用LED表示 P0^0. 可以理解成別名。 2.電磁干擾,冬天毛衣靜電,靜電放電ESD ...
1.首先是特殊功能寄存器。 認為指的是P0,P1,P2,P3,P4. 在頭文件<reg52.h>有對特殊功能寄存器的地址分配。
另一個是sbit,是對P0等的8個口的定義。例sbit LED = P0^0,就相當於用LED表示 P0^0. 可以理解成別名。
2.電磁干擾,冬天毛衣靜電,靜電放電ESD,手機收音機有雜音,快速瞬間群脈衝EFT,熱插拔產生的浪涌,Surge。
3.電容有兩個作用,作用1,緩衝作用,當剛上電 的時候,電流從電源處流下來,不穩定,容易衝擊電子元器件,加個電容可以緩衝。作用2,穩定作用,比如,後面有個電子元器件沒有工作時,電流時100mA,當它工作時,電流突然變成150mA,這個時候沒有電容,電壓就是直接下降。而電子元器件必須高於一定的電壓才能工作,所以這個時候電容就派上用場了。電源處的去耦高頻電容,基本可以直接用0.1uF。
4.三極體。箭頭朝內PNP,導通電壓順箭頭通過,電壓導通,電流控制。就是箭頭的始端比箭頭末端高0.7V,就可以導通ec之間。
5.unsigned char 0~255,signed char -128~127,unsigned int 0~65535,signed int -32768~32767
6.定時器。時鐘周期就是晶振周期分之一。機器周期是12個時鐘周期。
TCON定時器控制寄存器的位描述,可位定址。TF1是定時器1溢出標誌,發生溢出時硬體置1,清零的方式有軟體清零或進入定時器中斷時硬體清零。
TR1定時器1運行控制位,軟體置位/清零來進行啟動/停止。
TMOD定時器模式寄存器,不可位定址。M1,M0.
7.中斷。IE中斷使能寄存器的位分配。可位定址。EA =1 總開關。ET2 定時器2中斷使能,ES串口中斷使能。ET1 定時器1中斷使能,EX1,外部中斷1使能,ET0定時器0中斷使能,EX0外部中斷使能。
中斷查詢序列
中斷函數編號 | 中斷名稱 | 中斷標誌位 | 中斷使能位 | 中斷向量地址 | 預設優先順序 |
0 | 外部中斷0 | IE0 | EX0 | 0x0003 | 1 |
1 | T0中斷 | TF0 | ET0 | 0x000B | 2 |
2 | 外部中斷1 | IE1 | EX1 | 0x0013 | 3 |
3 | T1中斷 | TF1 | ET1 | 0x001B | 4 |
4 | URAT中斷 | TI/RI | ES | 0x0023 | 5 |
5 | T2中斷 | TF2/EXF2 | ET2 | 0x002B | 6 |
中斷函數編號 = x*8 +3 = 向量地址
IP 中斷優先順序寄存器位分配,可位定址。
PT2 定時器2 中斷優先順序控制位
PS 串口中斷優先順序控制位
PT1 定時器1中斷優先順序控制位
PX1 外部中斷1中斷優先順序控制位
PT0 定時器0中斷優先順序控制位
PX0 外部中斷0 中斷優先順序控制位
為什麼要取反,二進位在左移或者是右移,都是要補0.所以為了避免麻煩,還是取反來的方便。
下麵的程式是流水燈,沒有用定時器,然後,後面會對程式進行優化,使用定時器和中斷。
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned int i;
unsigned char flag = 0;
unsigned char ChuZhi = 0x80;
ADDR0=0;
ADDR1=1;
ADDR2=1;
ADDR3=1;
ENLED=0;
while(1)
{
P0=~ChuZhi;
for(i=0;i<20000;i++);
if(flag == 0)
{
ChuZhi = ChuZhi >>1;
if(ChuZhi == 0x01)
{
flag = 1;
}
}
else
{
ChuZhi = ChuZhi<<1;
if(ChuZhi == 0x80)
{
flag = 0;
}
}
}
}
使用定時器 實現流水燈
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned char flag = 0;
unsigned char ChuZhi = 0x80;
unsigned char cnt = 0;
ADDR0=0;
ADDR1=1;
ADDR2=1;
ADDR3=1;
ENLED=0;
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
TR0= 1;
while(1)
{
if(TF0 == 1)
{
TF0 = 0;
TH0 = 0x4C;
TL0 = 0x00;
cnt++;
if(cnt >= 20)
{
cnt = 0;
P0=~ChuZhi;
if(flag == 0)
{
ChuZhi = ChuZhi >>1;
if(ChuZhi == 0x01)
{
flag = 1;
}
}
else
{
ChuZhi = ChuZhi<<1;
if(ChuZhi == 0x80)
{
flag = 0;
}
}
}
}
}
}