本文目錄一覽:
- 1、c語言怎麼編寫單片機的中斷
- 2、單片機C語言編程中延時函數和定時器中斷有何關係
- 3、C語言寫單片機的時候,怎麼寫定時中斷?
- 4、51單片機定時中斷C語言的寫法步驟,可追加分數
- 5、單片機定時器中斷問題(c語言)
- 6、用c語言寫51單片機定時器中斷判斷按鍵是否按下該怎麼寫? 我想實現的功
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