折騰了一上午,沒有人帶只能自己摸索了........
接法:JP10接J12;JP8接JP16;P3^2接GND;P2^0接LED;
只有打開全局開關,其它各位的開關才可以開啟。
所有開關賦值為1則開,賦值為0則關。
|
||||||||
位序號
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
說明
|
外部中斷0
|
定時/計數0
|
外部中斷1
|
定時/計數1
|
串行口中斷
|
定時/計數2
(52單片機)
|
無效位
|
全局中斷位
|
位符號(寫程序時直接引用)
|
EX0
|
ET0
|
EX1
|
ET1
|
ES
|
ET2
|
--
|
EA
|
位地址
|
A8H
|
A9H
|
AAH
|
ABH
|
ACH
|
ADH
|
--
|
AFH
|
EA:總允許位
ES:串口中斷允許位
ET1:定時計數器1中斷允許位
EX1:外部中斷1中斷允許位
ET0:定時計數器0中斷允許位
EX0:外部中斷0中斷允許位
52單片機中的6個中斷源和單片機端口的關系:
1外部中斷0的中斷申請線INT0就是P3口的P3.2口線
2外部中斷1的中斷申請線INT1就是P3口的P3.3口線
3計數器0的外部計數輸入端為單片機P3口的P3.4口線(定時器0為內部中斷)
4計數器1的外部計數輸入端為單片機P3口的P3.5口線(定時器1為內部中斷)
5串行口中斷(分為串行口接受中斷RXD即單片機P3口的P3.0口線;串行口發送中斷TXD即單片機P3口的P3.1口線
6計數器2的外部計數輸入端為單片機P1口的P1.0口線 (定時器2為內部中斷)
TCON
TCON(Timer Control Register)定時器/計數器控制寄存器
TCON在特殊功能寄存器中,字節地址為88H,由于有位地址,十分便于進行位操作。
TCON的作用是控制定時器的啟、停,標志定時器溢出和中斷情況。
TCON的格式如下圖所示。其中,TF1,TR1,TF0和TR0位用于定時器/計數器;IE1,IT1,IE0和IT0位用于中斷系統。
各位定義如下:
TF1:定時器1溢出標志位。當定時器1計滿溢出時,由硬件使TF1置“1”,并且申請中斷。進入中斷服務程序后,由硬件自動清“0”,在查詢方式下用軟件清“0”。
TR1:定時器1運行控制位。由軟件清“0”關閉定時器1。當GATE=1,且INT1為高電平時,TR1置“1”啟動定時器1;當GATE=0,TR1置“1”啟動定時器1。
TF0:定時器0溢出標志。其功能及操作情況同TF1。
TR0:定時器0運行控制位。其功能及操作情況同TR1。
IE1:外部中斷1請求標志位。
IT1:外部中斷1觸發方式選擇位。當IT1=0,為低電平觸發方式;當IT1=1,為下降沿觸發方式。
IE0:外部中斷0請求標志位。
IT0:外部中斷0觸發方式選擇位。 當IT0=0,為低電平觸發方式;當IT0=1,為下降沿觸發方式。
TCON中低4位與中斷有關。由于TCON是可以位尋址的,因而如果只清溢出或啟動定時器工作,可以用位操作命令。例如:執行“CLR TF0”后則清定時器0的溢出;執行“SETB TR1”后可啟動定時器1開始工作(當然前面還要設置方式定)。
code:
//電平觸發
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1=P2^0;
uchar num;
uchar wnum=0x00;
uchar code dbit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段選,選擇要顯示的數字
//uchar code wnum[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//八位數碼管
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
void main()
{
P1=wnum;
EA=1;//打開中斷總開關
EX0=1;//打開外部中斷0,P3.2選通
IT0=0;//選擇電平觸發方式
while(1)
{
for(num=0;num<10;num++)
{
P0=dbit[num];
delay(500);
}
}
}
void duan() interrupt 0
{
D1=1;
delay(500);
D1=0;
delay(500);
}
//邊沿觸發方式
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1=P2^0;
uchar num;
uchar wnum=0x00;
uchar code dbit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段選,選擇要顯示的數字
//uchar code wnum[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//八位數碼管
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
void main()
{
P1=wnum;
EA=1;//打開中斷總開關
EX0=1;//打開外部中斷0,P3.2選通
IT0=1;//選擇邊沿觸發方式
while(1)
{
for(num=0;num<10;num++)
{
P0=dbit[num];
delay(500);
}
}
}
void duan() interrupt 0
{
D1=1;
delay(500);
D1=0;
delay(500);
}