C语言写单片机的时候,怎么写定时中断?

相做个数字时钟,若用delay延时,精度不高,所以想学怎么使用定时中断。先不上分,被百度“吞”一好几个问题了。... 相做个数字时钟,若用delay延时,精度不高,所以想学怎么使用定时中断。

先不上分,被百度“吞”一好几个问题了。
展开
 我来答
lylxy1965
2011-06-02 · TA获得超过2413个赞
知道小有建树答主
回答量:436
采纳率:100%
帮助的人:223万
展开全部
给你上个较完整的程序,可以直接在KEIL中运行并观察输出

/******************************************************************************
功能: 本程序在12M晶振模式下,通过定时器中断精确实现数字时钟计时操作,并在KEIL
中实现输出。时、分、秒的变化在定时中断里处理。
说明: 因采用工作方式2,自动装入初值,所以此程序计时很精确,只是在KEIL中模拟输
出显示的变化速度很快,这点可不理会
******************************************************************************/
#include <reg52.h>
#include <stdio.h>

#define TEST //此行用于KEIL输出显示,如果不需要显示可将其删除

typedef unsigned char uchar;
typedef unsigned int uint;

#define TH0TL0_INIT (256-250) //定时器8位自动装入模式下寄存器初值,0.25ms中断一次

char cHour; //时
char cMin; //分
char cSec; //秒

uint iCount; //秒计数,计数达到4000时1s,4000*0.25ms =1000ms = 1s

bit bSecChanged; //秒发生变化标志,每秒送一次输出显示,送显完成后清0,提高主程序效率

//==============================================================================
//T0定时器中断服务程序,12M晶振下每0.25ms产生中断,本程序执行一次
//==============================================================================
void Timer0() interrupt 1
{
iCount++; //秒计数值+1
if(iCount==4000)
{//时间计数达到1S
iCount = 0; //重新开始下一秒计数
cSec++; //时钟:秒+1
bSecChanged = 1; //置秒发生变化标志
if(cSec==60)
{//计够60s
cSec = 0; //重新开始下一分计数
cMin++; //时钟:分+1
}
if(cMin==60)
{//计够60分钟
cMin = 0; //重新开始下一小时计数
cHour++; //时钟:小时+1
}
if(cHour==24)
{//计够24小时
cHour = 0; //重新开始第二天计数
}
}
}

//==============================================================================
//主程序
//==============================================================================
void main()
{
uchar outstr[10]; //输出字符串,我的编译器可能有问题,直接输出有错

TMOD = 0X02;//工作方式2,8位自动重装计时模式
TH0 = TH0TL0_INIT; //0.25ms中断一次
TL0 = TH0TL0_INIT; //0.25ms中断一次

#ifdef TEST
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
#endif

cHour = 0; //时
cMin = 0; //分
cSec = 0; //秒
iCount = 0; //秒计数
bSecChanged = 0;

outstr[2] = ':'; //时分分隔符
outstr[5] = ':'; //分秒分隔符
outstr[8] = 0; //字符串结束符

EA=1; //开总中断
ET0=1; //允许T0中断
TR0=1; //启动T0

while(1)
{
if(bSecChanged==1)
{//秒发生变化,将时间值转换为可显示字符串准备送显示
bSecChanged = 0;//清除标志,节省CPU资源

outstr[0] = cHour/10 + 0x30; //将秒转换为ASCII码
outstr[1] = cHour%10 + 0x30;

outstr[3] = cMin/10 + 0x30; //将分转换为ASCII码
outstr[4] = cMin%10 + 0x30;

outstr[6] = cSec/10 + 0x30; //将小时转换为ASCII码
outstr[7] = cSec%10 + 0x30;

#ifdef TEST
printf(" %s\r",outstr); //在KEIL中显示时钟
#endif
}
}
}
追问
我是初学者,别把我当专业的来教啊。
麻烦说得详细点行吗?我看得很乱,我现在只想知道,如何得到一个1S的中断信号,然后,怎么调用这个中断信号。
seuzhouww
2011-06-01 · TA获得超过1386个赞
知道小有建树答主
回答量:658
采纳率:0%
帮助的人:309万
展开全部
1、配置定时/计数模块工作在定时模式;根据定时时间的需要,配置计数器的方式;
2、配置好提供给定时/计数模块的时钟源;
3、根据定时时间的需要,结合时钟源配置计数器的初值;
4、启动定时器,开启定时中断服务及总允许中断;(以上初始化一次即可。)
5、在对应中断服务中,重置相关设置;(每次中断服务的内容)

简单的实例
#include"reg51.h"
unsigned char ms10;
void InitialT0(void)
{
TMOD=0x1; //16位计数器,工作在定时模式。51默认的系统12分频计数。
TR0=1;ET0=1;EA=1;//启动,并配置中断。
}

main()
{
InitialT0();
while(1)
{;}
}
void ISRForT0(void) interrupt 1
{
TH0=(-10000)>>8;
TL0=-10000;//若12MHz晶振。计数初值重置,表示10000次计数后中断。即每10mS进入中断。
ms10++;//对10mS进行计数,主程序中或者在下面,判断此内容为100时,表示1秒钟到了。
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
333niu
2011-06-01 · 超过11用户采纳过TA的回答
知道答主
回答量:106
采纳率:50%
帮助的人:23.2万
展开全部
首先在初始化函数中进行初始化,对寄存器tmod ea th* tl* et* tr* 进行f赋初值操作,下面进行中断函数书写t0:
void timer0() interrupt 1//重点是interrupt 关键词后面的是入口0 1 2 3 4
{
th1=*;
tl1=*
......
/*书写中断函数内容*/
}
追问
这些回答者中,就你的表达方式我能听懂,但是你说得不详细,能详细说明吗?
追答
#include
main()
{
TMOD=0x01; //定时器0方式1;其他的具体还要看相关资料!
TH0=(65536-50000)/256;//c语言的灵活之处!不用自己计算!
TL0=(65536-50000)%256;//延时50ms
TR0=1;//启动定时器
ET0=1;//开定时器0中断
EA=1;//开总中断
}
void timer0() interrupt 1//重点是interrupt 关键词后面的是入口0 1 2 3 4
{
TH0=(65536-50000)/256;//c语言的灵活之处!不用自己计算!
TL0=(65536-50000)%256;//延时50ms(这里和这里和上面一样主要是强调这里是上面的重复)
......
/*书写中断函数内容*/
}
//哪里还有不清楚吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式