admin管理员组文章数量:1592253
大家好,好久不见,今天给大家讲一讲如何实现C51单片机的数码管的显示,那么这次我会分为三个部分,第一部分是如何排布电路,第二个部分是代码的编写,第三个部分是拓展练习,那我们开始吧!
一、电路排布
1.首先我们打开ISIS Professional软件,先排布上C51单片机(如何排布看一下上一篇文章),接下来我们开始寻找我们的数码管,我们输入“7seg”即可,这里就是我们要找的数码显示管。
2.这次我选择的是一个共阳极的四位数码显示管,这里我给大家解释一下什么是共阳极什么是共阴极,就是说如果你是共阳极的话那么你的数码显示管的部分管脚输出的就是高电压,那么你想让他亮起来就需要你的单片机的管脚输出低电压啦,同时我再告诉大家一下如何辨别共阳极和共阴极,看到我画的红圈了吗,如果是“Anode”就是共阳极,如果是“Cathode”就是共阴极。
3.我们放置好后用线依次连接一下(如图),我现在给大家解释一下数码显示管的每个接口的意义,可以看到右手边的1234是指数码显示管上的哪一位如果你接通了“1”那么数码显示管的左边第一位数字就会亮,至于ABCDEFG DP可以看下方的第二个图,就是每一个英文字母对应的是哪个灯管,建议大家以右下角的小数点为准,这样以后判断哪一个管脚对应哪一个灯管就清楚了。
4.那么我们的电路排布就结束了下面就让我们打代码来实现我们想要的功能吧!
二、输入代码
1.首先我们打开我们熟悉的keil进行一系列的操作后我们就可以输入代码了(懂得都懂的,不知道朋友可以看一下我上一个文章),还是之前的建议,大家在这个版本的keil上打代码有时会出现一些奇怪的符号,所以建议大家可以先打在VS等软件上,最后复制上去就行。
2.现在开始,我现在想实现的是一个数码管可以显示4321的功能,废话不多说先上代码,这一部分就是和上一篇的文章一样我就不解释了,有点懒,不要打我,大家可以看看上一篇文章。
#include <reg51.h>
#define u16 unsigned int
3.这里面的code大家知道是什么意思吗,告诉大家我们的单片机内存比较小,如果不打code我数组里面的数据就会存储到RAM里面,也就是内存,这可能会导致单片机的内存不够用(C51单片机的内存有点小),那如果我们写上code的话就让其数据存储到ROM里面,也就是程序存储,这样数据的大小就会小很多。
u8 code shuzu[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
4.老样子,依旧是延时函数,应该不用我解释了
void delay(u16 num)
{
u16 x,y;
for (x = num; x > 0; x--)
for(y = 110; y>0; y--);
}
5.关于上面打的数组里面的数据的意思,我给大家举个例子比如说数组的第0位也就是0x40一个十六进制的数,我们转换到二进制就是0100 0000,大家看一下上面我给大家发的图,算了我再发一遍这个二进制从左大右每一位对用的字母是dp g f e d c b a一共八位位对应一个管脚,那因为我是共阳极所以我的单片机上输出的电压应该是低电压才会让对应的灯管亮所以0是亮,1就是灭。那么大家可以看一下我这个是什么数字,哈哈,猜对了就是数字零。我数组里的数字依次是按照0-9排列的大家可以再写看看试试。(二进制每一位对应的单片机的管脚也要注意哦,看看下面第6条的解释)
这里面我给大家讲一下P2是指我ABCDEFG DP这几个管脚对应的单片机的管脚(记得看着电路图来看这段话),这个不用我解释了,那P3就是有着我规定的哪一位亮的作用了,比如说P3 = 0x01就是说P3这一系列管脚里我只让P3.0 = 1(大家不要忘了ABCDEFG DP这几个口是输出高电压的,而1234口是输出低电压的,所以这里是0x01)而我的P3.0口接的正好是1这个位置所以最后的效果就是第一位亮,对应P2的值是数字4,至于delay()里为什么是2,大家可知我们一次只能亮一个位置的所以要想整体看起来4位都亮起来的话,我们只需把每次的延时时间调的很低,低到人的肉眼分辨不出来,这不就是看起来就像同时亮的嘛。
void main()
{
while(1)
{
delay(2);
P3 = 0x01;
P2 = shuzu[4];
delay(2);
P3 = 0x02;
P2 = shuzu[3];
delay(2);
P3 = 0x04;
P2 = shuzu[2];
delay(2);
P3 = 0x8;
P2 = shuzu[1];
}
}
6.整体的代码大家看一下
#include <reg51.h>
#define u16 unsigned int
u8 code shuzu[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
void delay(u16 num);
void main()
{
while(1)
{
delay(2);
P3 = 0x01;
P2 = shuzu[4];
delay(2);
P3 = 0x02;
P2 = shuzu[3];
delay(2);
P3 = 0x04;
P2 = shuzu[2];
delay(2);
P3 = 0x8;
P2 = shuzu[1];
}
}
void delay(u16 num)
{
u16 x,y;
for (x = num; x > 0; x--)
for(y = 110; y>0; y--);
}
7.复制到keil中就行了,生成hex文件。最后到仿真软件中我们看一下效果,是不是很nice呢(不懂如何生成hex文件的看看我上一篇的文章哦)
三、拓展练习
那么我们这个搞懂了,要不要试一试循环显示ABCD呢,至于哪个灯管该亮,哪一位该显示什么字母我就不说了,那我就说说既然我们要循环显示,那delay()里面的值就要大一些了,我的是500,大家随意。给大家看一下代码(电路还是之前的电路)
#include <reg51.h>
#define u16 unsigned int
void delay(u16 num);
void main()
{
while(1)
{
delay(500);
P3 = 0x01;
P2 = 0x08;
delay(500);
P3 = 0x02;
P2 = 0x0;
delay(500);
P3 = 0x04;
P2 = 0x46;
delay(500);
P3 = 0x8;
P2 = 0x40;
}
}
void delay(u16 num)
{
u16 x,y;
for (x = num; x > 0; x--)
for(y = 110; y>0; y--);
}
显示效果(不是动图,大家就乐呵看一下就行了)
结语:这次的讲解就结束了,希望大家喜欢,可能时间有点赶写的不好,大家多多见谅,不懂的私信或评论,我一定会竭尽能力解答,那么大家下次再见喽,拜拜!
版权声明:本文标题:如何用keil和ISIS Professional来实现数码管的显示 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728136820a1146851.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论