单片机数字滤波程序(缘缘学单片经验手记)

说了那么多的LED,再说估计就真挨骂了,这节缘缘带你们去看看两个在数码管显示时最常用到的两个芯片吧,看看它们是怎么工作,想信你一定会有兴趣的:

以前我们控制数码管时,都用两个P口去控制它们,那么如果单片机的其它P口都被占用了,只有一个P口时,能不能控制8个数码管呢,答案是肯定的,借助外围 芯片可以很容易实现,这里我们用两种简单的芯片控制,其实这两个芯片就是74 573类与74 138类的,缘缘用的是74HC573和74HC138,其它的命名不一样,但工作原理是一样的,我们一起看看吧:

74HC573:

记得缘缘最开始时,常被这个芯片搞昏了头,什么段选控制了,位选控制了,咱先不用管它,先看看这个74HC573芯片的工作原理是怎么回事,虽然有芯片的说明文档,但缘缘觉得那看起来不易理解,所以缘缘就根据说明文件,画了一个图来:

单片机数字滤波程序(缘缘学单片经验手记)(1)

我们看到,这个573芯片是20管脚的,除电源的两根外,有8根输入和输出,这样就只剩下了两个管脚了:即OE和LE,那么这两个是干什么的呢,OE是 三态使能输入,低电平有效,意思就是当这个管脚接成低电平时,这个芯片才会工作,不然输入和输入都不工作,LE是什么意思呢,锁存使能输入,意思就是控制 输入与输出状态的,我们看到,当LE为低电平0时,输入有效,但输出无效,当LE为高电平1时,输入有效,输出也有效。

通过前面的分析,我们得知,我们控制这个芯片时只控制OE和LE就行了,一般地,要设置成芯片输入输出有效工作,所以直接把OE设成低电平,即接地状态, 而对LE控制来控制是否输出,以达到应用要求,8根输入接单片机P口,8根输出接外载,那么我们看看它是如何控制8个数码管的:

单片机数字滤波程序(缘缘学单片经验手记)(2)

我 们看到这个芯片是16管脚的,除了两根电源与8根输出端口外,就只剩下了6个端口了,除了三个数据输入端口(ABC)外,有3个使能输入端(G1、 G2A、G2B),这三个使能端的电平是二低一高有效,也就是只有在这种情况下,输入与输出才能正常工作,所以在电路应用中,将两个低电平的接地,只控制 一个高电平的,当高电平时,输入输出有效,当为低电平时,输入输出无效,对于ABC的组合,上图中标示得很清楚了,也就是ABC的高低电平排列组合会让8 个输出端的管脚进行低电平0输出,我们先看看在电路中是如何应用的(一般在数码管显示时与573等芯片配合使用)

单片机数字滤波程序(缘缘学单片经验手记)(3)

我们写个程序看看是怎么样的效果:

#include

#define uint unsigned int

#define uchar unsigned char

uchar numdu,numwei;

sbit dula=P2^7;//控制573段码显示

sbit wei=P2^6;//控制138输出

sbit a=P2^0;//138数据端口abc

sbit b=P2^1;

sbit c=P2^2;

uchar code table[]={

~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};

void delay(uint z);

void main()

{

numdu=0;

numwei=0;

wei=1;//1为138输出有效

while(1)

{

dula=1;

P0=table[numdu];

dula=0;

if(numdu==16)

numdu=0;

switch(numwei) //使用switch 语句控制位选 也可以是用查表的方式

{

case 0:a=0; b=0; c=0; break;

case 1:a=1; b=0; c=0; break;

case 2:a=0; b=1; c=0; break;

case 3:a=1; b=1; c=0; break;

case 4:a=0; b=0; c=1; break;

case 5:a=1; b=0; c=1; break;

case 6:a=0; b=1; c=1; break;

case 7:a=1; b=1; c=1; break;

}

numwei ;

if(numwei==8)

numwei=0;

delay(2000);

}

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

这里有个switch语句,那么这条语句是啥意思呢?

C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:

switch(表达式){

case常量表达式1: 语句1;

case常量表达式2: 语句2;

case常量表达式n: 语句n;

default:语句n 1;

}

其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后 的语句。

【例4.9】

main(){

int a;

printf("input integer number: ");

scanf("%d",&a);

switch (a){

case 1:printf("Mondayn");

case 2:printf("Tuesdayn");

case 3:printf("Wednesdayn");

case 4:printf("Thursdayn");

case 5:printf("Fridayn");

case 6:printf("Saturdayn");

case 7:printf("Sundayn");

default:printf("errorn");

}

}

本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。 这是与前面介绍的if语句完全不同的,应特别注意。

为了避免上述情况,C语言还提供了一种break语句,专 用于跳出switch语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。

【例4.10】

main(){

int a;

printf("input integer number: ");

scanf("%d",&a);

switch (a){

case 1:printf("Mondayn");break;

case 2:printf("Tuesdayn"); break;

case 3:printf("Wednesdayn");break;

case 4:printf("Thursdayn");break;

case 5:printf("Fridayn");break;

case 6:printf("Saturdayn");break;

case 7:printf("Sundayn");break;

default:printf("errorn");

}

}

在使用switch语句时还应注意以下几点:

  1. 在case后的各常量表达式的值不能相同,否则会出现错误。

  2. 在case后,允许有多个语句,可以不用{}括起来。

  3. 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。

  4. default子句可以省略不用。

看明白了吗,这条语句就是先以switch括号中的值为参照,然后依次判断大括号里面的值,如果与switch后面括号中的值一样时,就执行后面的语句,否则就会跳出这条语句来。

现在的亲对这两个芯片很熟悉了,上面的原理图是缘用芯片的实际管脚绘制的,所以亲们在应用这两个芯片的时候,就按缘缘画的管脚去接线,肯定不会错的,祝亲们成功哦,缘缘就不做这个实验板了,亲们,咱们下节见哦。

了解全系列缘缘单片机系列教程,请关注微信公众号ickeybbs,回复“缘缘”。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页