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

定時中斷一秒c語言編碼

發布時間: 2022-05-04 05:17:49

❶ 單片機c語言編寫產生1秒定時的程序,怎麼寫

如果是51單片機的話其實很簡單的,這里假設晶振頻率是12M(一般都是的),你可以選用定時器0,工作在工作狀態2,因為這個狀態下裝入初始值幾乎不需要時間,所以定時精確,也就是8位預置數狀態,將初始值設為6,這樣每次定時就是250微秒,在中斷程序中定義一個靜態變數,每次中斷加一,這樣當這個變數值為4000時就剛好是1S鍾。
關鍵程序是:
void main()
{
TMOD=OX02;
EA=1;
ET0=1;
TH0=0X06;
TL0=0X06;
while(1);
}
void timer0() interrupt 1
{
static unsigned int times=0;
times++;
if(times==4000)
{
times=0;
//自己的程序
}}

❷ 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;
//低八位裝入初值}

❸ 單片機C語言一秒定時程序詳解

幾M晶振
-----------------------------------
如果是12M晶振的話,那麼定時器一個計數頻率是12M / 12 = 1M,即一個計數周期是1us。

你給的程序看出,是定時器工作在MODE1。16位計數器。但是你給的程序應該有問題。
一個是TL0 = - 5000 / 256,應該是TL0 = - 5000 % 256;
另一個是if(BUFFER[0]==100),應該是if(BUFFER[0]==200)。

首先你要懂定時計數器原理,51是累加型,MODE1的上限是0xFFFF,即代表可計65535個數。這里程序想計5000個數(5000us),那麼TH和TL組成的16位初值應該是60535。要表示這個數,可分兩步理解,其一,5000表示成高低位元組的兩個8位數,高位元組為5000 / 256(整數)= 19 = 0x13,低位元組為5000 % 256(余數)= 136 = 0x88,結果是5000的16進製表示就是0x1388;其二,65535 - 5000 = 0xFFFF - 0x1388,相當於對0x1388取負。所以就有了TH0 = - 5000 / 256;TL0 = - 5000 % 256;

第二,如上分析,一個中斷就是5ms,那麼,在中斷內部就要判斷BUFFER[0]是否到達200,而不是100。如果到了,CIRCLE就向左移一位,然後BUFFER[1]加1,表示增加1秒,同時判斷BUFFER[1]是否到60,如果是60就清零。

這小部分代碼,還不能說清CIRCLE的具體作用,可能是用來點亮小燈的吧,移一位,小燈也移一次。

不知這樣的回答滿意不?
www.donald.net.cn

❹ C語言定時中斷程序

你可以在蜂鳴器子程序中的while(1)內加一個按鍵掃描程序,如果掃描到撤警鍵可以跳出這個while(1)死循環,可以用go
to函數(出錯的可能性要大一些,但一般也沒事)。或者你把while(1)改成while(key);key為一個變數,外界可以將key置1(調用蜂鳴器),當蜂鳴器內部掃描到撤警鍵後將key置0,這樣也可以跳出這個循環。要不你就把程序直接發出來,幫你
改一下

❺ 單片機 定時器 中斷(用C語言寫的)

樓上的回答都沒明白樓主問題的意思。
其實樓主你這個問題很好辦的。
我不知道樓主您用的是什麼編輯器,如果使用Keil的話。你先編寫好你的中斷函數,然後按「Debug」進入調試模式,在調試模式下,編輯框右邊會有一個列表顯示當前寄存器的值和所有變數的值。
這個列表最下面有一個「sec」,它的值就是顯示程序執行的時間(以秒為單位的)。

這個時候,你只要把PC指針指向中斷服務程序的第一條語句,然後在中斷服務程序的最後一條語句設置一個斷點,然後按"run"全速運行一次中斷服務程序,再看看「sec」顯示的是多少。

❻ 求高手用C語言寫一下89C51單片機內部定時器中斷典型運用

說一下思路吧,使用兩個定時器(T0和T1),T0為P0.0的接的LED定時,T1為P0.1接LED定時,需要兩個變數led1_time和led2_time來計時(單位是秒),然後分別根據LED的狀態來判斷led1_time(或led2_time)需要計多少秒,按照你的要求,LED1(P0.0)亮時led1_time需要計時3秒,LED1滅時led1_time需要計時7200秒,即兩個小時,對於LED2(P0.1)也是一樣的道理。那麼,廢話說完了,接下來看代碼吧!!!

#include<reg51.h>

typedefunsignedcharuint8;
typedefunsignedintuint16;

sbitled1=P0^0;
sbitled2=P1^1;

staticuint16led1_time=0x00;
staticuint8led2_time=0x00;
staticuint8led1_a_second=0x00;
staticuint8led2_a_second=0x00;

#defineA_SECOND(0x14)/*定時50ms,20中斷得一秒鍾*/
#defineTH_VALUE(0x3c)/*定時器溢出值,高位*/
#defineTL_VALUE(0xb0)/*定時器溢出值,地位*/
#defineLED1_ON_TIME(0x03)/*LED1亮3秒*/
#defineLED2_ON_TIME(0x01)/*LED2亮1秒*/
#defineLED1_OFF_TIME(0x1c20)/*LED1滅7200秒,兩個小時*/
#defineLED2_OFF_TIME(0x02)/*LED2滅2秒*/

#defineLED_ON1/*高電平LED亮*/
#defineLED_OFF0/*低電平LED滅*/
/*
*初始化定時器函數
*/
staticvoidinit_time(void){

TMOD=0x11;/*使用T0、T1兩個定時器,均選擇模式1,定時模式*/
TH0=TH_VALUE;
TL0=TL_VALUE;
TH1=TH_VALUE;
TL1=TL_VALUE;
ET0=1;/*允許T0中斷*/
ET1=1;/*允許T1中斷*/
EA=1;/*打開總中斷*/
TR0=1;/*開啟定時器T0*/
TR1=1;/*開啟定時器T1*/
}

voidmain(void){

led1=LED_ON;/*上電點亮LED1、LED2*/
led2=LED_ON;

init_time();/*初始化定時器*/

while(1){
/*
*檢測LED1狀態,如果LED1處於亮的狀態,
*那麼3秒後熄滅LED1;如果LED1是滅的,
*那麼兩個小時後點亮LED1。
*/
if(led1==LED_ON){

if(led1_time>=LED1_ON_TIME){

led1_time=0x00;
led1=LED_OFF;
}
}elseif(led1==LED_OFF){

if(led1_time>=LED1_OFF_TIME){

led1_time=0x00;
led1=LED_ON;
}
}
/*
*檢測LED2狀態,如果LED2處於亮的狀態,
*那麼1秒後熄滅LED2;如果LED2是滅的,
*那麼2秒後點亮LED2。
*/
if(led2==LED_ON){

if(led2_time>=LED2_ON_TIME){

led2_time=0x00;
led2=LED_OFF;
}
}elseif(led2==LED_OFF){

if(led2_time>=LED2_OFF_TIME){

led2_time=0x00;
led2=LED_ON;
}
}
}

}
/*
*T0定時器中斷向量值為1,中斷地址為0x000b
*/
voidP0_0_timing(void)interrupt1{

TH0=TH_VALUE;
TL0=TL_VALUE;
/*
*如果計時滿1秒,則led1_time加一,
*led1_time的單位是秒。
*/
led1_a_second++;
if(led1_a_second>=A_SECOND){

led1_a_second=0x00;
led1_time++;
}
}
/*
*T1定時器中斷向量值為3,中斷地址為0x001b
*/
voidP0_1_timing(void)interrupt3{

TH1=TH_VALUE;
TL1=TL_VALUE;
/*
*如果計時滿1秒,則led2_time加一,
*led2_time的單位是秒。
*/
led2_a_second++;
if(led2_a_second>=A_SECOND){

led2_a_second=0x00;
led2_time++;
}
}

有用點一下採納,謝謝!

❼ c語言編程怎樣中斷一秒鍾

clock_t start = clock();
while (clock() - start < CLOCKS_PER_SEC) { }



clock_t end = clock () + CLOCKS_PER_SEC ;
while (clock() < end) { }

❽ 求單片機一秒延時程序(12M晶振),要用C語言且用定時和中斷

我以前寫的控制跑馬燈的程序,有1s定時,也有中斷,
根據需要修改修改就可以了。
#include<reg51.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
void
delay(uchar
uu);
main()
{
EA=1;
EX0=1;//開總中斷和外部中斷0;
EX1=1;//開中斷1?
ET0=1;
PX0=1;
PX1=1;
IT0=1;
IT1=1;
while(1)
{
P2=0;
delay(20);
P2=0xff;
delay(20);
}
}
void
int1()
interrupt
0
using
2
{
uchar
aa,i,j,k;
i=0xfe;
for(aa=0;aa<4;aa++)
{
P2=i;
j=i>>7;
k=i<<1;
i=k|j;
delay(20);
}
}
void
int2()
interrupt
2
using
3
{
uchar
bb,ii,jj,kk;
ii=0x7f;
for(bb=0;bb<4;bb++)
{
P2=ii;
jj=ii<<7;
kk=ii>>1;
ii=kk|jj;
delay(20);
}
}
void
delay(uchar
uu)
//uu*5ms定時;
{
uchar
aaa;
for(aaa=0;aaa<uu;aaa++)
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(!TF0);
TF0=0;
}
}

❾ c語言中斷1秒怎麼算

一般利用定時器溢出中斷進行計算。1S/機器周期(執行一次nop所需時間) =(定時器最大值-初始值)。定時器最大值根據你使用的定時器位寬而定,一般51系列的只有16位,如果按每個機器周期為1us時計算的話,則定時器需要執行的次數大於了定時器的最大值,此時需要操作定時器進行多次中斷進行累計,如可進行每10ms中斷一次,連續執行100次後就達到了你所需要的1s的要求了。

❿ 單片機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();
}