您的位置:

单片机c语言定时器中断,单片机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

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

}

}

}

单片机C语言编程中延时函数和定时器中断有何关系

延时函数(延时子程序)是主程序正常运行时执行的,

---主程序运行的时间即是延时函数的延时时间。

定时器中断是在主程序中插入的事件,是在主程序的某个时间点,跳出主程序去执行定时器中断要做的事情。

所以如果一个延时子程序不停地被中断(包括定时器中断或者其他中断)打断,

就没有时间完成自身运行一次所需的那些语句。

等到它自身运行完一次,可能原定延时时间的很多倍已经过去了。

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

给你上个较完整的程序,可以直接在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

}

}

}

51单片机定时中断C语言的写法步骤,可追加分数

程序说明:51单片机定时器0工作于方式一,定时50ms中断一次

晶振为12M

#include

void

main

{

TOMD

=

0X01;

//配置定时器0工作于方式一

TH1

=

(65536-50000)/256;

//高八位装入初值

TL1

=

(65536-50000)%256;

//低八位装入初值

ET0

=

1;

//开定时器0中断

EA

=

1;

//开总中断

TR0

=

1;

//启动定时器0

while(1)

{

}

}

void

Timer0_int()

interrupt

1

{

//重新装初值

TH1

=

(65536-50000)/256;

//高八位装入初值

TL1

=

(65536-50000)%256;

//低八位装入初值

}

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

上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样

#include

void

main

{

TOMD

=

0X01;

//配置定时器0工作于方式一

TH1

=

0x3c;

//高八位装入初值

TL1

=

0xb0;

//低八位装入初值

IE

=

0x82;//开总中断并开定时器0中断

TR0

=

1;

//启动定时器0

while(1)

{

}

}

void

Timer0_int()

interrupt

1

{

//重新装初值

TH1

=

0x3c;

//高八位装入初值

TL1

=

0xb0;

//低八位装入初值}

单片机定时器中断问题(c语言)

我把你现在给出的这个程序的分析和调试了一下,并且我在里面加入了一些代码使能能够通过串口输出来观察数据,,一开始是进入到xian1()中的,,就是你的显示为0的这个函数中的,然后当nDataToDisplay200这个条件不满足的时候,程序就开始进入xian()中,也就是你的显示为9999的函数中,,,,然后又循环到一开始的状态。

就函数已经在你指定的地方调用了,,,,如果有问题,,就要检查你的显示函数和相应硬件连接了。

用c语言写51单片机定时器中断判断按键是否按下该怎么写? 我想实现的功

这个可以这样实现:

#includereg51.h

#define uchar unsigned char

uchar time=0;

sbit key=P1^0;

void t0isr() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

time++;

}

main()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

ET0=1;

EA=1;

while(1)

{

while(key) // 如果按键未按下则执行循环

{

if(time100)break; //如果时间大于5秒,退出循环。

}

............

}

}