中易网

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

答案:3  悬赏:0  
解决时间 2021-02-19 02:07
相做个数字时钟,若用delay延时,精度不高,所以想学怎么使用定时中断。

先不上分,被百度“吞”一好几个问题了。
最佳答案
给你上个较完整的程序,可以直接在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;
TMOD |= 0x20;
TH1 = 221;
TR1 = 1;
TI = 1;
#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
}
}
}
全部回答
首先在初始化函数中进行初始化,对寄存器tmod ea th* tl* et* tr* 进行f赋初值操作,下面进行中断函数书写t0: void timer0() interrupt 1//重点是interrupt 关键词后面的是入口0 1 2 3 4 { th1=*; tl1=* ...... }
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秒钟到了。 }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
LOLS4定级赛上个赛季段位白金3如果10把全输大
王立成英文名怎么写
钱圈村这个地址在什么地方,我要处理点事
除了网通还什么宽带可以用电驴? 北京塔院小区
中国电信幸福路营业厅在什么地方啊,我要过去
4*4÷0.4*0.4
求一款比较好用的国产电脑视频播放器
湖人五号都有谁穿过?霍华德不在但是纳什和加
1000万贷款一分利息一个月还多少
风云天地最后刘恺威和唐嫣在一起了吗
屋顶绿化设计与建造
kis-my-ft2的饭能告诉我一些关于他们的事情吗
你们快递收货名都写什么啊?可以用昵称代替不
8月份准备去洛阳旅游,从青岛坐火车去洛阳,
动感地带商务网吧我想知道这个在什么地方
推荐资讯
云南宣威的嫁到江苏,可以在云南昆明办离婚证
娜花拉·咖啡我想知道这个在什么地方
川大公共管理专业怎么样啊?就业前景怎么样?
西数硬盘读取不出来插上之后不显示但电脑右下
一线营销策划公司好吗
CPK需要数据最少是多少
电脑开机后都是英文字怎么弄
经常梦见自己一个人睡在异地他乡陌生的房子里
安徽新成汽车零部件公司地址有知道的么?有点
为什么蜜蜂起源早于恐龙和人类
灭蚊片对婴儿有影响吗
江西众信国际旅行社德安营业部在什么地方啊,
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?