历史上的今天
今天是:2025年08月20日(星期三)
2021年08月20日 | 51单片机-代码对比
2021-08-20 来源:eefocus
1.延时函数退出舞台
有了上一讲的理论讲解,代码的实现就比较简单了,实验现象就是高6位的6盏灯不停流水,我们用K4按键控制LED2的亮灭,并且途中并没有影响到6盏流水灯的运行。
我们知道以前流水灯是需要延时才能看得到流水现象的,那么现在再用延时函数的话,按键就没有意义了。比如流水灯的跳变需要间隔50ms才看得出是一个灯一个灯的亮,如果在死循环里使用“delay_ms(50);”,那么不支持连按代码里的times要加1都需要过了50ms才行,这样显然行不通,我们只能从流水灯的代码去思考了。
其实一次死循环里不一定就要求灯实现跳变,可以等到过了很多次死循环再去执行灯的跳变的,所以我们在死循环里让变量x每次加1,死循环了3000次之后再执行灯的跳变,这样不就能实现间隔50ms左右灯才跳变了吗,同时又不影响按键代码的times,也就是一次死循环所花费的时间被大大缩短了,扫描按键IO端口的机会更多了。那么延时函数在我们写一些高效率的代码的时候就很少去使用了,毕竟这样不仅影响执行效率,还会使某些功能模块失去作用。
2.流水灯代码新书写模式
#include sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; sbit LED2 = P0^0; sbit KEY4 = P2^7; void main() { unsigned char key_up=1;//定义记录按键状态值的变量,初始值为1避免程序一开始就进入了“if(key_up==0)” unsigned char i=0; unsigned int times=0; //用来记录进入过按键判断语句的次数 unsigned int x; //作为记录死循环的次数以达到间隔切换灯的跳变 ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//让三八译码器的IO6输出低电平 ADDR0 = 0;//************************** P2 = 0xF7;//让K4能具备有被拉低的条件先 while(1) { if(key_up==0) { times++; if(times>=1000&&KEY4==1) { times=0; LED2=!LED2; } } key_up=KEY4; //以下是流水灯任务部分 x++; if(x>=3000)//程序的运行已经过去50ms左右了 { x=0; P0=~(0x04< i++; if(i>=6)i=0; } } } 还是不明白“P0=~(0x04< 然后当i等于1时“~(0x04< 我们这个例程代码是对比了用“while(KEY4==0);”的时候是多么的不足,这样吧,我们把上面例程的这部分代码 if(key_up==0) { times++; if(times>=1000&&KEY4==1) { times=0; LED2=!LED2; } } key_up=KEY4; 改为以前初步学习的代码如下 if(KEY4==0) { delay_ms(10);//等待抖动过去 if(KEY4==0) //二次判断 { LED2=!LED2; while(KEY4==0); } } 延时函数大家再自己找以前的代码去添加,实验现象就是按键动作影响了流水灯的流速,如果按着不放直接导致停止流水。
上一篇:51单片机-流水灯的优化解说
下一篇:51单片机-双模式函数封装
史海拾趣
|
My Mini2440 board just arrived. I did copy the file rockbox.mini2440 (the Rockbox firmware which I did build before) to .rockbox folder on SD Card. After inserted the SD Card and turned power on, and waited a few seconds, I had ...… 查看全部问答> |
|
请教大家一个小问题,我有一个红外线遥控MP3 音箱,红外线遥控遇到什么障碍就不听使唤、遥控距离有限,就想把遥控改成无线的,可对无线不怎么董,想请大家帮帮忙。 我在网上找到带PT2272-M4编码器的遥控收发套件,这个能改吗? … 查看全部问答> |
|
哪位大虾能发给我个串口通信的实例呀??最好用EVC写的。。感激涕零。\\ 我的邮箱6094189ye@163.com 我看到书上有CSerial 这个类,但STANDARDSDK下面没有这个类呀。。。???… 查看全部问答> |
|
小弟正在学习楚狂人写的window文件系统过滤开发教程,在学习第三章分发例程,fast io 时碰到以下问题: _inline wd_void wd_fio_disp_set_query_standard( wd_drv *driver, wd_fio_query_standard_func func) { driver->Fa ...… 查看全部问答> |
|
目前,LED实现白光的方法主要有三种: 1、通过LED红绿蓝的三基色多芯片组和发光合成白光。 优点:效率高、色温可控、显色性较好。 缺点:三基色光衰不同导致色温不稳定、控制电路较复杂、成本较高。 2、蓝光LED芯片激发**荧光粉,由LED ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 void T0_time()interrupt 1 //返回值 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; shuchu574(); write_com(0x0c) ...… 查看全部问答> |




