51单片机定时器中断程序

程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯亮5秒,C灭,程序结束,不再运行。这程序该怎么写?用定时器精确定时……晶振11.092MHZ。能不能给我个... 程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯亮5秒,C灭,程序结束,不再运行。这程序该怎么写?用定时器精确定时……晶振11.092MHZ。能不能给我个完整的示例,谢谢 。给程序加100金币。。。 展开
 我来答
M爱人627
高粉答主

2018-03-30 · 关注我不会让你失望
知道小有建树答主
回答量:149
采纳率:100%
帮助的人:4.1万
展开全部

再次重新启动。

  • 用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;

TH0=(65536-初值)%256;

TL0=(65536-初值)/256;

  • 将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:

机器周期=12/12*10^6=1us(微秒)

定时初值=(1*10^-3)/(1*10^-6)=1000;

所以:TH0=(65536-1000)%256;

TL0=(65536-1000)/256;

  • 将65536-1000=64536化为16进制为:0xFC18,TH0=0xFC,TL0=0X18;

  • 定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 // 1ms延时(12.0MHz)

硬件开发88
推荐于2017-12-15 · TA获得超过8675个赞
知道大有可为答主
回答量:1757
采纳率:84%
帮助的人:589万
展开全部
我来帮你写一个,程序太简单了,下面是我帮你写的程序我测试过能满足你的要求,希望我的回答对你有帮助!
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**/
#include "REG52.H"

/*
*
*/
sbit LED_A = P1^0;
sbit LED_B = P1^1;
sbit LED_C = P1^2;

unsigned char TIME_BASE;
unsigned char MACT_ENDB;
unsigned char Rece_Errp;

/*
* 定时器初始化
*/
void SystemInit(void)
{
TMOD = 0x01;
TH0 = (65536 - 45872) / 256; // 定时50ms //晶振:11.0592MHZ
TL0 = (65536 - 45872) % 256;
ET0 = 1;
TR0 = 1;
EA = 1;
}

int main(void)
{
SystemInit();

while(1)
{
/* 程序一开始上电Rece_Errp = 0 定时器5秒加一次 */
if(Rece_Errp == 0)
{
LED_A = 0; // A亮5秒
LED_B = 1; // B是灭
LED_C = 1; // C是灭
}
/* 判断是否5秒时间到 */
else if(Rece_Errp ==1)
{
LED_A = 1; // A是灭
LED_B = 0; // B亮5秒
LED_C = 1; // C是灭
}
else if(Rece_Errp == 2)
{
LED_A = 1; // A是灭
LED_B = 1; // B是灭
LED_C = 0; // C亮5秒
}
else
{
LED_A = 1; // A是灭
LED_B = 1; // B是灭
LED_C = 1; // C是灭
while(1); // 程序运行到这里停止
}
}
}

void Timer0_IRQ(void) interrupt 1
{
TH0 = (655365 - 45872) / 256;
TL0 = (655365 - 45872) % 256;
/* 进入中断50ms +1次 */
TIME_BASE++;

if(TIME_BASE == 20) // 20ms * 50ms = 刚好等于1000ms 也就是1秒
{
TIME_BASE = 0;
MACT_ENDB++; // 一秒加一次
if(MACT_ENDB == 5) // 等于刚好5秒时间到
{
MACT_ENDB = 0;
Rece_Errp++; // 用来切换LED A、B、C5秒灭
}
}
}
追问
嘿嘿,谢谢。我想了一早上,脑袋都爆了。
追答
程序你试一下能不能用
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wwwusr
2014-04-20 · TA获得超过2292个赞
知道小有建树答主
回答量:744
采纳率:100%
帮助的人:646万
展开全部
这个不难吧?
A亮,延时,再B亮,再延时,用个while(1),可以让亮的过程只走一回。
晚上给你编一个。
你先想想,想不出来晚上给你弄一个。
追问
想用中断定时,不会用,到时间了,A灯还是亮着。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式