當前位置:首頁 » 編程語言 » c語言定時器中斷程序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言定時器中斷程序

發布時間: 2022-12-20 09:53:16

1. 51單片機c語言對流水燈編程,用定時中斷做

#include<reg52.h>
#defineucharunsignedchar
ucharm=0,i=0;
voidmain()
{
TMOD|=0x01;//定時器0工作方式為1
TH0=(65536-50000)/256;//裝初值
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器中斷
TR0=1;//開啟定時器

while(1);//等待中斷

}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
m++;
if(m==5)//12M晶振定時5*50MS=250MS
{
m=0;
P1=~(0X01<<i);//P1接8個LED
if(++i==8)
i=0;
}
}

[補充]

延時函數是一種粗略計算延時時間的函數
是通過讓單片機執行空指令,達到等待延時的目的。
經常被應用在對延時時間要求不太嚴格的場合。
而定時器中斷,則是通過對晶振時鍾進行計數
由於晶振的頻率一般是很穩定的,所以晶振的脈沖頻率基本穩定
從而通過對脈沖進行計數即可得到准確的延時目的。
中斷延時函數和定時器中斷延時沒有明確的對應關系。
主要是根據你的應用場合來確定使用哪種函數。

2. 單片機C語言定時中斷LED燈程序求修改

#include<reg52.h>
sbit P00=P0^0;
sbit key=P1^0;
unsigned int i=0;
void main(void)
{
TMOD=0x10;//設定定時器的工作模式為定時器1方式1
TH1=15536/256;//向定時器裝入初值高八位
TL1=15536%256;//向定時器裝入初值低八位
EA=1;//開總開關
ET1=1;//開分開關
TR1=1;//啟動定時器
while(1)
{
if(key==0)TR1=0;

else TR1=1;

}
}
void t1(void) interrupt 3//定時器0服務函數
{
TH1=15536/256;//向定時器裝入初值高八位
TL1=15536%256;//向定時器裝入初值低八位

if(++i==30)//延時1.5S
{
i=0;
P00=~P00;//閃爍
}
}

3. 定時器1中斷刷新,從999999~0倒計時,求C語言程序

這個和代碼順序有關系:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while
(1)
{
if
(flag1s
==
1)
//判斷1秒定時標志
{
flag1s
=
0;
//1秒定時標志清零
sec--;
//秒計數自減1【這里是先減一,後面再送顯示】
//將sec按十進制位從低到高依次提取到buf數組中
buf[0]
=
sec%10;
buf[1]
=
sec/10%10;
buf[2]
=
sec/100%10;
buf[3]
=
sec/1000%10;
buf[4]
=
sec/10000%10;
buf[5]
=
sec/100000%10;
//從最高為開始,遇到0不顯示,遇到非0退出循環
}
}
如果初值要改為999999,代碼可以改成如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while
(1)
{
if
(flag1s
==
1)
//判斷1秒定時標志
{
flag1s
=
0;
//1秒定時標志清零
//
sec--;
//秒計數自減1【屏蔽】
//將sec按十進制位從低到高依次提取到buf數組中
buf[0]
=
sec%10;
buf[1]
=
sec/10%10;
buf[2]
=
sec/100%10;
buf[3]
=
sec/1000%10;
buf[4]
=
sec/10000%10;
buf[5]
=
sec/100000%10;
sec--;
//秒計數自減1【這里是先送顯示,後面再減一】
//從最高為開始,遇到0不顯示,遇到非0退出循環
}
}

4. 單片機定時器中斷問題(c語言)

我把你現在給出的這個程序的分析和調試了一下,並且我在裡面加入了一些代碼使能能夠通過串口輸出來觀察數據,,一開始是進入到xian1()中的,,就是你的顯示為0的這個函數中的,然後當nDataToDisplay<200這個條件不滿足的時候,程序就開始進入xian()中,也就是你的顯示為9999的函數中,,,,然後又循環到一開始的狀態。
就函數已經在你指定的地方調用了,,,,如果有問題,,就要檢查你的顯示函數和相應硬體連接了。

5. C語言的中斷函數做定時器

使用c++編譯器,就要求中斷函數的形參用...填充。非c++編譯器就不用形參。這個不用深追究為什麼,只要這樣用就可以了。

6. 51單片機定時中斷C語言的寫法步驟,可追加分數

程序說明:51單片機定時器0工作於方式一,定時50ms中斷一次
晶振為12M
#include

void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
ET0
=
1;
//開定時器0中斷
EA
=
1;
//開總中斷
TR0
=
1;
//啟動定時器0
while(1)
{

}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
}
/***************************************************************************************************************/
上面是比較好理解的。如果實在要求簡潔的話,看下面的,跟上面功能一樣
#include

void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值
IE
=
0x82;//開總中斷並開定時器0中斷
TR0
=
1;
//啟動定時器0
while(1)
{

}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值}

7. 單片機C語言編程如何實現定時器中斷1s編程

以下是一個實時時鍾的程序,裡麵包含有1S定時器,你也可以使用延時程序,但是不精確
/*備註:按鍵一為功能鍵,按一下調年,按兩下調月,按三下調日,按四下調時,按五下調分*/
/* 按六下退出,或者在任何時候按鍵四退出設定狀態。在設定狀態鍵二加一,鍵三減一*/
/* 鍵四退出,正常狀態鍵二顯示年,鍵三顯示月日,鍵四顯示星期和秒*/
/* 星期根據日期計算得出,其已全部調試通過,為了時間精確,要調一個誤差值*/

#include<reg2051.h>
#include<stdio.h>
#include<absacc.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar code led_xs[12]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff,0xfd};
uchar data led_data[4];
volatile uchar data a; //定義按鍵一志標
volatile uchar data month=4; //定義月並賦初值
volatile uchar data date=29; //定義日並賦初值
volatile uchar data week; //定義星期並賦初值
volatile uchar data hour; //定義時
volatile uchar data min; //定義分
volatile uchar data sec=0; //定義秒
volatile uint data zn=0; //定義中間存儲變數
volatile uint data year=2007; //定義年並賦初值

sbit md=P3^7; //定義秒點
sbit k1=P1^0; //定義按鍵一
sbit k2=P1^1; //定義按鍵二
sbit k3=P1^2; //定義按鍵三
sbit k4=P1^3; //定義按鍵四
sbit hs=P1^4; //定義顯示片選信號一
sbit hg=P1^5; //定義顯示片選信號二
sbit ms=P1^6; //定義顯示片選信號三
sbit mg=P1^7; //定義顯示片選信號四
bit sans; //定義閃爍標志
bit b; //定義按鍵二標志
bit c; //定義按鍵三標志
bit w; //定義按鍵四標志
bit x; //定義24小時到標志
bit y; //定義日期加一標志

keyscan(); //申明鍵盤掃描函數
void display(); //申明顯示函數
void chushihua(void); //申明初始化函數
void delay_10ms(void); //申明10ms延時函數
dateadd(); //申明日期加函數
datesub(); //申明日期減函數
weekjs(); //星期計算函數

void main(void)
{
weekjs(); //計算初值星期幾
x=y=0; //日期加初始化
chushihua(); //調初始化函數,初始化定時器,中斷
do{
keyscan(); //鍵盤掃描
display(); //調用顯示函數
if((!y)==x)dateadd(); //判斷是否有24小時,有就調用日期加函數
}
while(1); //先調用顯示鍵盤
}

void chushihua(void) //初始化函數
{
TMOD=0x02; //定時器0以方式2工作,自動重裝初值
IE=0x82; //開總中斷和TO中斷
TH0=0x06; //T0高位置初值
TL0=0x06; //T0低位置初值
TR0=1; //啟動TO
}

timer0 () interrupt 1 //T0中斷函數
{
if(zn<4000){zn++;if(zn==2000)sans=!sans;}
else {zn=0;sec++;sans=!sans;
if(sec==60){sec=0;min++;
if(min==60){min=0;hour++;
if(hour==24){hour=0;x=!x;}
}
}
}
}

void display()
{
uchar k;
uint d;
uchar e;
SCON=0x00;
P1=0x0f;
if((a!=0)&&sans){
led_data[3]=10;
led_data[2]=10;
led_data[1]=10;
led_data[0]=10;
}
else {
switch(a){
case 0 :led_data[3]=hour/10;
led_data[2]=hour%10;
led_data[1]=min/10;
led_data[0]=min%10;
break;
case 1 :led_data[3]=year/1000;
d=year%1000;
led_data[2]=d/100;
e=d%100;
led_data[1]=e/10;
led_data[0]=e%10;
break;
case 2 :led_data[3]=month/10;
led_data[2]=month%10;
led_data[1]=10;
led_data[0]=10;
break;
case 3 :led_data[3]=10;
led_data[2]=10;
led_data[1]=date/10;
if(led_data[1]==0)led_data[1]=10;
led_data[0]=date%10;
break;
case 4 : led_data[3]=hour/10;
led_data[2]=hour%10;
led_data[1]=10;
led_data[0]=10;
md=0;
break;
case 5 : led_data[3]=10;
led_data[2]=10;
led_data[1]=min/10;
led_data[0]=min%10;
md=0;
break;
default: break;
}
}
if(b){
led_data[3]=year/1000;
d=year%1000;
led_data[2]=d/100;
e=d%100;
led_data[1]=e/10;
led_data[0]=e%10;
}
else if(c){
led_data[3]=month/10;
led_data[2]=month%10;
led_data[1]=date/10;
if(led_data[1]==0)led_data[1]=10;
led_data[0]=date%10;
}
else if(w){
led_data[3]=week;
led_data[2]=11;
led_data[1]=sec/10;
led_data[0]=sec%10;
}
if((led_data[3]==0)&&(!w))led_data[3]=10;
k=led_data[3];
SBUF=led_xs[k];
while(!TI){}
TI=0;
hs=1;
for(k=0;k<255;k++){_nop_();_nop_();_nop_();}
hs=0;

k=led_data[2];
SBUF=led_xs[k];
while(!TI){}
TI=0;
hg=1;
for(k=0;k<255;k++){_nop_();_nop_();_nop_();}
hg=0;

k=led_data[1];
SBUF=led_xs[k];
while(!TI){}
TI=0;
ms=1;
for(k=0;k<255;k++){_nop_();_nop_();_nop_();}
ms=0;

k=led_data[0];
SBUF=led_xs[k];
while(!TI){}
TI=0;
mg=1;
for(k=0;k<255;k++){_nop_();_nop_();_nop_();}
mg=0;

if(!(a||b||c||w)){
SBUF=0xff;
while(!TI){}
TI=0;
ms=1;
mg=1;
md=sans;
for(k=0;k<255;k++){_nop_();_nop_();}
P1=0x0f;
md=1;
}
}

keyscan()
{
uchar key_value,reread_key;
P1=0x0f;
key_value=P1&0x0f;
if(key_value!=0x0f){
delay_10ms();
reread_key=P1&0x0f;
if(key_value==reread_key){
switch(key_value){
case 0x0e : if(!(b||c||w)){a++;if(a==6)a=0;}
else b=c=w=0;
break;
case 0x0d : switch(a){
case 0 : b=!b;c=w=0;break;
case 1 : year++;break;
case 2 : if(month<12)month++;else month=1;break;
case 3 : dateadd();break;
case 4 : hour++;if(hour==24)hour=0;break;
case 5 : min++;if(min==60)min=0;break;
default: break;
}
break;
case 0x0b : switch(a){
case 0 : c=!c;b=w=0;break;
case 1 : year--;break;
case 2 : month--;if(month==0)month=12;break;
case 3 : datesub();break;
case 4 : hour--;if(hour==0xff)hour=23;break;
case 5 : min--;if(min==0xff)min=59;break;
default: break;
}
break;
case 0x07 : if(a==0){w=!w;b=c=0;}
else{a=0;b=c=w=0;}
break;
default : break;
}
P1=0x0f;
reread_key=P1&0x0f;
while(key_value==reread_key){
reread_key=P1&0x0f;
display();
}
}
}
}

void delay_10ms(void)
{
uchar o,p,q;
for(o=5;o>0;o--)
for(p=4;p>0;p--)
for(q=248;q>0;q--);
}

datesub()
{
switch(month){
case 1 : date--;if(date==0) date=31;break;
case 2 : date--;if(((year%4==0)&&(date==0))==1)date=29;
else if(date==0) date=28;break;
case 3 : date--;if(date==0) date=31;break;
case 4 : date--;if(date==0) date=30;break;
case 5 : date--;if(date==0) date=31;break;
case 6 : date--;if(date==0) date=30;break;
case 7 : date--;if(date==0) date=31;break;
case 8 : date--;if(date==0) date=31;break;
case 9 : date--;if(date==0) date=30;break;
case 10: date--;if(date==0) date=31;break;
case 11: date--;if(date==0) date=30;break;
case 12: date--;if(date==0) date=31;break;
default: break;
}
weekjs();
}

weekjs()
{
uchar c,m,wk,pd,yz;
uint y,p;
if(month==1){m=13;y=year-1;}
else if(month==2){m=14;y=year-1;}
else {y=year;m=month;}
c=y/100;
yz=y%100;
wk=2*c+1;
p=26*(m+1);
pd=p/10;
pd=pd+yz+(yz/4)+(c/4)+date;
if(pd>wk)week=(pd-wk)%7;
else if(pd<wk){week=(7-((wk-pd)%7));if(week==7)week=0;}
else week=0;
}

dateadd()
{
switch(month){
case 1 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 2 : date++;if(((year%4==0)&&(date==30))==1){date=1;if(a!=3)month++;}
else if(date==29){date=1;if(a!=3)month++;}break;
case 3 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 4 : date++;if(date==31){date=1;if(a!=3)month++;}break;
case 5 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 6 : date++;if(date==31){date=1;if(a!=3)month++;}break;
case 7 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 8 : date++;if(date==32){date=1;if(a!=3)month++;}break;
case 9 : date++;if(date==31){date=1;if(a!=3)month++;}break;
case 10: date++;if(date==32){date=1;if(a!=3)month++;}break;
case 11: date++;if(date==31){date=1;if(a!=3)month++;}break;
case 12: date++;if(date==32){date=1;if(a!=3)month++;}break;
default: break;
}
if(month==13){month=1;year++;}
y=x;
weekjs();
}

8. 求教一個簡單的C語言定時器中斷程序

每中斷一次,程序就會執行一次中斷程序,也就是會執行「void t0_rpt() interrupt 1」這個程序

9. c語言怎麼編寫單片機的中斷

標准c語言沒有中斷調用機制,但是不同編譯器都有相應的中斷處理方式,可以使用戶實現中斷功能。
解決方案:
1、採取輪詢的方式解決,就是每10毫秒檢查一下是否有鍵盤請求,總的來說,這樣基本上可以解決問題,而且簡單易行,但每10毫秒都要檢查,系統消耗太大。
2、採取中斷的方式:
(1)用高級語言調用中斷來處理問題。中斷是cpu響應一個中斷外圍設備8259A的一個過程,當鍵盤敲擊,cpu保存斷點暫停執行並且跳到相應的中斷處理程序繼續執行,結束後根據斷點再跳回來。通過這種方式可以輕松+愉快地解決這個問題。但是需要用到高級語言調用匯編,根據編譯器的不同而有所差別。
(2)自己模擬中斷。可以另外建立一個線程專門響應鍵盤的敲擊,如果有敲擊則打斷主線程。這樣做實現起來很復雜,而且涉及到不少復雜的關鍵技術,比如信號量之類的東西。
3、強大的vc
vc採取了消息映射的機制來處理外部設備的請求,比如時鍾中斷、鍵盤中斷等等。通過此可以灰常灰常容易的處理外部中斷。