c语言中断号的作用是什么,c语言如何实现定时中断功?

给你上个较完整的程序,可以直接在KEIL中运行并观察输出

/******************************************************************************

功能:本程序在12M晶振模式下,通过定时器中断精确实现数字时钟计时操作,并在KEIL

中实现输出。

时、分、秒的变化在定时中断里处理。

说明:因采用工作方式2,自动装入初值,所以此程序计时很精确,只是在KEIL中模拟输

出显示的变化速度很快,这点可不理会

******************************************************************************/

#include

#include

#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

bitbSecChanged;//秒发生变化标志,每秒送一次输出显示,送显完成后清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

}

}

}。

全部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值