中断嵌套c语言程序,中断和定时器实验--c语言实现中断嵌套【转载】

中断和定时器实验--c语言实现中断嵌套【转载】

题目:通过外部中断0,触发一个延时过程,假定延时时间为1秒,延时期间可以点亮一个LED或让蜂鸣器发出声音。已知单片机晶振频率为6 .00MHz

问题:上面的方法可以完成一个“重复触发问题”,即定时时间没有到的时候又来一个触发信号,应该怎么办?

解:对于“重复触发问题”,单片及不响应外部中断。

硬件电路:

--------------------------------------------------------------------------------

实验程序:

//程序说明,外部中断服务程序的工作是:禁止外中断,启动定时器0,允许定时//器0中断,led1(p1.0口)取反。

//定时器中断服务程序的工作是:重载TH0和TL0的初值,延迟3s后,关闭定//时器0,禁止定时器0中断,允许外部中断,led进入灭状态。

//主函数设置定时器0的工作模式,外中断的触发模式(本实验使用的是脉冲触//发),允许总中断和外中断。

//yzxled.h

#include

sbit LED1=P1^0;

#define ON 1

#define OFF 0

#define RELOADTH0 0x3c

#define RELOADTL0 0x0b0

typedef unsigned char uchar;

uchar time="0",delaytime=10;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里为您提供一段使用C语言的使用定时器0实现延迟精准定时程序初始化的代码,代码如下: ```c #include <reg52.h> //包含单片机头文件 void delay(unsigned int time_ms); //函数声明 void main() { TMOD &= 0xF0; //设置计数器0为工作方式1 TMOD |= 0x01; TH0 = 0xFC; //设置计数器0的初值 TL0 = 0x67; TR0 = 1; //启动计数器0 while(1) { delay(1000); //调用延时函数延时1秒 P0 = ~P0; //P0口取反 } } void delay(unsigned int time_ms) { unsigned int i, j; for(i = time_ms; i > 0; i--) for(j = 110; j > 0; j--); } void timer0() interrupt 1 //定时器0中断服务函数 { TH0 = 0xFC; //重新设置计数器0的初值 TL0 = 0x67; } ``` 这段代码使用定时器0来实现延迟精准的定时程序初始化,其中: - `TMOD &= 0xF0;` 和 `TMOD |= 0x01;` 表示设置计数器0为工作方式1,即16位定时器模式; - `TH0 = 0xFC` 和 `TL0 = 0x67` 表示设置计数器0的初值为65535-45875,即计数器0从45875开始计数,计满65535后溢出; - `TR0 = 1` 表示启动计数器0; - `delay(unsigned int time_ms)` 是一个延时函数,其中 `time_ms` 表示要延时的毫秒数,通过嵌套循环实现精准的延时; - `timer0() interrupt 1` 是定时器0的中断服务函数,在计数器0溢出时会触发中断,通过重新设置计数器0的初值实现定时效果。 在 `main()` 函数中,我们可以通过调用 `delay(1000)` 函数来实现精准的1秒延时,然后通过 `P0 = ~P0` 来使P0口的输出取反,从而实现定时的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值