单片机C语言一秒定时程序详解

这是一个经典一秒定时我看不懂,希望那位大哥给指点一下,越详细越好。小弟在这拜谢了。诚意求解!!
void timer0(void) interrupt 1 using 1
{
TH0=-5000/256;
TL0=-5000/256;
BUFFER[0]=BUFFER[0]+1;
if(BUFFER[0]==100)
{
CIRCLE=CIRCLE<<1;
if(CIRCLE==0)
{
CIRCLE=0X10;
}
BUFFER[0]=0;
BUFFER[1]=BUFFER[1]+1;
if(BUFFER[1]==60)
{
BUFFER[1]=0;
}
}
}
破书害死人啊,要是知道是这个,我晕。谢谢大哥指点了,要不不知道什么时候才能清楚呢,那个%是我打错了。后面BUFFER[0]==100;是书上原话,再问大哥一个问题后面为什么要if(BUFFER[1]==60)呢?为什么是60就要清零?大哥能把邮箱给小弟么?我想以后如果有什么不懂的就直接问大哥了,我的邮箱epdqffma357@163.com。再一次谢谢了

几M晶振
-----------------------------------
如果是12M晶振的话,那么定时器一个计数频率是12M / 12 = 1M,即一个计数周期是1us。

你给的程序看出,是定时器工作在MODE1。16位计数器。但是你给的程序应该有问题。
一个是TL0 = - 5000 / 256,应该是TL0 = - 5000 % 256;
另一个是if(BUFFER[0]==100),应该是if(BUFFER[0]==200)。

首先你要懂定时计数器原理,51是累加型,MODE1的上限是0xFFFF,即代表可计65535个数。这里程序想计5000个数(5000us),那么TH和TL组成的16位初值应该是60535。要表示这个数,可分两步理解,其一,5000表示成高低字节的两个8位数,高字节为5000 / 256(整数)= 19 = 0x13,低字节为5000 % 256(余数)= 136 = 0x88,结果是5000的16进制表示就是0x1388;其二,65535 - 5000 = 0xFFFF - 0x1388,相当于对0x1388取负。所以就有了TH0 = - 5000 / 256;TL0 = - 5000 % 256;

第二,如上分析,一个中断就是5ms,那么,在中断内部就要判断BUFFER[0]是否到达200,而不是100。如果到了,CIRCLE就向左移一位,然后BUFFER[1]加1,表示增加1秒,同时判断BUFFER[1]是否到60,如果是60就清零。

这小部分代码,还不能说清CIRCLE的具体作用,可能是用来点亮小灯的吧,移一位,小灯也移一次。

不知这样的回答满意不?
www.donald.net.cn
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-08-22
我的博客上就有一个比较好的同样功能的程序,不要用这相,里面有点故弄玄虚的.

单片机c语言编写产生1秒定时的程序,怎么写?
如果是51单片机的话其实很简单的,这里假设晶振频率是12M(一般都是的),你可以选用定时器0,工作在工作状态2,因为这个状态下装入初始值几乎不需要时间,所以定时精确,也就是8位预置数状态,将初始值设为6,这样每次定时就是250微秒,在中断程序中定义一个静态变量,每次中断加一,这样当这个变量值为4...

单片机延时1秒如何计算要最详细一点的要过程用C语言
IsOneSecondReach = 0;\/\/do something,如果一秒延时标志为1,则清除此标志,等待下次1秒,在此处 \/\/执行需要执行的程序 } } } \/* 定时器50ms产生一次中断 *\/ void Timer(void) interrupt 3 { \/* 重新载入T1参数 *\/ TH1=0x3C;TL1=0xAF;\/* 一秒累加 *\/ rSecondCount++;\/\/秒计时+1 if (r...

单片机C语言一秒定时程序详解
如果是12M晶振的话,那么定时器一个计数频率是12M \/ 12 = 1M,即一个计数周期是1us。你给的程序看出,是定时器工作在MODE1。16位计数器。但是你给的程序应该有问题。一个是TL0 = - 5000 \/ 256,应该是TL0 = - 5000 % 256;另一个是if(BUFFER[0]==100),应该是if(BUFFER[0]==200)。...

哪位高手知道 单片机精确延时1秒得C语言子程序 谢谢了
SETB TR0 ;开启定时器 HERE:JBC TF0,NEXT1 SJMP HERE NEXT1:MOV TL0,#0B0H MOV TH0,#3CH DJNZ R7,HERE CLR TR0 ;定时器要软件清零 SETB EX0 RET C语言延时程序:10ms延时子程序(12MHZ)void delay10ms(void){ unsigned char i,j,k;for(i=5;i>0;i...

单片机的程序怎么延时1s?
单片机常用的编程语言有汇编语言、C语言等。以下是使用汇编语言实现延时1s的程序:以上程序中,使用了一个8位计数器来实现延时功能。由于单片机晶振频率为12MHz,每个指令需要执行12\/4=3个机器周期(其中4代表指令周期),因此可以通过调整计数器初值来实现不同的延时时间。具体计算过程如下:每个指令需要执行...

利用单片机c语言编程设计闪烁时间为1秒流水灯程序
include <reg52.h> include <intrins.h> define uchar unsigned char define uint unsigned int void DelayMS(uint x){ uchar i;while(x--){ for(i=120;i>0;i--);} } void main(){ P0 = 0xFE;while(1){ P0 = _crol_(P0,1);DelayMS(500);} } ...

51单片机 用c语言 调用-nop- 编一个 延时一秒 程序
如果你换个编译器,比如从keil转到wave,又不能确定时间是否一致;其实你到网上看看,对于时间要求很严格的地方,延时程序基本都是汇编写的,大不了是C和汇编嵌套,或者用定时器;如果你说的是大概一秒的话,那么你百度一下就是一大堆;我做个一个表,即使用定时器,藐视很准确,其实走上一天可能就差...

AT89C51单片机,如何实现延迟一秒
其实可以用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12\/n(n指晶振频率),假设你要定时的时间为M 那么定时的初值为:M\/机器周期=初值;TH0=(65536-初值)%256;TL0=(65536-初值)\/256;将(65536-初值)...

用c语言编程实现C8051F300单片机1s定时,50Hz的方波输出
\/\/定时器0中断打开} data unsigned char us250;data unsigned int ms;bit WAVE; \/\/用以记住当前wave的状态void Timer0_ISR() interrupt 1 \/\/定时中断服务程序,为按键消抖服务{if (++us250<4) return; us250=0; ++ms;if (ms<10) return;\/\/每10ms波形变化一次,20ms完成一个波形,所以...

单片机60秒计时器的程序,用AT89C51实现
\/\/1:用AT89C51单片机的定时\/计数器T0产生一秒的 \/\/定时时间,作为秒计数时间,当一秒产生时,秒 \/\/计数加1,秒计数到60时,自动从0开始。单片机 \/\/晶振频率为12MHZ include<reg51.h> define uchar unsigned char define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x...

相似回答