导航:首页 > 操作系统 > 单片机计数器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相关的资料

热点内容
加密芯片的计算方法 浏览:187
手机存储为什么找不到微信文件夹 浏览:695
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