单片机C语言定时器如何调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机C语言定时器如何调用相关的知识,希望对你有一定的参考价值。

我现在定时器的初始程序与中断,假设我现在需要将机器从开机开始计时,到三十秒做第一个动作,该如何调用,求大神知道

程序如下
/*******************************************************************
【函数原形 】: init_time
【功能说明 】: 定时器初始化程序
【参数说明 】:
【编写时间 】: 2012年12月10日
【修改时间 】:
【初始位置 】:
************************************************************************/
void init_time()

TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;

void time_0()interrupt 1

TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
coint++;

单片机中通过中断的方式来调用定时器。


具体的调用方式可以参考通过如下程序:

程序功能:利用定时器进行定时,实现每秒中led闪烁一次

#include<reg52.h>
sbit led = P0^0;
unsigned int num;
void main(void)

TMOD = 0x00;   // 工作方式0
TH0 = (8192 - 5000) / 32;  // 12M晶振下定时5ms
TL0 = (8192 - 5000) % 32;
EA = 1;    // 开总中断
ET0 = 1;    // 开定时器中断
TR0 = 1;    // 启动定时器
while(1)

  if(num == 200)   // 定时1秒钟到

num = 0;   // 计数器清零
led = ~led;   // led灯取反,实现1秒闪烁一次




void timer() interrupt 1  // 定时器1工作与方式0

TH0 = (8192 - 5000) / 32;  // 重装初值
TL0 = (8192 - 5000) % 32;
num++;  // 计数器加1

参考技术A count++到30秒触发一个函数就行了 参考技术B void init_time()

TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;


void main()

init_time();
while(1);


void time_0()interrupt 1 //中断函数放主函数后面就行,不需要声明

TH0=(65536-10000)/256;
TL0=(65536-10000)%256;//假设这个定时为10毫秒,我就不计算了
coint++; //全局变量,别忘了定义
if(coint==3000)//10ms*3000=30s

LED=~LED;//这是要执行的动作,以灯亮灭为例;
coint=0;计数器清零,重新开始计数;

追问

你好请问,我程序如果后面还要有别的动作,如何做成全局定时

追答

这个本身就是全局定时反复执行的,每隔三十秒就执行一次。要是想在中断后进行别的动作,可以把动作程序写在主程序while(1)的位置,比如在while(1)里面写个流水灯的程序,现象就是流水灯一直流动,每隔三十秒中断中控制的那个灯亮灭变化一次,两者互不影响。建议你深入理解一下中断的概念http://zhidao.baidu.com/question/2195108.html

本回答被提问者采纳

C语言中,用于设置中断、中断信号的函数都有哪些?怎么设置一个发送中断信号(自己定义的)的函数?

函数要比较新的,dos时代的函数最好不要了。如何设置一个到了一定时间间隔自动发送中断信号在函数?不要alarm(),要精度高一点的。
//分数就这么点了,能帮的前辈尽量帮帮我……

对于C51单片机,其内部总共有五级中断源
分别为外部中断0、定时器0、外部中断1、定时器1及串行中断。
C51单片机的中断使用时,主要是通过中断服务号来决定的。
如你定义一个中断服务函数:
void KEY(void) intterrupt 0



当外部中断0申请中断时
会自动根据interrupt后面的0,找到上面定义的这个中断服务函数。
对于其他四个中断源,其对应的中断号分别为1、2 、3、4
参考技术A 设置一个定时器,然后安装信号处理函数。
以下是一个用定时器写的程序

#include<stdio.h>
#include<time.h>
#include<sys/time.h>
#include<stdlib.h>
#include<signal.h>

static int count=0;

void set_timer()//设置定时器

struct itimerval itv;
itv.it_value.tv_sec=3;
itv.it_value.tv_usec=0;
itv.it_interval.tv_sec=2;
itv.it_interval.tv_usec=0;
setitimer(ITIMER_REAL,&itv,NULL);//启动定时器


void signal_handler(int m)//信号处理函数

count++;
//printf("%d\n",count);

int main()

signal(SIGALRM,signal_handler);//安装信号
set_timer();
while(count<10);
exit(0);
追问

谢谢回答,函数写的很好。为什么我没有学到过这些结构体呢?这些结构体很有用,siganal.h.sys/time 我也知道,可就是这些可以用的结构、函数不知道。请问哪本书讲这些常用函数比较多呢?不要纯列举函数的,要讲原理的。没学过单片机,谢谢!

追答

推荐UNIX环境高级编程,linux程序设计

追问

确实好书

怎么这个函数在时间到了之后显示了个alarm clock就把函数结束了呢?不应该重新开始计时吗?

本回答被提问者和网友采纳

以上是关于单片机C语言定时器如何调用的主要内容,如果未能解决你的问题,请参考以下文章

怎样在单片机C语言里面产生一个0到100的随机数

求51单片机中,用C语言写的五个中断源的中断函数的书写规则,就是进入中断函数时的那个函数名,并说明...

单片机 C语言,如何调用外部自定义函数。

单片机C语言如何满足条件就立即退出中断函数

单片机c语言编程问题,功能是用定时器T0使发光管间隔200ms闪烁,定时器T1使数码管循环显示0-59.

单片机C语言用定时器1工作方式1怎么写