1. 单片机计时
按你的要求给你写了个简单程序,可用定时器写。下边是不用定时器写的。如按你的要求,按键接P1.0另一边接地,低电平说明按键按下。LED灯我习惯用低电平来点亮。程序如:
#include<reg51.h>
#define uchar unsigned char
sbit start=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
uchar count=0;
void delayms(int x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void delay5s(int x)
{
;//自己重写一个或者按上边改一下也可以
}
main()
{
start=1; //置输入
LED1=1;
LED2=1;
LED3=1;
LED4=1;
for(;;)
{
if(start==0)
{
delayms(20);// 20ms延时防抖动
if(start==0)
{
delay5s(1); //5s 5s延时函数照1ms函数改下就可以了。
LED1=0;
delay5s(6); //30s
LED2=0;
delay5s(9); //45s
LED3=0;
delay5s(13); //65s
LED4=0;
while(start==0) //等待按键解放
}
}
}
}
2. 单片机倒计时工作原理
单片机倒计时工作原理。在程序中设置一个时间然后不断的减少时间,时间减少为0时就是倒计时时间到了。
3. 单片机计时计分器的计时原理是
单片机计时,就是利用内部的定时器实现的,但是定时器最大只能定时65毫秒(按晶振12M计算),其实可以定时50毫秒,再用中断的方式,中断20次,即计了20次50毫秒,就是1秒钟了。
有了1秒,其余的计时问题就好解决了,计时钟,就按秒,分,小时来计时。
球类计时计分器,也同理,60秒计1分,60分计1小时。
4. 单片机定时器怎么实现时间计时越细越好
定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。
•设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t。
5. 51单片机怎么实现计时
嘿嘿 还是让俺来帮你解决吧
1 关于定时器定时时间的计算问题:
如果使用的是12M晶振计算,指令周期1uS,定时器是加1计数器,即是对内部时钟即指令周期脉冲计数 每当1uS到时,计数器加1。
假设 定时器的初始值=X,则每到1uS 计数器的值就加1 ,则计数器值=X+1+1+...+1 值越来越大,最后达到FFFFH+1 就会产生溢出 结果计数器值回0(FFFFH+1=65536)
可以推出 定时时间=计数的1的个数×1uS=(65536—X )1 uS
结论: 定时时间跟初始值即时间常数X有关。
如果要定时0.5毫秒=500uS 根据定时时间公式 500=(65536—X )
即X=(65536-500) 一般把高8位送TH0 即 (65536-500)/256
把 (65536-500)%256即除上256后的余数 即低8位数送给TL0
每当定时时间到 计数器值都回0 必须重新送时间常数X
2每条指令的时间怎么算? 答复:
可以查指令表 每一条指令的执行时间的周期数 都是固定的 如 NOP 为一个机器周期
MOV R6,#200; 为2个机器周期
机器周期=12/晶振频率 如果晶振频率=12MHZ 则机器周期=1 uS
就可以知道 ; 执行NOP指令的执行时间为 1 uS
执行MOV R6,#200指令的执行时间为 2 uS
因此 是可以精确计算出指令的延时时间的
呵呵 就介绍这些吧 满意就 给加分吧
6. 单片机计时器
(65536-10000)/256 意思是:
括号内的相减结果,即单片机定时器的预装时间常数X,
X/256 意思是整除取商,目的是取X的二进制数高8位,装入TH1;
X%256 意思是整除取余,目的是取X的二进制数低8位,装入TL1。
7. 单片机计时器如何编写
#include<reg52.h>
#define
uint
unsigned
int
#define
uchar
unsigned
char
sbit
key1=P3^0;
//定义"启动"按钮
sbit
key2=P3^1;
//定义"停止"按钮
sbit
key3=P3^2;
//定义"复位"按钮
sbit
DP
=P0^7;
//定义"小数点(.)"
uchar
aa,bb,cc,dd,ee,qian,,shi,ge;
uchar
code
table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//共阴极数码管依次从0到9的编码
void
delay(uint
z)
//延时子函数
{
uint
x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void
display(uchar
qian,uchar
,uchar
shi,uchar
ge)
//显示子程序
{
P2=0xfe;
P0=table[qian];
//千位
delay(10);
P2=0xfd;
P0=table[];
//百位
delay(10);
DP=1;
delay(10);
P2=0xfb;
P0=table[shi];
//十位
delay(10);
P2=0xf7;
P0=table[ge];
//个位
delay(10);
//使用动态扫描的方法实现数码管显示
}
void
init()
//初始化子程序
{
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
TMOD=0x01;
//使用定时器T0的方式1
TL0=0x18;
TH0=0xfc;
//定时1ms中断一次
fosc=12MZH
EA=1;
//中断总允许
ET0=1;
//允许定时器T0中断
}
void
timer0()
interrupt
1
{
TL0=0x18;
TH0=0xfc;//重新赋初值
aa++;
//中断一次变量aa的值加1
if(aa==8)
//中断10次后,定时时间为10*1ms=10ms=0.01s
PS:实际模拟中发现程序显示时间比实际时间慢20%左右
所以把a改为8
{
aa=0;
bb++;
ge=bb%10;
}
if(bb==10)
//中断100次后,定时时间为100*1ms=100ms=0.10s
{
bb=0;
cc++;
shi=cc%10;
}
if(cc==10)
//中断1000次后,定时时间为1000*1ms=1000ms=1.00s
{
cc=0;
dd++;
=dd%10;
}
if(dd==10)
//中断10000次后,定时时间为10000*1ms=10000ms=10.00s
{
dd=0;
ee++;
qian=ee%10;
}
if(ee==10)
//中断100000次后
,全部归零重新开始
{
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
}
}
void
main()
{
init();
//调用初始化子程序
while(1)
{
if(key1==0)
//检测"启动"按钮是否按下
{
delay(10);
//延时去抖动
if(key1==0)
//再次检测"启动"按钮是否按下
{
while(!key1);
//松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此
TR0=1;
//启动定时器开始工作
}
}
if(key2==0)
//检测"停止"按钮是否按下
{
delay(10);
//延时去抖动
if(key2==0)
//再次检测"停止"按钮是否按下
{
while(!key2);
//松手检测
TR0=0;
//关闭定时器
}
}
if(key3==0)
//检测"复位"按钮是否按下
{
delay(10);
//延时去抖动
if(key3==0)
//再次检测"复位"按钮是否按下
{
while(!key3);
//松手检测
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
ge=0;
=0;
shi=0;
qian=0;
TR0=0;
//关闭定时器
}
}
display(qian,,shi,ge);
//调用显示子函数
}
}
8. 单片机计时器原理
单片机用一个振荡器(比如晶体振荡器)作为时间基准,和石英手表里面的振荡器差不多,振荡器每震荡一次的时间间隔是一样的,可以通过振荡器的参数算出来的,每次振荡会产生一个脉冲信号给单片机,单片机只要数数字就能计算时间了。
9. 如何用单片机做一个简单的倒计时器
51单片机实现数码管99秒倒计时,其实很简单,就是使用定时器中断来实现。目的就是学习怎样用单片机实现倒计时,从而实现一些延时控制类的东西,99秒只是一个例子,你完全可以做出任意倒计时如10秒倒计时程序。定时器定时时间计算公式:初值X=M(最大计时)-计数值。
初值,换算成十六进制,高位给TH0,低位给TL0,如果用定时器0的话。
M(最大计时)如果是16位的,就是2的16次方,最大定时,65535 微秒,实现1秒定时,可以通过定时10毫秒,然后100次改变一次秒值即可。10*100毫秒=1S
计数值:你要定时多长时间,如果定时1毫秒,就是1000微秒,(单位为微秒),如果定时10毫秒,就是10000(微秒),当然,最大定时被定时器本身位数限制了,最大2的16次方(16位定时计数器),只能定时65.535毫秒。定时1S当然不可能1S定时器中断。
下面为实现99秒倒计时C语言源程序
/*了解定时器,这样的话,就可以做一些基本的实验了,如定时炸弹~~,10秒后打开关闭继电器*/
/*数码管,12M晶振*/
#include <reg52.h>
#define uchar unsigned char
sbit p11=P1^1; //连的是继电器。。
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shiwei;
uchar gewei;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD|=0x01; /*定时器0 16位定时器 X=65535-10000(10毫秒)=55535=D8F0(十六进制)定时10ms
*/
TH0=0xd8;
TL0=0xf0;
IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
TR0=1; //开定时器0
while(1)
{
P0=shiwei; //99的十位
P2=0; //99的个位,
delay(300); //动态扫描数码管延时
P0=gewei;
P2=1;
delay(300);
}
}
void tim(void) interrupt 1 using 1 //定时器0中断
{
static uchar second=99,count; //99只是一个数,可以任意改,因为这里只学习怎样实现倒计时
TH0=0xd8; //定时10毫秒
TL0=0xf0;
count++;
if(count==100) //10毫秒定时,10*100=1000(毫秒)=1秒
{
count=0;
second--;
if(second==0)
{
p11=0; //这里让继电器动作,当然动作之后,要复位才能等下次倒定时再动作。
second=99; //回到99再循环来,当然,可以做其他的控制,
}
shiwei=tab[second/10]; //数码管10位
gewei=tab[second%10]; //数码管个位
}