導航:首頁 > 操作系統 > 單片機計數器c51

單片機計數器c51

發布時間:2023-01-13 03:01:17

1. c51單片機的定時器計數器怎麼用

//用定時器T0查詢方式P0口8位控制LED閃爍
#include // 包含52單片機寄存器定義的頭文件
#define uchar unsigned char
#define uint unsigned int
/**************************************************************
函數功能:主函數
**************************************************************/
void main(void)
{

TMOD=0x01; //使用定時器T0的模式1
TH0=(65536-50000)/256; //定時器T0的高8位賦初值
TL0=(65536-50000)%256; //定時器T0的高8位賦初值
TR0=1; //啟動定時器T0
TF0=0; //溢出標志位 先清零
P0=0xff; //關閉LED燈
while(1)//無限循環等待查詢
{
while(TF0==1)
{
TF0=0;
P0=~P0;
TH0=(65536-50000)/256; //定時器T0的高8位賦初值否則會從0開始計數
TL0=(65536-50000)%256; //定時器T0的高8位賦初值
}
}
}

2. c51單片機的定時器計數器怎麼用最好用例子

方法有很多的,給你一個,你可以調試一下,你可以通過不同的晶振去計算定時器初值,如果你懂定時器這部分很好調通的
#include <reg52.h>
sbit p1_0=P1^0;
int i; //全局變數

void timing(void) //晶振為3.6864M
{
TMOD|=0x01; //定時器T0,工作方式1
TH0=0xC3;
TL0=0xC7; //這兩個寄存器存的是計數器的計數開始的值,這兩個值累加至溢出後正好是50ms
ET0=1; //使T0中斷可以溢出
EA=1; //開啟總中斷
TF0=0; //溢出位清零
TR0=1; //開啟T0
}
/********定時中斷函數*********/
void time0_int () interrupt 1 //定時中斷函數
{
TH0=0xC3;
TL0=0xC7;
i++;
}

main()
{
i=0;
timing();
while(;)
{
if(i==20)
{
p1_0=~p1_0; //p1.0口狀態翻轉
i=0;
}
}

3. 單片機c51.計數器

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar times=0;
uchar keysel=0,led=0xfc,led2=0x55;
sbit S1=P1^0;
sbit S2=P1^1;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
if(times>=10)
{
times=0;
switch(keysel)
{
case 1:
P0=led;
led=_crol_(led,1);
break;
case 2:
P0=led2;
led2=~led2;
break;
default:break;
}
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
while(1)
{
if(S1==0)
{
while(S1==0);
keysel=1;
TR0=1;
}
if(S2==0)
{
while(S2==0);
keysel=2;
TR0=1;
}
}
}

4. 單片機C51,對定時器/計數器初值設置

一個用作定時器。定時器中斷的時候輸出一個脈沖作為計數器的計數脈沖,設定一個計數值,計數滿的時候中斷,這樣計數值為10時候,定時器中斷10次,用一個計數值來記錄定時器的中斷次數,一個用作計數器。
至於定時/計數器的操作;計數器串聯.536ms,所以12M晶振的情況下,然後將計數值清0,重新計數,即為100ms。總的定時時間的原理同上。這個方法會有小小誤差,因為操作計數值的時候會佔用一點時間,這個時間比較短。
2、2個定時/,用單個16位定時器得不到100ms的定時。這時可更換頻率較低的晶振或用以下兩種軟體的方法:
1、定時器累加。用一個計數值來記錄定時器的中斷次數。比如;計數器能達到的最大定時時間為:65536*1uS=65,每中斷一次計數加151單片機12M晶振時,定時/計數器的時鍾為1uS,所以單個16位的定時/,設定定時器10ms中斷

5. 如何讓c51單片機多個定時計數器同時工作

C51單片機的定時/計數器是可以同時工作的,如果用作定時器,它的計數時基就是時鍾分頻得來,各個定時器會共用一個時鍾,只要設置好定時/計數器的工作模式,設置初值,然後就可以啟動定時/計數器了.用作計數器時它的時基就變成外輸入而已,原理是一樣的.

6. 用C51單片機統計脈沖次數

舉例解答如下:
利用定時器T1,對外部脈沖(P3.5引腳輸入)計數,
每輸入200次脈沖產生一次中斷,累加器+1,
選用T1,計數器模式,方式2(自動重裝初值8位計數器),
TMOD
=0110
0000B
=60H
計數初值
=2^8
-200
=256
-200
=56d
=38H,
編程序如下:
;
;
主程序:
MAIN:
CLR
A
;
;
累加器清零
MOV
TMOD,
#60H
;
;置T1計數模式、方式2
MOV
TL1,
#38H
;
;
寫入計數初值
MOV
TH1,
#38H
;
;
寫入留待自動重裝的初值
SETB
TR1
;
;
啟動T1計數
SETB
ET1
;
;
允許T1中斷
SETB
EB
;
;
CPU開中斷
SJMP
$
;
;
等待一輪對外部脈沖計數溢出中斷
;
;
以下是T1中斷處理子程序:
T1_INT:
INC
A
;
;
累加器加1
RETI
;
;
中斷返回

7. C51單片機用一個按鍵控制燈滅,燈亮,但是計數器怎麼不顯示了。

程序這樣做是可能出現你說的現象的,計數器估計是動態數碼管,需要時時掃描顯示,但你在鍵盤檢測階段執行while(!key1);和delay(100);時,是沒法動態掃描的,所以此時數碼管將無法正常顯示。解決辦法是,將動態掃描用定時中斷來完成,那麼就不收這個延時影響了。

8. 用單片機C51中的計數器來測霍爾感測器轉一圈的時間程序

#include<reg52.h>

#include<Star1602.h>

#define CIRCLE 1.8 //宏定義 車輪的周長(這個要根據實際的車輪進行設置)

sbit Signal = P1^0; //這里的Signal表示的是霍爾感測器的信號引腳

int m_second=0; //定義變數m_second,用來記錄時間(以毫秒為單位)

float speed=0.0 ; //定義速度變數

float length=0.0 ;//定義路程變數

void main()

{

lcd_init(); //初始化液晶函數

TMOD = 0x01; //打開定時器0,並設定其工作方式為16位定時模式。

TH0=(65536-10000)/ 256;

TL0=(65536-10000)% 256; //設定定時器的初值,使得沒10ms中斷一次

EA = 1; //允許總中斷

ET0 = 1; //允許定時器0終端

TR0 = 1; //啟動定時器0

while(1) //大循環

{

while(Signal); //等待霍爾感測器信號線拉低;

speed = CIRCLE *1000 / m_second ; //計算速度。

m_second = 0; //計時清零

length += CIRCLE ; //路程加一個車輪周期

//第一行,顯示速度

lcd_pos(0x0); //設定液晶的寫入位置為第一行第一格

lcd_wdat(『S』);

lcd_wdat(『p』);

lcd_wdat(『e』);

lcd_wdat(『e』);

lcd_wdat(『d』);

lcd_wdat(『:』);

lcd_wdat( (int)speed%10 ); //顯示速度的整數部分

lcd_wdat( (int)(speed*10)%10 ); //顯示速度的小數第一位

lcd_wdat( (int)(speed*100)%10 ); //顯示速度的小數第二位

lcd_wdat(『m』);

lcd_wdat(『/』);

lcd_wdat(『s』);

//第二行,顯示里程

lcd_pos(0x80); //設定液晶的寫入位置為第二行第一格

lcd_wdat(『L』);

lcd_wdat(『e』);

lcd_wdat(『n』);

lcd_wdat(『g』);

lcd_wdat(『t』);

lcd_wdat(『h』);

lcd_wdat(『:』);

lcd_wdat(length /10000+0x30); //顯示里程的萬位;

lcd_wdat(length %10000/1000+0x30); //顯示里程的千位;

lcd_wdat(length %1000/100+0x30); //顯示里程的百位;

lcd_wdat(length %100/10+0x30); //顯示里程的十位;

lcd_wdat(length %10+0x30); //顯示里程的個位;

lcd_wdat(『m』);

}

}

void timer0_intt() interrupt 1 //

{

TH0=(65536-10000)/ 256;

TL0=(65536-10000)% 256; //設定定時器的初值,使得沒10ms中斷一次

m_second += 10; //因為中斷每10毫秒一次,所以這里每次加10;

}

附件1 Star1602.h
#ifndef __STAR1602_H__

#define __STAR1602_H__

sbit rs= P2^0; //

sbit rw = P2^1; //

sbit ep = P2^2; //

void lcd_init(); //液晶初始化函數

void lcd_pos(unsigned char pos); //設定液晶的顯示位置函數

void lcd_wdat(unsigned char dat); //液晶寫入字元

void lcd_write_int(unsigned int x); //液晶顯示一個整形變數

#endif

附件2 Star1602.c
#include <reg52.h>

#include "1602.h"

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

函數功能:LCD延時子程序

入口參數:ms

出口參數:

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

static void delay(unsigned char ms)

{

unsigned char i;

while(ms--)

{

for(i = 0; i< 5; i++);

}

}

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

函數功能:測試LCD忙碌狀態

入口參數:

出口參數:result

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

static bit lcd_bz()

{

bit result;

rs = 0;

rw = 1;

ep = 1;

delay(5);

result = (bit)(P0 & 0x80);

ep = 0;

return result;

}

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

函數功能:寫指令數據到LCD子程序

入口參數:cmd

出口參數:

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

static void lcd_wcmd(unsigned char cmd)

{

while(lcd_bz()); //判斷LCD是否忙碌

rs = 0;

rw = 0;

ep = 0;

delay(5);

P0 = cmd;

delay(5);

ep = 1;

delay(5);

ep = 0;

}

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

函數功能:設定顯示位置子程序

入口參數:pos

出口參數:

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

void lcd_pos(unsigned char pos)

{

lcd_wcmd(pos | 0x80);

}

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

函數功能:寫入顯示數據到LCD子程序

入口參數:dat

出口參數:

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

void lcd_wdat(unsigned char dat)

{

while(lcd_bz()); //判斷LCD是否忙碌

rs = 1;

rw = 0;

ep = 0;

P0 = dat;

delay(5);

ep = 1;

delay(5);

ep = 0;

}

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

函數功能:LCD初始化子程序

入口參數:

出口參數:

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

void lcd_init()

{

lcd_wcmd(0x38);

delay(100);

lcd_wcmd(0x0c);

delay(100);

lcd_wcmd(0x06);

delay(100);

lcd_wcmd(0x01);

delay(100);

}

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

函數功能:LCD寫入一個整形數據

入口參數:int x

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

void lcd_write_int(unsigned int x);

{

unsigned char x1,x2,x3,x4,x5;

x1 = x/10000;

x2=x%10000/1000;

x3=x%1000/100;

x4=x%100/10;

x5=x%10;
lcd_wdat(x1+0x30);

lcd_wdat(x2+0x30);

lcd_wdat(x3+0x30);

lcd_wdat(x4+0x30);

lcd_wdat(x5+0x30);

}

9. c51單片販定時計數器t0有幾種工作方式

51單片機定時計數器T0有四種工作方式:
方式0: 13位定時計數方式,最大計數值為2^13=8192,定時8192個機器周期;
方式1: 16位定時計數方式,最大計數值為2^16=65536,定時65536個機器周期;
方式2: 8位自動重裝計數方式,最大計數值為2^8=256,定時256個機器周期;
方式3: 特殊工作方式。將定時器0分成兩個彼此獨立8位計數器。

10. 關於C51單片機計數、器計時器的用法

單片機的計數器可以說是一個傻瓜計數器,你要設置它的工作方式、計數初值、開中斷並開啟計數器,它才會工作。

開啟後,它會以你設置的工作方式(計數方式)從你設置的初值開始計數,直到計數值溢出,這時產生計數器中斷,執行計數器中斷服務程序(一般要重新設置初值),完成後再由中斷服務程序給的初值開始計數。如此往復。。。

閱讀全文

與單片機計數器c51相關的資料

熱點內容
msf埠遷移命令 瀏覽:880
工商app積分怎麼查詢 瀏覽:143
鐵路app怎麼買火車票 瀏覽:309
移魅族除的app怎麼添加 瀏覽:240
兔籠子大號加密 瀏覽:171
單片機程序燒錄操作成功 瀏覽:878
指標高拋低吸點位源碼 瀏覽:205
25匹壓縮機銅管 瀏覽:570
單片機單燈左移05 瀏覽:150
買伺服器練手什麼配置 瀏覽:783
伺服器被毀該怎麼辦 瀏覽:939
python私有庫 瀏覽:514
Python有中文嗎 瀏覽:736
麥塊的伺服器為什麼都進不去 瀏覽:474
新買的伺服器如何打開 瀏覽:35
安卓軟體游戲怎麼開發 瀏覽:319
用撲克擺愛心解壓神器怎麼擺 瀏覽:70
松下製冷壓縮機 瀏覽:275
pdf里怎麼修改文字 瀏覽:686
已保存文檔加密如何設置 瀏覽:413