当前位置:首页 > 单片机 > 单片机
[导读] 电路:P0.0、P0.1 分别外接一个 LED,输出高电平时,LED 发光。   P2.0 外接一个按键。请“不用延时程序”写个这样的程序:当按键不按的时候,LED(D1)先以1秒的时间快闪三下,然后再以3秒的时间慢

电路:P0.0、P0.1 分别外接一个 LED,输出高电平时,LED 发光。
   P2.0 外接一个按键。
请“不用延时程序”写个这样的程序:
当按键不按的时候,LED(D1)先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。
若按下按键后,LED(D2)先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。
是不用“不用延时程序”写的哦。(*^__^*)……

问题补充: 请用C语言写。
当按键按下、松开,都应该立即转到相应的 LED 先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。


;============================================
最佳答案:“不用延时程序”,就是要求用定时器控制时间,这和时钟程序的思路是相同的。
下列程序,已经调试成功:
//-----------------------------------------------
#include

unsigned char n_25ms, M1_n, M2_n, Last_p2, in_p2;
unsigned char code O_c[] = {
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00};
bit TT_f;
//-----------------------------------------------
void main()
{
P0 = 0;
TMOD = 0x01;
TH0 = (65536 - 12500) / 256;//12.5ms@12MHz
TL0 = (65536 - 12500) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
n_25ms = 0;
M1_n = 0;
TT_f = 0;
Last_p2 = P2;
while(1) ;
}
//-----------------------------------------------
void T0_INT() interrupt 1
{
TH0 = (65536 - 12500) / 256;//12.5ms@12MHz
TL0 = (65536 - 12500) % 256;
n_25ms++;
//**********************************按键检测与状态的变换
in_p2 = 8;
if (P2 == 255) in_p2 = 0;
M2_n = 8;
if (TT_f) M2_n *= 3;
if (P2 != Last_p2) {
Last_p2 = P2;
n_25ms = M2_n;
M1_n = 0;
TT_f = 0;
}
//**********************************
if (n_25ms == M2_n) { //如果到预定的时间
n_25ms = 0; //清零
M1_n++; //输出下一个数据
if (M1_n == 8) { //输出8个了?
M1_n = 0; //清零
TT_f = ~TT_f; //变更状态
}
P0 = O_c[M1_n + in_p2];//输出数据
}
}
//-----------------------------------------------
注意,P0口需要加上上拉电阻。
;============================================

;============================================
后记:

这个题目的要求有些令人费解,即要有定时中断,还有按键的检测,按键不变时,输出还要有两种花样。

有人给出了如下的建议:
-------------------------------------------------
用定时器吗!你先做出1秒的基准,3个基准就是3秒。
主函数用:
if(按键标志位位0) {
for(循环3次) {点亮LED1,一秒后,灭LED1}
for(循环3次) {等3秒,点亮LED1,3秒后,灭LED1}
else {
for(循环3次) {点亮LED1,一秒后,灭LED1}
for(循环3次) {等3秒,点亮LED2,3秒后,灭LED2}
}
没有写定时程序,自己写吧
回答者: ---------- | 四级 | 2011-9-29 11:19
-------------------------------------------------
这个回答,缺少按键变化时,“即时”更改显示位置的功能,LED 闪烁的也明显不对。
这个回答,在主程序里面,放了这么多的循环!呵呵,这也太占用 CPU 的资源了。
这个回答,可以到原题网址看到原文。

做而论道写的程序,思路和定时时钟、定时的交通灯,基本一致。
在中断函数中,仅仅用下面几行,就进行了按键检测与状态的变换:

//**********************************按键检测与状态的变换
in_p2 = 8;
if (P2 == 255) in_p2 = 0;
M2_n = 8;
if (TT_f) M2_n *= 3;
if (P2 != Last_p2) {
Last_p2 = P2;
n_25ms = M2_n;
M1_n = 0;
TT_f = 0;
}
//**********************************

这些程序,每隔 12.5ms 才执行一遍,执行时,也用不上几十微秒,对系统资源的占用,是很微小的。
这样,主函数,就几乎可用全部的时间,执行各种程序。

做而论道编写的程序,完全没有使用那么多的循环,同样可以满足题目的要求,大家可以自己实验。

上述的程序是如何解释的,这就不好说了,读者的水平参差不齐,有缘者自己领会吧。
;============================================


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭