單片機c語言定時器中斷,單片機c語言定時器中斷怎麼解決

本文目錄一覽:

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

}

}

}

單片機C語言編程中延時函數和定時器中斷有何關係

延時函數(延時子程序)是主程序正常運行時執行的,

—主程序運行的時間即是延時函數的延時時間。

定時器中斷是在主程序中插入的事件,是在主程序的某個時間點,跳出主程序去執行定時器中斷要做的事情。

所以如果一個延時子程序不停地被中斷(包括定時器中斷或者其他中斷)打斷,

就沒有時間完成自身運行一次所需的那些語句。

等到它自身運行完一次,可能原定延時時間的很多倍已經過去了。

C語言寫單片機的時候,怎麼寫定時中斷?

給你上個較完整的程序,可以直接在KEIL中運行並觀察輸出

/******************************************************************************

功能: 本程序在12M晶振模式下,通過定時器中斷精確實現數字時鐘計時操作,並在KEIL

中實現輸出。時、分、秒的變化在定時中斷里處理。

說明: 因採用工作方式2,自動裝入初值,所以此程序計時很精確,只是在KEIL中模擬輸

出顯示的變化速度很快,這點可不理會

******************************************************************************/

#include reg52.h

#include stdio.h

#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

}

}

}

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語言)

我把你現在給出的這個程序的分析和調試了一下,並且我在裡面加入了一些代碼使能能夠通過串口輸出來觀察數據,,一開始是進入到xian1()中的,,就是你的顯示為0的這個函數中的,然後當nDataToDisplay200這個條件不滿足的時候,程序就開始進入xian()中,也就是你的顯示為9999的函數中,,,,然後又循環到一開始的狀態。

就函數已經在你指定的地方調用了,,,,如果有問題,,就要檢查你的顯示函數和相應硬體連接了。

用c語言寫51單片機定時器中斷判斷按鍵是否按下該怎麼寫? 我想實現的功

這個可以這樣實現:

#includereg51.h

#define uchar unsigned char

uchar time=0;

sbit key=P1^0;

void t0isr() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

time++;

}

main()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

ET0=1;

EA=1;

while(1)

{

while(key) // 如果按鍵未按下則執行循環

{

if(time100)break; //如果時間大於5秒,退出循環。

}

…………

}

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193250.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 15:00
下一篇 2024-12-01 15:00

相關推薦

  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論