矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 5579|回复: 12

给初学者贴<2> ----学51单片机,点亮一个灯以后 --续《用软件的方法替代

[复制链接]
     
发表于 2014-5-21 16:44:34 | 显示全部楼层 |阅读模式
本帖最后由 yangcheng84 于 2014-5-21 17:00 编辑

初学贴<1>:http://www.crystalradio.cn/thread-552316-1-1.html
初学贴<2>:http://www.crystalradio.cn/thread-552827-1-1.html

给初学者贴<2> ----学51单片机,点亮一个灯以后  --续  《用软件的方法替代中低速逻辑门电路.》

在数电中,经常要用到组合逻辑门( 与门,或门,非门以及它们组合),对于简单功能的电路来说,去买几片门电路还是可以的,但是

电路稍微复杂一点,那么连线就不好连接了,线太多;另外,当需要多个门电路芯片时,其成本和使用1片单片机完成 成本几乎是一样的。

我一朋友在电离弧焊厂上班,该厂以前一直使用门电路做控制板,但生产坏品和市场返修品,生产车间维修人员表示非常不好修,表现在:

1. 使用的是插件门电路,不好拆

2. 对门电路工作状态不好分析,因此定位难

所以,他们惯用的办法就是大面积更换门 IC ,浪费了人力与物力。


后来朋友向经理谏言,推荐采用单片机做控制,化简电路提高可靠性和可维护能力。起初经理并不太赞成那样做,认为单片机太娇嫩了,但经过后来的


试行,维修人员反映,坏的少,就算坏了也好修,换单片机基本好了.这个是4年前的事情了.


前面说的就是实实在在的例子,好,我们切入正题:用软件的方法替代中低速逻辑门电路.


命题:用组合逻辑电路做一个 “三人表决器”,三人中,只要同意的人数占大多数,输出结构有效.

解:三个人表决看做是三个变量ABC,如果同意,表示变量值为1(高电平输入),否则为0(低电平),  用Y表示输出结果,Y=1(表示通过) Y=0(不通过)

根据以上分析,列出逻辑真值表
真值表.PNG



黄色的部分就是有效部分,先暂且 不做化简,把同意的情况加起来(图中黄色部分),共有4条, 假定分别用Y0,Y1,Y2,Y3表示它们,

那么最终结论就是Y=  Y0+Y1+Y2+Y3  这4钟情况有效

而Y0是由BC产生的;Y1是由AC产生的;Y2是由AB产生的;Y3是由ABC产生的;

所以:
Y=AB+BC+AC+ABC
表决器.PNG
买芯片组装,至少需要买 四二输入与门 2 PCS, 四输入或门1PCS



如果此处用单片机完成,那么就简单了。可以买8脚的STC15F104E芯片。
#include  <AT89X52.H>

#define    A   P1_0
#define    B   P1_1
#define    C   P1_2
#define    Y   P1_7

main()
{
While(1)
      {
         Y= (A&B) | (B&C) | (A&C) | (A&B&C) ;   //循环检测,判断
       }

}



在这里,

两个变量的“与”  比如AB之间与运算,C语言里写:  A & B;

两个变量的“或”  比如AB之间或运算,C语言里写:  A |  B;

如果是非运算,比如A的非,那就是  A=  !A           "!"就是非,翻译过来就是, A等于A的“非”;

而 括号" () " 表示的意思是优先计算,和数学中  y=3(x+1);  中用括号将3和X隔开道理是一样的.  尽管C语言里也有默认的优先级,但是,作为实用性,我们不去烤练这些东西,没把握默认优先的情况下统一加括号,即简明

又不会产生错误逻辑。

由此我们还可以查看更多的运算符号.用几次会记住了

评分

2

查看全部评分

     
发表于 2014-5-21 19:25:11 | 显示全部楼层
本帖最后由 绝对整烂 于 2014-5-21 19:54 编辑

进展太快了,楼主.为了记念这一贴,我用洞洞板焊一个实际的电路!

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2014-5-21 19:48:21 | 显示全部楼层
绝对整烂 发表于 2014-5-21 19:25
我在想,个用汇编如何实现?不用查表的话,用什么算法?或者看一下,UV4用的是什么方法?UV4是由顶尖 ...

   绝对烂整,我们不需要理会那个家伙,他总喜欢说一些让人以为很高深的话,官腔话,咱自己走!
回复 支持 反对

使用道具 举报

     
发表于 2014-5-21 22:39:57 | 显示全部楼层
本帖最后由 绝对整烂 于 2014-5-21 23:48 编辑

不对啊.P3.3上面没有高电平.这是为什么呢?
#include <AT89X52.H>
#define A P3_3
#define B P3_2
#define C P3_1
#define Y P3_4
bit x=0;

main()
{ while(1){
   x=(A&B)|(B&C)|(A&C)|(A&B&C);
   Y=!x ; //
   }
}
真的是按楼主说的那样,.用的是STC15F104E
IMAG1952.jpg
后面: IMAG1959.jpg

在楼主的指导下,改成这样:
#include <AT89X52.H>
#define A P3_2
#define B P3_3
#define C P3_1
#define Y P3_4

main()
/*P3=0xff;*/
{  P3=0xff;
while(1){
   Y=(A&B)|(B&C)|(A&C)|(A&B&C);
   }
}
原来STC15F104的P3口并不都是默认为高电平的,也可能是高阻抗,比如P3.3
回复 支持 反对

使用道具 举报

     
发表于 2014-5-21 22:40:09 | 显示全部楼层
谢谢楼主。请继续
回复 支持 反对

使用道具 举报

     
发表于 2014-5-21 22:46:29 | 显示全部楼层
芯片是正常的,我用汇编的程序试过.
我用的是跳线帽..
回复 支持 反对

使用道具 举报

     
发表于 2014-5-21 23:05:18 | 显示全部楼层
yangcheng84 发表于 2014-5-21 21:39
全文上下并没有说用按键输入,为啥要这么想呢?用常规的扳手开关不行吗?

A&B&C 这一项是不是多鱼的?
回复 支持 反对

使用道具 举报

     
发表于 2014-5-24 10:28:47 | 显示全部楼层
初学单片机的帖子定的很好真的有启发,谢谢了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2014-5-24 10:46:49 | 显示全部楼层
绝对整烂 发表于 2014-5-21 23:05
A&B&C 这一项是不是多鱼的?

是的,我帖子里说了,先不做化简式子,化简的话是可以消除掉.


化简,如果对布尔代数的特性不熟悉,有时也不见得一件很顺利的事情.
回复 支持 反对

使用道具 举报

发表于 2014-5-24 22:06:12 | 显示全部楼层
楼主是个热心人!赞一个!!!
回复 支持 反对

使用道具 举报

     
发表于 2014-6-13 23:26:43 | 显示全部楼层
绝对整烂 发表于 2014-5-21 23:05
A&B&C 这一项是不是多鱼的?

不是多鱼! 是多戳余!!    此话只有楼主能明白!!
回复 支持 反对

使用道具 举报

     
发表于 2019-5-16 09:37:31 | 显示全部楼层
很好的教程,谢谢分享。学习了,
回复 支持 反对

使用道具 举报

     
发表于 2019-5-16 09:58:22 | 显示全部楼层
讲解的很详细,谢谢了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-4 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表