1.联系生活
我们已经学会控制无源蜂鸣器鸣叫的时间,那么作为本章最后一讲,联合我们学过的LED章节知识,写一个用开发板实现一个生活常见现象的代码,比如常见机器报警时,灯亮的时候蜂鸣器就响,灯灭的时候就不响,时间上表现为灯亮的时候蜂鸣器马上响,亮的时间和鸣叫的时间都为1秒,然后灯灭与鸣叫停止也持续1秒,循环往复就形成报警信号了。
#include <reg52.h> sbit BEEP = P1^6; sbit LED2 = P0^0; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延时1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void main() { unsigned int i,time; ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//让三八译码器的IO6输出低电平 ADDR0 = 0;//************************** while(1) { LED2=0; for(time=0;time<3700;time++)//软件调试出此处for循环用了1秒 { BEEP=!BEEP; for(i=0;i<30;i++); } BEEP=0;//固定住蜂鸣器的电平使其不响,其实这条语句也可不写,因为上面的for语句执行完就没有方波产生了也就不响了,大家可以注释掉这个语句看看现象是不是一样的 LED2=1; delay_ms(1000);//延时1s } }
用手机秒表同步来测还挺准的。
2.学以致用
既然我们学过函数封装,那么我们也意识到主函数中实现蜂鸣器鸣叫的部分可以把它封装起来,加入注释表示这个函数实现的是蜂鸣器鸣叫1秒,也就是用掉了CPU运行时间的1秒。
有了这个思路我们再重新思考,既然蜂鸣器鸣叫1秒占用了CPU运行1秒的时间,那么我们不就认为此时它对LED2来说就是一个延时函数了,所以我们再猜想,如果不用“void delay_ms()”做延时照样实现本讲所说的报警功能,有什么办法吗?
有!那就是用函数传参。
#include <reg52.h> sbit BEEP = P1^6; sbit LED2 = P0^0; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; void BEEP_ON(unsigned char x) { unsigned int i,time; for(time=0;time<3643;time++)//重新改写为3643才使软件调试出此处for循环用了1秒,因为加多了if else语句所以花费的时间就不一样了 { if(x==1) BEEP=!BEEP; else BEEP=0; for(i=0;i<30;i++); } } void main() { ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//让三八译码器的IO6输出低电平 ADDR0 = 0;//************************** while(1) { LED2=0; BEEP_ON(1);//参数为1,蜂鸣器就响1秒 LED2=1; BEEP_ON(0);//参数为0,引脚电平被固定,蜂鸣器不响,但还是占用了CPU运行1秒的时间 } }
对于初学者来说自己怎么也不会想得到这么巧妙的方法,是不是我们不适合搞编程呢。当然并不是,只是我们读的程序太少,分析和思考的时间还不够,所以说我们想熟悉整套流程是需要3个月来磨炼的!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程