單片機c語言中斷
1. 單片機中斷c語言
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0-9
ucharscanled;
ucharflag=0;
uchardisdat[6];
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
voiddischg()
{
uchari;
for(i=0;i<6;i++)
disdat[i]=10;
}
voidext0()interrupt0
{
flag=1;
}
voidext1()interrupt2
{
flag=2;
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]];
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]];
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
uchari,j;
TMOD=0x10;
TH1=0xec;
TL1=0x78;
TR1=1;
ET1=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
scanled=0;
dischg();
while(1)
{
i=0;
switch(flag)
{
case1:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[5]=disdat[4];
disdat[4]=disdat[3];
disdat[3]=disdat[2];
disdat[2]=disdat[1];
disdat[1]=disdat[0];
disdat[0]=i;
delay(200);
}
dischg();
flag=0;
break;
case2:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[0]=disdat[1];
disdat[1]=disdat[2];
disdat[2]=disdat[3];
disdat[3]=disdat[4];
disdat[4]=disdat[5];
disdat[5]=i;
delay(200);
}
dischg();
flag=0;
break;
default:break;
}
}
}
2. 單片機中斷函數C語言的問題
void Timer1() interrupt 3
{ TH1=xx; TL1=xx; //建議還是取定時值為1ms,或者是 0.5ms ;
cnt++;
if (s<50)
{
if(cnt>500) { cnt=0; beep=~beep;}
}
else if (s>=50 && s<100)
{
if(cnt>1000) { cnt=0; beep=~beep;}
}
.........
}
如果定時中斷為20ms,對應的頻率計數50Hz,這個頻率已經很低了,那麼再通過cnt計數500次,輸出信號頻率就遠遠超出音頻范圍,你根本就聽不到聲音;
另外,蜂鳴器的proteus模擬可能不太准確,可以通過模擬示波器看波形及頻率就好了;
3. 51系列單片機C語言中的中斷的問題
①這幾個是中斷服務函數的聲明,僅僅表示當有對應向量的中斷產生時、應跳轉到對應的函數,並不代表開啟了中斷。
②一塌糊塗。向量3是定時器1中斷,你在裡面重新賦值TH0、TH0做什麼?而下面向量1明明是定時器0中斷,你又去折騰TH1、TL1……
4. 幾種單片機C語言的中斷程序寫法
關於c的中斷使用一般是,定義函數的時候在後面加上interrupt
n
其中
n
對應中斷源的編號,其值從
0
開始,以
80c51
單片機為例,編號從
0~4,分別對應外中斷
0.
定時器0
中斷.外部中斷
1
.定時器1
中斷.和串列口中斷
.
void
xxxx(void)interrupt
n//中斷服務函數
{
要寫的中斷服務程序.
}
5. c語言怎麼編寫單片機的中斷
給你上個較完整的程序,可以直接在KEIL中運行並觀察輸出
/******************************************************************************
功能:
本程序在12M晶振模式下,通過定時器中斷精確實現數字時鍾計時操作,並在KEIL
中實現輸出。時、分、秒的變化在定時中斷里處理。
說明:
因採用工作方式2,自動裝入初值,所以此程序計時很精確,只是在KEIL中模擬輸
出顯示的變化速度很快,這點可不理會
******************************************************************************/
#include
#include
#define
TEST
//此行用於KEIL輸出顯示,如果不需要顯示可將其刪除
typedef
unsigned
char
uchar;
typedef
unsigned
int
uint;
#define
TH0TL0_INIT
(256-250)
//定時器8位自動裝入模式下寄存器初值,0.25ms中斷一次
char
cHour;
//時
char
cMin;
//分
char
cSec;
//秒
uint
iCount;
//秒計數,計數達到4000時1s,4000*0.25ms
=1000ms
=
1s
bit
bSecChanged;
//秒發生變化標志,每秒送一次輸出顯示,送顯完成後清0,提高主程序效率
//==============================================================================
//T0定時器中斷服務程序,12M晶振下每0.25ms產生中斷,本程序執行一次
//==============================================================================
void
Timer0()
interrupt
1
{
iCount++;
//秒計數值+1
if(iCount==4000)
{//時間計數達到1S
iCount
=
0;
//重新開始下一秒計數
cSec++;
//時鍾:秒+1
bSecChanged
=
1;
//置秒發生變化標志
if(cSec==60)
{//計夠60s
cSec
=
0;
//重新開始下一分計數
cMin++;
//時鍾:分+1
}
if(cMin==60)
{//計夠60分鍾
cMin
=
0;
//重新開始下一小時計數
cHour++;
//時鍾:小時+1
}
if(cHour==24)
{//計夠24小時
cHour
=
0;
//重新開始第二天計數
}
}
}
//==============================================================================
//主程序
//==============================================================================
void
main()
{
uchar
outstr[10];
//輸出字元串,我的編譯器可能有問題,直接輸出有錯
TMOD
=
0X02;//工作方式2,8位自動重裝計時模式
TH0
=
TH0TL0_INIT;
//0.25ms中斷一次
TL0
=
TH0TL0_INIT;
//0.25ms中斷一次
#ifdef
TEST
SCON
=
0x50;
/*
SCON:
mode
1,
8-bit
UART,
enable
rcvr
*/
TMOD
|=
0x20;
/*
TMOD:
timer
1,
mode
2,
8-bit
reload
*/
TH1
=
221;
/*
TH1:
reload
value
for
1200
baud
@
16MHz
*/
TR1
=
1;
/*
TR1:
timer
1
run
*/
TI
=
1;
/*
TI:
set
TI
to
send
first
char
of
UART
*/
#endif
cHour
=
0;
//時
cMin
=
0;
//分
cSec
=
0;
//秒
iCount
=
0;
//秒計數
bSecChanged
=
0;
outstr[2]
=
':';
//時分分隔符
outstr[5]
=
':';
//分秒分隔符
outstr[8]
=
0;
//字元串結束符
EA=1;
//開總中斷
ET0=1;
//允許T0中斷
TR0=1;
//啟動T0
while(1)
{
if(bSecChanged==1)
{//秒發生變化,將時間值轉換為可顯示字元串准備送顯示
bSecChanged
=
0;//清除標志,節省CPU資源
outstr[0]
=
cHour/10
+
0x30;
//將秒轉換為ASCII碼
outstr[1]
=
cHour%10
+
0x30;
outstr[3]
=
cMin/10
+
0x30;
//將分轉換為ASCII碼
outstr[4]
=
cMin%10
+
0x30;
outstr[6]
=
cSec/10
+
0x30;
//將小時轉換為ASCII碼
outstr[7]
=
cSec%10
+
0x30;
#ifdef
TEST
printf("
%s\r",outstr);
//在KEIL中顯示時鍾
#endif
}
}
}
6. 如何知道單片機C語言中斷入口函數關鍵字的標准寫法
單片機C語言中斷入口函數標准寫法如下:
外部中斷0:void
ext0()
interrupt
0
定時器0:
void
time0()
interrupt
1
外部中斷1:void
ext1()
interrupt
2
定時器1:void
timer1()
interrupt
3
串口:
void
uart()
interrupt
4
如果要用其他工作寄存器組,後面可以加:using
n(n=0,1,2,3)
7. 單片機C語言中斷函數的定義形式是怎樣的
形式如下:
void 中斷名(void) inerrupt 中斷號 using 工作寄存器組
比如外部中斷0
void ext0(void) interrupt 0 using 1 //後面的using 1可以省略,預設為0
定時器1
void t1isr() interrupt 3
(7)單片機c語言中斷擴展閱讀:
單片機內部結構
1、CPU
它的名字沒有改,還是稱為CPU(Central Processing Unit)。它是單片機的核心部件,包括運算器和控制器。
運算器既是算術邏輯單元ALU(Arithmetic logic Unit),其功能是進行算術運算和邏輯運算。
控制器一般由指令寄存器、指令解碼器、時序電路和控制電路組成。其作用是完成取指令、將指令解碼形成各種微操作並執行指令,同時控制計算機的各個部件有條不紊地工作。
2、單片機內部結構之一ROM
「硬碟」,改了名字,稱為程序存儲器,也叫只讀存儲器。用ROM(Read only memery)表示。其作用和計算機的硬碟差不多,用來存放用戶編寫的程序。特點是:掉電後不會丟失數據(程序)。
8. 單片機c語言中斷
查詢傳送方式查詢方式的過程為: 查詢—等待—數據傳送。直接存儲器存取(DMA)方式。在下述兩種情況下可考慮採用DMA 方式:外設和存儲器之間有大量的數據需要傳送, 如磁碟驅動器中的大量數據需快速送到微機系統的RAM 中;外部設備的工作速度很高。同其他計算機系統一樣, 單片機系統還有另一種非常重要的數據輸入/ 輸出方式———中斷方式。中斷的概念中斷優先順序:中斷系統中有兩個不可定址的「優先順序生效」觸發器, 一個指出CPU 是否正在執行高優先順序的中斷服務程序, 另一個指出CPU 是否正在執行低優先順序中斷服務程序。二級中斷嵌套當CPU 正在處理一個中斷請求時, 又出現了另一個優先順序比它高的中斷請求, 這時,CPU 就暫時中止執行對原來優先順序較低的中斷源的服務程序, 保護當前斷點, 轉去響應優先順序更高的中斷請求, 並為其服務。中斷處理的大致流程 中斷響應條件1有中斷源發出中斷請求;2中斷總允許位EA = 1 , 即CPU 開中斷;3申請中斷的中斷源的中斷允許位為1 , 即中斷沒有被屏蔽;4無同級或更高級中斷正在被服務;5當前的指令周期已經結束;6若現行指令為RETI 或者是訪問IE 或IP 指令, 則該指令以及緊接著的另一條指令已執行完。 </SPAN></SPAN>
9. 單片機C語言,如何使用多個中斷。
優先順序高的中斷在執行時,如有低優先順序中斷到達,低優先順序被掛起。等高優先順序結束後,再處理低優先順序。
優先順序低的中斷在執行時,如有高優先順序中斷到達,開始執行高優先順序中斷。等高優先順序結束後,再返回處理低優先順序。
如果你一直在不斷地觸發外部中斷,那等於讓程序不斷地執行外部中斷,就沒時間去處理顯示了。
10. 51單片機 C語言 如何實現中斷調用
#include<stc.h>
sbit
d1=P2^0;
sbit
p1=P2^1;
void
main()
{
方式一;
}
void
main()
{
EA=1;
EX0=1;
IT0=1;
方式二;
}
void
main()
{
EA=1;
EX1=1;
IT0=1;
方式三;
}
void
zd0()
interrupt
0
{
d1=0;
}
void
zd1()
interrupt
1
{
p1=0;
}
用的是外部中斷0和1,程序很簡單,注釋就不寫了。如果有錯誤的話,還請指正。