//功能:99秒時(shí)鐘
創(chuàng)新互聯(lián)專(zhuān)注于雙峰企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,成都商城網(wǎng)站開(kāi)發(fā)。雙峰網(wǎng)站建設(shè)公司,為雙峰等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
#includeAT89X51.H //包含頭文件
#define uchar unsigned char //預(yù)定義關(guān)鍵詞
#define uint unsigned int
#define ulong unsigned long
uchar tcount,secount; //定義全局變量
uchar code DISP[] //字形表
={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};
//0,1,2,3,4,5,6,7,8,9
uchar code LED[] //位碼表
={0xfd,0xfb,0xf7,0xef,0xdf,0xbf};
//P2.6,P2.5,P2.4,P2.3,P2.2,P2.1
/*****************************************************************************/
void DELAY_1MS(uint i) //延時(shí)1毫秒子程序
{
uchar j; //定義局部變量j
while(i--) //每循環(huán)一次,變量減一,為零返回
{
for(j=0;j123;j++); //循環(huán)123次
}
}
/*****************************************************************************/
void t0() interrupt 1 using 0//50毫秒定時(shí)器t0中斷入口
{
tcount++; //定時(shí)器中斷計(jì)數(shù)器加一
if(tcount==20) //計(jì)數(shù)20次
{
tcount=0; //清零定時(shí)器中斷計(jì)數(shù)器
secount++; //秒計(jì)數(shù)器加一
if(secount==100) //秒計(jì)數(shù)器等于100
{
secount=0; //秒計(jì)數(shù)器清零
}
}
TH0=(65535-50000)/256; //重賦定時(shí)器初值高位
TL0=(65535-50000)%256; //重賦定時(shí)器初值低位
}
/*****************************************************************************/
void main() //主程序
{
TMOD=0x01; //初始化定時(shí)器t0,工作于方式1,16位定時(shí)器
TH0=(65535-50000)/256; //賦初值高低
TL0=(65535-50000)%256; //賦初值低位
TR0=1; //啟動(dòng)定時(shí)器t0
ET0=1; //允許定時(shí)器t0中斷
EA=1; //開(kāi)放總中斷
tcount=0; //定時(shí)器中斷計(jì)數(shù)器初始化
secount=0; //秒計(jì)數(shù)器初始化
while(1) //主循環(huán)
{
P0=DISP[secount/10]; //秒計(jì)數(shù)器十位送顯示
P2=LED[4]; //點(diǎn)亮對(duì)應(yīng)數(shù)碼管
DELAY_1MS(2); //延時(shí)2毫秒
P0=DISP[secount%10]; //秒計(jì)數(shù)器個(gè)位送顯示
P2=LED[5]; //點(diǎn)亮對(duì)應(yīng)數(shù)碼管
DELAY_1MS(2); //延時(shí)2毫秒
}
}
對(duì)于C51單片機(jī),其內(nèi)部總共有五級(jí)中斷源
分別為外部中斷0、定時(shí)器0、外部中斷1、定時(shí)器1及串行中斷。
C51單片機(jī)的中斷使用時(shí),主要是通過(guò)中斷服務(wù)號(hào)來(lái)決定的。
如你定義一個(gè)中斷服務(wù)函數(shù):
void KEY(void) intterrupt 0
{
}
當(dāng)外部中斷0申請(qǐng)中斷時(shí)
會(huì)自動(dòng)根據(jù)interrupt后面的0,找到上面定義的這個(gè)中斷服務(wù)函數(shù)。
對(duì)于其他四個(gè)中斷源,其對(duì)應(yīng)的中斷號(hào)分別為1、2 、3、4
首先你要寫(xiě)中斷函數(shù)
然后在主程序中像調(diào)用子函數(shù)一樣調(diào)用就可以了
舉個(gè)例子吧
#define uchar unsigned char
#define uchar unsigned char
sbit D1=P1^0;
uchar aa;
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(aa==20)
{
D1=~D1;
aa=0;
}
}
}
void T0time()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
51的C語(yǔ)言中斷是函數(shù),那這個(gè)中斷是否可以調(diào)用?如果能,怎么調(diào)用?
只從計(jì)算機(jī)原理來(lái)講,是可以的。
理論上,中斷函數(shù)也是一個(gè)程序的入口,只要把程序指令指針指向這個(gè)中斷的入口地址,
就可以執(zhí)行相應(yīng)的代碼,從這個(gè)角度來(lái)講,是可操作的。
但在實(shí)際問(wèn)題處理中,通常不行,因?yàn)橹袛嗍翘峁┙o系統(tǒng)處理應(yīng)急事件的,
并非設(shè)計(jì)來(lái)作為常規(guī)函數(shù)呼叫。
如果只是想要使用中斷處理中的某些功能,可把那些功能封裝為獨(dú)立的函數(shù),
供給中斷處理和一般流程來(lái)調(diào)用。
應(yīng)用程序直接調(diào)用中斷,是有違中斷設(shè)計(jì)的初衷的,
不建議這樣使用,易導(dǎo)致原本正常的流程的莫名異常,
因?yàn)檎{(diào)用中斷處理,會(huì)占用中斷的相關(guān)資源,導(dǎo)致正常的中斷無(wú)法執(zhí)行,出現(xiàn)異常。
不是,中斷分為軟中斷和硬件中斷,是事件觸發(fā)的,而與函數(shù)(也就是過(guò)程)本質(zhì)上是不同的,雖然都是程序的跳轉(zhuǎn),但是中斷是跳轉(zhuǎn)到固定的地址(由中斷向量指向的地址單元),這個(gè)一般是由硬件決定,而函數(shù)嵌套屬于子程序調(diào)用,是軟件在控制,因此一般不認(rèn)為函數(shù)嵌套是中斷的實(shí)例,但有些書(shū)上也確實(shí)把它們聯(lián)系起來(lái)討論,原因是它們的實(shí)現(xiàn)機(jī)制十分相似,都包括現(xiàn)場(chǎng)的保護(hù),斷點(diǎn)地址的壓棧,程序返回時(shí)都有現(xiàn)場(chǎng)恢復(fù)和程序指針的出棧。
1.void(中斷函數(shù)返回類(lèi)型(空型)) Time1 (中斷函數(shù)名)(void(參數(shù)類(lèi)型) interrupt 3 (中斷號(hào))
2: 中斷條件發(fā)生時(shí)執(zhí)行中斷,比如void Time1(void) interrupt 3 是定時(shí)器1定時(shí)時(shí)間到發(fā)生中斷,中斷函數(shù)放在那里無(wú)所謂
3:void PxInt0(void) interrupt 0 中斷名為PxInt0的0號(hào)中斷
void PxInt1(void) interrupt 2 中斷名為PxInt1的2號(hào)中斷
void time0_int(void) interrupt 1 中斷名為time0_int的1號(hào)中斷
void time1_int(void) interrupt 3 中斷名為time1_int的3號(hào)中斷
4:中斷的代碼是你想中斷執(zhí)行的工作,中斷的代碼是根據(jù)任務(wù),需要你自己寫(xiě)的