單片機中斷c語言
A. 單片機c語言中斷
這是單片機c語言中斷函數的編程格式,()後面的只是告訴編譯系統該函數是一個中斷函數,具體的執行還是按照c語言函數的執行方式去執行。
B. 單片機中斷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)
{
:
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;
}
}
}
C. 求一個51單片機簡單的中斷C語言程序
這個是我自己做的 99s的計數器。用數碼管顯示的,這里使用了中斷,其目的是為了通過中斷來精確計算真實的時間。如果還有需要,給我郵箱,我這里還有不少資料,我學了2個多月,基本也算有點小成了吧。呵
//自行設計 99s,用數碼管顯示!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wei=P1^2;
sbit an=P1^1;
uchar num;
uchar i,j;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //數碼管模塊
void delayms(unsigned int i) // 毫秒延時
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}
void fu(uchar x,uchar y)
{
an=1;
P0=table[x]; //8的共陰碼
an=0;
wei=1;
P0=0xfe; //送位顯示碼
wei=0;
delayms(5);
an=1;
P0=table[y]; //8的共陰碼
an=0;
wei=1;
P0=0xfd; //送位顯示碼
wei=0;
delayms(5);
}
void main()
{
TMOD=0x01; //定時器0 工作方式1
TH0=(65536-45872)/256; //裝載初值為11.0592M晶振定時50ms 數為 45872
TL0=(65536-45872)%256;
EA=1; //打開總中斷
ET0=1; //開定時器0中斷
TR0=1;
while(1)
{
fu(i,j);
}
//程序在此等待中斷的到來
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //重裝初值
TL0=(65536-45872)%256;
num++; //num每加1次判斷一次是否到20次
if(num==20) //如果到了20次,說明1秒時間到
{
num=0;
i++; //num重新置數為0
}
if(i==10)
{i=0; // i超過9 就置為0
j++;
}
if(j==10)j=0 ; //j超過9 就置為0
}
D. 單片機c語言中斷程序
#include <reg51.h>
void init(void)//聲明中斷初始化
{ EA=1;//中斷總開關
EX0=1;//開中斷0開關。中斷1為,EX1=1;
IT1=1;//採用邊沿觸發,下降版沿有效。IT1=0為低電平觸權發中斷。
}
main()
{ init();調用中斷初始化函數
==
===主程序;
}
void in_0(void)interrupt 0//中斷服務函數
{ ==
==要服務的程序
}
E. 單片機用C語言編寫中斷的範例
定時器溢出中斷:
#include<reg51.h>
void timer0(void); //函數聲明
void main()
{
P1^1 = 0;
TMOD = 0x01; //定時模式
THO = 0xEE;
TL0 = 0xFF; //定時時間
ET0 = 1; //中斷允許
EA = 1; //總中斷使能
TR0 = 1; //開始計時
while(1); //等待中斷
}
void timer0(void) interrupt 1 using 0 //定時器0溢出中斷
{
TR0 = 0; //停止計時
P1^1 = ~P1^1; //取反輸出
THO = 0xEE;
TL0 = 0xFF; //重載定時時間
TR0 = 1; //開始計時
}
外部中斷:
#include<reg51.h>
void it0(void)
void main()
{
P^1.1 = 0;
IT0 = 0; //觸發方式
EX0 =1; //中斷允許
EA = 1; //中斷使能
while(1); //等待中斷
}
void it0(void) interrupt 0 using 1 //外部中斷0中斷處理程序
{
P1^1 = ~P1^1; //取反輸出
}
串口中斷:
#include<reg51.h>
void suart(void);
void main()
{
P1 = 0xAA;
TMOD = 0x20; //設置定時器1為自動重載模式,作為波特率發生器
TH1 = 0xXX; //由波特率計算出來的定時值
TL1 = 0xXX; //
SCON = 0x50; //串口模式
ES = 1; //開放串口中斷
EA = 1; //總中斷使能
TR1 = 1; //
while(1) //等待中斷
{
if(XXXX)
{
SBUF = 0xAA; //發送
}
}
}
void suart(void) interrupt 4 using 0
{
if(RI) //接受完臂
{
XXXXX;
}
if(TI) //發送完畢
{
XXXXX;
}
}
中斷矢量程序入口: void 函數名(形參) interrupt 中斷矢量 [using 寄存器]
F. 求89C51單片機外部中斷程序,C語言編寫。
方法類似,補寫程序如下:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED=P0^0;
sbit LED1=P0^1;
void delay1ms (uint z)
{
uint x,y;
for (x=z;x>0;x--)
for (y=110;y>0;y--);
}
void exter() interrupt 2
{
delay1ms(600);
LED=0;
delay1ms(200);
LED=1;
}
void exter0() interrupt 0
{
delay1ms(600);
LED1=1;
delay1ms(200);
LED1=0;
}
main()
{
EA=1; //開總中斷
EX1=1; //開外部中斷1
EX0=1; //開外部中斷0
IT1=0; //外部中斷邊沿觸發,下降沿觸發
IT0=0; //外部中斷0邊沿觸發,下降沿觸發
}
G. 單片機C語言中斷問題
你有個地方沒弄清楚。單片機執行的是機器碼,機器碼對應的是匯編指令。而C語言表述的句子,會編譯成若干匯編指令。就是說沒有C指令這一說,以51舉例,_nop_()對應匯編的NOP,但是一個簡單的a*b,編譯後可能長度就有好幾百位元組。
每條指令執行的周期不同。有些只要一個周期,有些需要幾個周期。中斷標志出現後,必須把當前執行的匯編指令執行完,才能響應中斷。
你的調用數組,也涉及到數據首地址,偏移量,讀寫數據等操作。這些操作是由好多個指令組合的。在這個過程中,產生中斷,會對數據有不可預知的影響。
如果要避免這個情況,只要調用這個數組前先關中斷。處理完數組後再開中斷就行了。
H. 51單片機簡單中斷C語言程序
首先你這問題不難,現在回答你這問題的難點在於你妹給出電路圖。
在此給出你程序的大體思路,
1、寫兩個子函數,一個是實現8個LED順序點亮的函數1,俗稱的流水燈,另一個是數碼管顯示「sos」的函數2
2、在主程序中去調用函數1,完了跟著檢測按鍵是否按下,檢測到按鍵後,調用函數1,完了多循環幾次函數2的調用來實現你的「顯示一段時間後返回LED順序點亮」
注意:按鍵檢測需要考慮去抖動的問題,寫的高大上一點,可以加入定時器,實現你的點亮一段時間。
望點贊,有問題在追加,還不會寫可以發電路圖出來再說
I. c語言怎麼編寫單片機的中斷
標准c語言沒有中斷調用機制,但是不同編譯器都有相應的中斷處理方式,可以使用戶實現中斷功能。
解決方案:
1、採取輪詢的方式解決,就是每10毫秒檢查一下是否有鍵盤請求,總的來說,這樣基本上可以解決問題,而且簡單易行,但每10毫秒都要檢查,系統消耗太大。
2、採取中斷的方式:
(1)用高級語言調用中斷來處理問題。中斷是cpu響應一個中斷外圍設備8259A的一個過程,當鍵盤敲擊,cpu保存斷點暫停執行並且跳到相應的中斷處理程序繼續執行,結束後根據斷點再跳回來。通過這種方式可以輕松+愉快地解決這個問題。但是需要用到高級語言調用匯編,根據編譯器的不同而有所差別。
(2)自己模擬中斷。可以另外建立一個線程專門響應鍵盤的敲擊,如果有敲擊則打斷主線程。這樣做實現起來很復雜,而且涉及到不少復雜的關鍵技術,比如信號量之類的東西。
3、強大的vc
vc採取了消息映射的機制來處理外部設備的請求,比如時鍾中斷、鍵盤中斷等等。通過此可以灰常灰常容易的處理外部中斷。
J. 單片機 C語言 中斷
TR0是控制T0時間中斷的。TR0=1,中斷開啟但並不是馬上中斷,要等寄存器版加到滿後才產生權中斷,執行中斷程序。執行完中斷程序內容後返回,等待下次中斷。一般不會關閉中斷。如果你只執行一次中斷那你就得寫一句TR0=0.