单片机c语言程序高手进 这个程序应该怎样实现中断

第一次按A键,启动LED1(1S闪烁一次,持续10S)。如果在20S内再按A键一次,则启动LED2灯(0.5秒闪烁一次,持续20S)
如果直接按B键,就直接启动LED2灯

给你个思路吧。
首先来个键盘扫描程序。采集是A键按下还是B键按下。如果是A键按下的话,就给LED1口输出高电平然后延时1S,延时程序可以用delay来粗略延时,也可以用定时器精确延时;延时1S过后,让LED1口输出低电平,然后再延时1S。给这段程序用while或者for语句来循环5次,这样就能得到启动LED1(1S闪烁一次,持续10S)的动作了;
然后再这段语句后面启动另一个定时器,用来定时20S。可以让这个定时器定时50ms,然后循环变量加400次,就是20S的定时了。
在此期间,如果A键又按下了,就判断看定时器是否循环超过400次,如果超过了,就说明A键按下距离前一个状态已经超过20S了,这样的话,就重复 启动LED1(1S闪烁一次,持续10S)的动作,如果循环变量没超过400次的话,就说明 20S内A键已经被再按一次了,这样的话,就执行 LED2(0.5秒闪烁一次,持续20S) 这个动作。
而LED2(0.5秒闪烁一次,持续20S)的程序就是 LED2的IO口输出高电平,然后延时0.5秒,然后LED2口输出低电平,延时0.5秒。之后再用while或者for语句,循环这段程序10次,就能完成 LED2(0.5秒闪烁一次,持续20S)这个动作了。
当然,再键盘扫描程序中,如果按下的是B键的话,就直接让LED2口输出高电平。这样,LED2就会一直亮了追问

在20S内再按A键一次,则立即启动LED2灯(0.5秒闪烁一次,持续20S),我按照你的意思也差不多编写完了,但是那个在20S判别二次按键那部分不会写,麻烦可以再讲解一下这个吗?谢谢了

追答

比如用定时器1来定时20秒的判断。
首先给定时器1设置成定时50ms,打开定时器1的溢出中断,此时不要打开定时器,只是赋初值。这个没问题吧,再定时器1的中断程序里面设定个循环次数的变量,比如 k,这个K最好设置成全局变量,赋初值为0,然后在中断程序里面给定时器计数器重新赋初值,然后让k+1,即每50ms溢出中断,进入中断程序,给k加1,这样,k就是50ms的倍数了。
就是说如果20s到了的话,k就应该是等于400的,因为 400*50ms=20000ms=20s。
然后在执行那LED1,10s的动作后,把定时器1启动。当你第二次按下按键的时候,就用一个if语句,判断k是不是大于400的(如果大于400,就说明第二次按键离第一次按键的时间有20秒了,如果没大于400的话,就是说明没有到20秒)
有了这个判断,后面程序好写了吧

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-22
太奇葩了,居然用串口做io口

单片机c语言程序高手进 这个程序应该怎样实现中断
首先来个键盘扫描程序。采集是A键按下还是B键按下。如果是A键按下的话,就给LED1口输出高电平然后延时1S,延时程序可以用delay来粗略延时,也可以用定时器精确延时;延时1S过后,让LED1口输出低电平,然后再延时1S。给这段程序用while或者for语句来循环5次,这样就能得到启动LED1(1S闪烁一次,持续10S...

51单片机如何用一个按键控制一段程序的运行与停止
首先,你需要为你的项目创建一个新的文件,这是基础步骤,它将承载你的代码逻辑(1、在51单片机项目中,新建一个文件用于存放程序代码。)。接着,配置你的按键和LED。假设你选择的按键S1连接到P3的第2引脚,当按键按下时,可以通过编程使其对应P1的第5引脚点亮LED(2、按键S1的输入设置为P3^2,LED...

什么是C语言的中断程序 有什么用啊
通常根据中断源的优先级别,优先处理最紧急事件的中断请求源,即最先响应级别最高的中断请求。

单片机C语言延时程序怎么停止?
在循环里判断是否满足跳出的条件,满足则跳出循环,不满足就继续延时直到延时结束。具体的条件要有程序的要求来,比如说某个IO口的电平的状态。sbit state=P1^7;delay(uint){ uint x,y;for(x=1000;x>0;x--)for(y=1200;y>0;y--){ if(state==1)return ;\/\/当p1.7口为高时跳出循环 } ...

在用c语言写单片机程序时 应该把什么写在中断什么写在主函数什么写在w...
这个问题很泛哦 把上电后只做一次的任务写到主函数里, 比如基本的初始化 把需要不断循环做的任务放到while(1)里,比如轮询,IO状态查询 把不知道什么时间会发生(比如外部中断,按键中断等)以及需要保证准时发生的任务(比如定时器时间到)放到中断里 ...

单片机中怎样中断控制led灯隔一秒闪烁一次,c语言的,麻烦高手贴个程序看...
设置定时器时间间隔为1s,计数总共不到1s的话,就再定义一个变量,循环多次,以实现1s 然后再1s时的定时器中断子程序中设置输出脚的电平交替即可

51单片机的优先级怎么用C语言怎么写?
所以,相应的中断服务程序必须写在对应的中断向量的地址,但是由于两个相邻向量的地址之间的间隔太小,不能放下太多的指令,所以在用汇编写程序的时候一般是在其向量地址上面放一条跳转指令,而正真的中断服务程序写在别的地方。例如:ORG 0BH;定时器0中断向量地址 LCALL TIMER0;跳转到真正的中断...

单片机疑问:用c语言怎么实现中断结束后不返回原断点处?
可以根据中断返回的值一层一层地回到需要跳转的地方。比如返回0的话表示函数正常执行结束,返回2的话表示从函数里面跳出来需要跳到其他地方,然后依次类推,稍微修改下程序可以达到问题所需要的效果。

单片机c语言编了个流水灯,用按键怎么实现它暂停。
实现流水灯的方式有很多种(中断,定时器,延时等等),看用哪种方式,最简单的是延时做流水灯,那么在死循环里面增加按键检测,判断出有按键按下来时,再进入死循环,程序不往下走就可以暂停,再按跌出死循环。include \/\/51系列单片机定义文件 define uchar unsigned char \/\/定义无符号字符 define uint ...

关于单片机C语言的问题
1:你的示例中没有中断服务程序;2:中断发生后,如果当时没有其它同级或更高级的中断服务程序在执行,会马上停在正在执行的主程序,并记住这个位置,然后进入中断函数(当然CPU还要做些必要的处理,如压栈等操作);3:中断函数完后,程序会返回当初停止的那个位置,继续往下执行;4:示例中,当程序开始...

相似回答
大家正在搜