1. c51单片机的定时器计数器怎么用
//用定时器T0查询方式P0口8位控制LED闪烁
#include
#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单片机计数、器计时器的用法
单片机的计数器可以说是一个傻瓜计数器,你要设置它的工作方式、计数初值、开中断并开启计数器,它才会工作。
开启后,它会以你设置的工作方式(计数方式)从你设置的初值开始计数,直到计数值溢出,这时产生计数器中断,执行计数器中断服务程序(一般要重新设置初值),完成后再由中断服务程序给的初值开始计数。如此往复。。。