51單片機C語言中斷程序 定時/計數器

2021-02-23 單片機系列

#include<reg52.h> 

#include <intrins.h> 

#define uchar unsigned char 

#define uint unsigned int 

sbit led1=P2^0; 

 

uchar SerialV

alue; 

 

 

//

串口接收到的值

uchar i; 

 

void main() 

 

smglk=0; 

 

smgbitlk=0; 

 

ledlk=1; 

 

// Serial Port Setting  

 

TMOD=0x21; 

//

設定定時器為方式

可自動再裝入的定時器

 

 

SM0=0; 

 

//

設定串口工作方式

 

10

位異步收發器

 

 

8

位數據

 

 

SM1=1; 

 

//

設定串口工作方式

 

10

位異步收發器

 

 

8

位數據

 

 

TH1=0xfd;//

裝入初值

 

 

TL1=0xfd; //

裝入初值

 

 

PCON=0x00; 

//

設定串行口波特率

 

 

REN=1; 

 

//

允許串行接收位。

REN=1

,啟動接收數據;

REN=0

,禁止接收。

 

 

IP=0x10; 

 

TH0=(65535-50000)/256; 

 

TL0=(65535-50000)%256; 

 

 

TR0=1; 

 

//

啟用

T0

定時器

/

計數器

 

 

ET0=1; 

 

//T0

定時器中斷開關;

(

 

 

TR1=1; 

 

//

啟用

T1

定時器

/

計數器

 

 

ET1=1; 

 

//T1

定時器中斷開關;

(

 

ES=1; 

 

//

串行中斷開關;

(

 

EA=1; 

 

//

總中斷開關;

(

 

SerialV

alue=0x02; 

 

while(1) 

 

 

 

//

串口中斷

 

void serial() interrupt 4 

 

SerialV

alue=SBUF; 

 

 

 

RI=0; 

 

 

void timer0() interrupt 1 

 

 

TH0=(65535-50000)/256; 

 

TL0=(65535-50000)%256; 

 

i++; 

 

if(i>SerialV

alue) 

 

 

 

i=0; 

 

 

led1=!led1; 

 

#include<reg52.h> 

#include <intrins.h> 

#define uchar unsigned char 

#define uint unsigned int 

sbit led1=P2^0; 

 

uchar SerialV

alue; 

 

 

//

串口接收到的值

uchar i; 

 

void main() 

 

smglk=0; 

 

smgbitlk=0; 

 

ledlk=1; 

 

// Serial Port Setting  

 

TMOD=0x21; 

//

設定定時器為方式

可自動再裝入的定時器

 

 

SM0=0; 

 

//

設定串口工作方式

 

10

位異步收發器

 

 

8

位數據

 

 

SM1=1; 

 

//

設定串口工作方式

 

10

位異步收發器

 

 

8

位數據

 

 

TH1=0xfd;//

裝入初值

 

 

TL1=0xfd; //

裝入初值

 

 

PCON=0x00; 

//

設定串行口波特率

 

 

REN=1; 

 

//

允許串行接收位。

REN=1

,啟動接收數據;

REN=0

,禁止接收。

 

 

IP=0x10; 

 

TH0=(65535-50000)/256; 

 

TL0=(65535-50000)%256; 

 

 

TR0=1; 

 

//

啟用

T0

定時器

/

計數器

 

 

ET0=1; 

 

//T0

定時器中斷開關;

(

 

 

TR1=1; 

 

//

啟用

T1

定時器

/

計數器

 

 

ET1=1; 

 

//T1

定時器中斷開關;

(

 

ES=1; 

 

//

串行中斷開關;

(

 

EA=1; 

 

//

總中斷開關;

(

 

SerialV

alue=0x02; 

 

while(1) 

 

 

 

//

串口中斷

 

void serial() interrupt 4 

 

SerialV

alue=SBUF; 

 

 

 

RI=0; 

 

 

void timer0() interrupt 1 

 

 

TH0=(65535-50000)/256; 

 

TL0=(65535-50000)%256; 

 

i++; 

 

if(i>SerialV

alue) 

 

 

 

i=0; 

 

 

led1=!led1; 

 

#include<reg52.h> 

#include <intrins.h> 

#define uchar unsigned char 

#define uint unsigned int 

sbit led1=P2^0; 

 

uchar SerialV

alue; 

 

 

//

串口接收到的值

uchar i; 

 

void main() 

 

smglk=0; 

 

smgbitlk=0; 

 

ledlk=1; 

 

// Serial Port Setting  

 

TMOD=0x21; 

//

設定定時器為方式

可自動再裝入的定時器

 

 

SM0=0; 

 

//

設定串口工作方式

 

10

位異步收發器

 

 

8

位數據

 

 

SM1=1; 

 

//

設定串口工作方式

 

10

位異步收發器

 

 

8

位數據

 

 

TH1=0xfd;//

裝入初值

 

 

TL1=0xfd; //

裝入初值

 

 

PCON=0x00; 

//

設定串行口波特率

 

 

REN=1; 

 

//

允許串行接收位。

REN=1

,啟動接收數據;

REN=0

,禁止接收。

 

 

IP=0x10; 

 

TH0=(65535-50000)/256; 

 

TL0=(65535-50000)%256; 

 

 

TR0=1; 

 

//

啟用

T0

定時器

/

計數器

 

 

ET0=1; 

 

//T0

定時器中斷開關;

(

 

 

TR1=1; 

 

//

啟用

T1

定時器

/

計數器

 

 

ET1=1; 

 

//T1

定時器中斷開關;

(

 

ES=1; 

 

//

串行中斷開關;

(

 

EA=1; 

 

//

總中斷開關;

(

 

SerialV

alue=0x02; 

 

while(1) 

 

 

 

//

串口中斷

 

void serial() interrupt 4 

 

SerialV

alue=SBUF; 

 

 

 

RI=0; 

 

 

void timer0() interrupt 1 

 

 

TH0=(65535-50000)/256; 

 

TL0=(65535-50000)%256; 

 

i++; 

 

if(i>SerialV

alue) 

 

 

 

i=0; 

 

 

led1=!led1; 

 

實用乾貨下載:關注我們「單片機系列」,回復「資料」獲取單片機相關資料。一起走向智能工業革命時代,單片機DIY、基於c語言/彙編的編程。持續更新中······

51單片機C語言中斷程序 定時/計數器 


利用定時/計數器T0從P1.0輸出周期為1s 的方波,程序一

讓發光二極體以1HZ閃爍,
#include<reg52.h>  //52單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#define uint unsigned int    //宏定義
#define uchar unsigned char  //宏定義
sbit P1_0=P1^0;
uchar tt;
void main()      //主函數
{
TMOD=0x01;//設置定時器0為工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
while(1);//等待中斷產生

}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
 tt=0;
 P1_0=~P1_0;
}
}

 

程序二

利用定時/計數器T1產生定時時鐘,
由P1口控制8個發光二極體,
使8個指示燈依次一個一個閃動,
閃動頻率為10次/秒(8個燈依次亮一遍為一個周期),循環。
#include<reg52.h>  //52單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#define uint unsigned int    //宏定義
#define uchar unsigned char  //宏定義
sbit P1_0=P1^0;
uchar tt,a;
void main()      //主函數
{
TMOD=0x01;//設置定時器0為工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
a=0xfe;
while(1);//等待中斷產生

}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==2)
{
 tt=0;
 P1=a;
 a=_crol_(a,1);
}
}

 

程序三

 同時用兩個定時器控制蜂鳴器發聲,
定時器0控制頻率,定時器1控制同個
頻率持續的時間,間隔2s依次輸出
1,10,50,100,200,400,800,
1k(hz)的方波

#include<reg52.h>  //52單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#define uint unsigned int    //宏定義
#define uchar unsigned char  //宏定義
sbit beep=P2^3;
uchar tt;
uint fre,flag;

void main()      //主函數
{
fre=50000;
beep=0;
TMOD=0x11;//設置定時器0,定時器1為工作方式1
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
ET1=1;
TR1=1;
TR0=1;//啟動定時器0
while(1);//等待中斷產生

}

void timer0() interrupt 1   //定時器0中斷
{
TR0=0;    //進中斷後先把定時器0中斷關閉,防止內部程序過多而造成中斷丟失
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
tt++;
if(flag<40)    //以下幾個if分別用來選取不同的頻率
 if(tt==10)
  {
   tt=0;
   fre=50000;
   beep=~beep;
  }
if(flag>=40&&flag<80)
 {
  tt=0;
  fre=50000;
  beep=~beep; 
 }
if(flag>=80&&flag<120)
 {
  tt=0;
  fre=10000;
  beep=~beep; 
 }
if(flag>=120&&flag<160)
 {
  tt=0;
  fre=5000;
  beep=~beep; 
 }
if(flag>=160&&flag<200)
 {
  tt=0;
  fre=2500;
  beep=~beep; 
 }
if(flag>=200&&flag<240)
 {
  tt=0;
  fre=1250;
  beep=~beep; 
 }
if(flag>=240&&flag<280)
 {
  tt=0;
  fre=625;
  beep=~beep; 
 }
if(flag>=280&&flag<320)
 {
  tt=0;
  fre=312;
  beep=~beep; 
 }
if(flag>=320&&flag<360)
 {
  tt=0;
  fre=156;
  beep=~beep; 
 }
TR0=1;
}
void timer1() interrupt 3  //定時器1中斷用來產生2秒時間定時
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
flag++;
if(flag==360)
  {
    flag=0;
    fre=50000;
  }
}

 

程 序四

用 定時器以間隔500MS在6位數碼管上依次顯示
0、1、2、3....C、D、E、F,重複。

#include<reg52.h>  //52單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#define uint unsigned int    //宏定義
#define uchar unsigned char  //宏定義
sbit dula=P2^6;       //數碼管段選鎖存端
sbit wela=P2^7;       ////數碼管位選鎖存端
uchar num,tt;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{
num=0;
tt=0;
TMOD=0x01;//設置定時器0為工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
dula=1;
P0=0x3f;  //給段開始送顯示0。
dula=0;//關閉段選鎖存端,防止開始時出現亂碼。
wela=1;//11101010
P0=0xc0; // 打開六個數碼管位選
wela=0;
while(1)
{
 if(tt==10)   //每進入10次中斷即為500ms,執行一次顯示變化。
    {
   tt=0;
   num++;
   if(num==16)
   num=0;
   dula=1;
   P0=table[num];
   dula=0; 
  }
}
}


void exter0() interrupt 1    // 定時器0中斷
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}

 


 長按識別圖中二維碼關注我們

單片機系列

  看完的同時,請分享到朋友圈

  每天更新單片機各種知識,電子

  製作DIY,及電子行業最新資訊

                   衷心的感謝您的支持

相關焦點

  • [原創圖書]51單片機C語言基礎程序設計
    51單片機C語言基礎程序設計,是知創學院Jason大學期間學習51單片機時總結整理的一本51單片機C語言程序設計的基礎入門圖書
  • 51單片機入門基礎教程
    定時器和計數器定時/計數器的結構和工作原理一、定時/計數器的結構定時/計數器的實質是加1計數器(16位),由高8位和低8位兩個寄存器組成。TMOD是定時/計數器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制T0、T1的啟動和停止及設置溢出標誌。
  • MCS-51單片機內部結構
    8051單片機包含中央處理器、程序存儲器(ROM)、數據存儲器(RAM)、定時/計數器、並行接口、串行接口和中斷系統等幾大單元及數據總線、地址總線和控制總線等三大總線,現在我們分別加以說明:中央處理器:中央處理器(CPU)是整個單片機的核心部件,是8位數據寬度的處理器,能處理8位二進位數據或代碼,CPU負責控制、指揮和調度整個單元系統協調的工作
  • 51單片機存儲器詳解
    8051片內有4kB的程序存儲單元,其地址為0000H—0FFFH,單片機啟動復位後,程序計數器的內容為0000H,所以系統將從0000H單元開始執行程序。另一組特殊單元是0003H—002AH,這40個單元各有用途,它們被均勻地分為五段,它們的定義如下:0003H—000AH 外部中斷0中斷地址區。000BH—0012H 定時/計數器0中斷地址區。0013H—001AH 外部中斷1中斷地址區。001BH—0022H 定時/計數器1中斷地址區。
  • 51單片機寄存器功能一覽表
    在51單片機內部有一個CPU用來運算、控制,有四個並行I/O口,分別是P0、P1、P2、P3,有ROM,用來存放程序,有RAM,用來存放中間結果,此外還有定時/計數器,串行I/O口,中斷系統,以及一個內部的時鐘電路。在單片機中有一些獨立的存儲單元是用來控制這些器件的,被稱之為特殊功能寄存器(SFR)。
  • 51單片機按鍵電平讀取程序
    (c=17;c>0;c--) for(b=134;b>0;b--) for(a=2;a>0;a--); } } bit ReadKey(void) { if(SysKey == RESET)//有按鍵被按下 { Delay1ms(10);//延時10ms if(SysKey == RESET)// 再次判斷按鍵被按下
  • 第一課: 如何快速入門單片機C語言
    (2)單片機內部結構之一ROM「硬碟」,改了名字,稱為程序存儲器,也叫只讀存儲器。用ROM(Read only memery)表示。其作用和計算機的硬碟差不多,用來存放用戶編寫的程序。特點是:掉電後不會丟失數據(程序)。
  • 單片機內部結構詳解(以MCS-51為例)
    2.1  MCS-51單片機內部結構 2.1.1、 MCS-51單片機組成MCS-51單片機是在一塊晶片中集成了CPU,RAM,ROM、定時器/計數器和多種功能的I/O線等一臺計算機所需要的基本功能部件。
  • 畢設--基於51單片機的溫度報警器設計
    本數字溫度報警器是基於51單片機及溫度傳感器DS18B20來設計的,溫度測量範圍0到99.9攝氏度,精度為0.1攝氏度,可見測量溫度的範圍廣,精度高的特點。可設置上下限報警溫度,默認上限報警溫度為38℃、默認下限報警溫度為5℃(通過程序可以更改默認上下限值)。報警值可設置範圍:最低上限報警值等於當前下限報警值,最高下限報警值等於當前上限報警值。將下限報警值調為0時為關閉下限報警功能。
  • 51單片機藍牙點燈程序
    適用於:stc15f2k60s2型號單片機(其它型號的51單片機如果想用這個程序,就得修改程序的波特率和某一些的地方才能用)藍牙模塊:hc-05模塊你用手機給藍牙發個0,led燈亮,發個1,led燈滅單片機源程序如下:#include <stc15f2k60s2.h>#include <intrins.h>#define uchar
  • 關於51單片機寄存器的功能都在這裡講清楚了
    在51單片機內部有一個CPU用來運算、控制,有四個並行I/O口,分別是P0、P1、P2、P3。有ROM用來存放程序,有RAM用來存放中間結果;此外還有定時/計數器,串行I/O口,中斷系統,以及一個內部的時鐘電路。在單片機中有一些獨立的存儲單元是用來控制這些器件的,被稱之為特殊功能寄存器(SFR)。
  • 51單片機數碼管顯示跑馬燈程序原始碼講解
    51單片機數碼管顯示跑馬燈程序原始碼講解基於51單片機學習板。
  • 51單片機製作簡易電風扇定時控制器
    直到電源指示燈LED4亮.單片機運行,繼電器2工作給單片機供電。通過按鍵設置繼電器2的工作時間,實現系統的自動斷電,通過設置繼電器1的工作時間,實現風扇的間歇轉動,實現節能。1. 顯示部分:通過按鍵,在風扇轉動時間,暫停時間,和系統關閉剩餘時間切換顯示。
  • 單片機定時器/計數器的結構以及工作原理
    計數過程每來一個脈衝計數器加1,當加到計數器為全1(即FFFFH)時,再輸入一個脈衝就使計數器回零,且計數器的溢出使TCON中TF0或TF1置1,向CPU發出中斷請求(定時器/計數器中斷允許時)。如果定時器/計數器工作於定時模式,則表示定時時間已到;如果工作於計數模式,則表示計數值已滿。
  • AVR單片機輕鬆入門與實踐 — 暢學單片機
    AVR單片機,循序漸進地基於理論講解並結合實驗項目實戰開發,講解當前最熱門的AVR單片機的C程序設計!巧妙地將單片機原理與應用和單片機C語言編程的知識點融入各個實例中,不僅開闢了單片機應用的視野,又充實了對單片機從基礎到應用所需要的知識。使廣大學者可一邊學單片機結構理論知識一邊用C語言編程實現各種功能,既能高效地系統學習知識,又能提高編程思維能力。      在多角度、多方面的實例化講解中,讀者不僅掌握了單片機系統開發的基本技能,還開闊了單片機流行應用的視野。
  • 有備無患,單片機面試問題集
    答:硬體看門狗是利用一個定時器電路,其定時輸出連接到電路的復位端,程序在一定時間範圍內對定時器清零,因此程序正常工作時,定時器總不能溢出,也就不能產生復位信號。如果程序出現故障,不在定時周期內復位看門狗,就使得看門狗定時器溢出產生復位信號並重啟系統。
  • 單片機中各種周期的關係與定時器原理
    在標準的51單片機中,一般情況下,一個機器周期等於12個時鐘周期,也就是機器周期=12*時鐘周期,(上面講到的原因)如果是12MHZ,那麼機器周期=1微秒。單片機工作時,是一條一條地從RoM中取指令,然後一步一步地執行。單片機訪問一次存儲器的時間,稱之為一個機器周期,這是一個時間基準。機器周期不僅對於指令執行有著重要的意義,而且機器周期也是單片機定時器和計數器的時間基準。
  • 詳解:單片機中各種周期的關係與定時器原理
    在標準的51單片機中,一般情況下,一個機器周期等於12個時鐘周期,也就是機器周期=12*時鐘周期,(上面講到的原因)如果是12MHZ,那麼機器周期=1微秒。單片機工作時,是一條一條地從RoM中取指令,然後一步一步地執行。單片機訪問一次存儲器的時間,稱之為一個機器周期,這是一個時間基準。機器周期不僅對於指令執行有著重要的意義,而且機器周期也是單片機定時器和計數器的時間基準。
  • 什麼是程序中的「中斷」?
    中斷程序主要是為某些特定控制功能而設定。與子程序不同,中斷是隨機發生且必須立即響應的。需要執行中斷程序必須要有中斷源(引發中斷的信號)每個中斷信號都有一個編號加以識別,也就是我們說的中斷事件號      在200SMART系列PLC中共有三大類中斷事件,分別是:I/O中斷:I/O 中斷包括上升/下降沿中斷、高速計數器中斷和脈衝串輸出中斷。
  • 學51單片機必看!51單片機導論
    STC代表生產公司,8代表8051內核,9代表Flash內存,C代表屬於CMOS類,5(表示51單片機)固定不變,2的位置可由1-16任意數字代替,代表存儲區大小為4KB的倍數。引腳功能:VCC(40腳)是單片機電源正,GND(20腳)是電源正;P0、P1、P2、P3是四組輸入輸出口,顯高電阻狀態,對外能發出高電平和低電平;10腳是串行輸入口,11腳是串行接收口;12、13腳是外部中斷輸入;18、19腳用於外接時鐘;9腳是復位引腳,有兩個機器周期以上的高電平則使單片機復位;其它引腳不要求掌握。