本帖最后由 enderman1 于 2019-1-30 21:12 编辑
>说在前面的话:好久没更新了吧,挺愧疚的;其实吧,有两个原因:最近年前事情比较多+观察一波反响。不过个人感觉还不错,我决定继续更新。另外,最近看到本站有很多大神已经有发布完整的代码了,因此我决定就不再多余的放代码了哈哈,也就是说本系列仅仅是经验分享,当然必要的时候我也会添加一些核心的部分代码的;希望大家能够理解一下...
上回了解了电路之后,就该真正的使用了;我意识到有的人在拿到板子之后肯定会有所疑问:为什么这个板子上的蜂鸣器总是会响呢,更有甚者会以为是板子的问题;但是我们不得不养成遇到问题理性分析的习惯,既然这个蜂鸣器会响,就要分析电路关闭它:
【一】关闭蜂鸣器
这个就是那个蜂鸣器了,另一端有个N_BUZZ网络标签;寻找一下相同的网络标签:
不难发现连接在ULN2003的OUT7上 也就是说想要操作OUT7的话,要置位或者复位P06,而中间连接了一个锁存器,开启锁存器要置位Y5C:
(这是一个或非门)当Y5C为1时,WR=0,Y5=0;而WR通过跳线帽连接了GND始终为0所以让Y5为0就行了;
这个就是罪魁祸首138译码器了,通过操作P27 P26 P25来控制这一系列的东西....
而关闭蜂鸣器的方法还是比较多的,比如说:
1、对P2口进行总线操作,P2|=0xa0; P0&=0xbf;(复位操作蜂鸣器的引脚)
或者P2|=0xa0; P0|=0x40;(置位位操作蜂鸣器的引脚)
这样就可以开关蜂鸣器了
2、由于频繁使用138译码器(数码管,继电器,蜂鸣器,流水灯,点阵....),所以干脆把操作138译码器这3个IO口写成一个函数(可能这个思路还是比较普遍的,本站的一个dalao和我的思路是一样的,说我是抄袭的也没办法咯....)
void switch_138(unsigned char dat){
switch(dat){
case 0:P27=0;P26=0;P25=0;break;
case 1:P27=0;P26=0;P25=1;break;
case 2:P27=0;P26=1;P25=0;break;
case 3:P27=0;P26=1;P25=1;break;
case 4:P27=1;P26=0;P25=0;break;
case 5:P27=1;P26=0;P25=1;break;
case 6:P27=1;P26=1;P25=0;break;
case 7:P27=1;P26=1;P25=1;break;
//default:break;
}
}
就是这个函数了,用的时候直接switch_138(端口号4-7),然后P0相应操作就行了,它的好处就是增加代码的可读性,我更推荐这种方法...另外通过观察电路图会发现,0~3都可以使锁存器的数据锁存,所以这个函数使用非常方面,用就完事儿了。
【二】流水灯
其实有了刚刚的操作之后, 点灯就简单多了;这里不得不说,蓝桥杯开发板设计的还是很不错的,设计者为了扩展IO口可谓是“不择手段”,而51单片机典型的扩展IO口就是连接8255A,或者就是这个方法;P2口用作控制,P0口做为数据传输。
1、那么言归正传,对LED发光的操作就是对P0口的操作,用上边的switch_138(4),直接选通U6这个锁存器 P0口进行操作,至于操作的具体内容就要看题目内容了。。。2、
2、流水灯的操作有时就是可以看成一个固定的数组,显示的“动画”可以通过code 直接牺牲掉ROM来换来计算的速度;当然用各种循环判断移位也是可以的了;总之方法非常的多,没有必要一一举例。
下一期会谈一谈CT107D里数码管这个东西,里面涉及到延时和一些骚操作,所以内容会比较长(个人人为...),这期的东西可能有点少哈(因为流水灯确实没什么好说的,主要在于多多练习啊)欢迎在本帖下方评论留言 ,再见~
下方是流水灯相关电路:(谁会知道为什么会出现~于是就有了这句话....)
|