本文目录一览:
- 1、c语言怎么编写单片机的中断
- 2、单片机C语言编程中延时函数和定时器中断有何关系
- 3、C语言写单片机的时候,怎么写定时中断?
- 4、51单片机定时中断C语言的写法步骤,可追加分数
- 5、单片机定时器中断问题(c语言)
- 6、用c语言写51单片机定时器中断判断按键是否按下该怎么写? 我想实现的功
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秒,退出循环。
}
............
}
}