51单片机(国信天长单片机实训平台)基于keli的常用程序之 共阳数码管一般静态控制程序设计
文章目录
- 51单片机(国信天长单片机实训平台)基于keli的常用程序之 共阳数码管一般静态控制程序设计
- 前言
- 一、国信长天单片机竞赛实训平台的电路图与分析
-
- 二、编写程序步骤
- 1.主程序
- 2.数码管代数编码
- 3.编写延时函数Delay
- 4.编写关闭外设函数
- 5.编写138选择函数
- 6.编写数码管控制函数
- 7.整合所有函数
- 总结
前言
实验目的:8个数码管分别单独依次显示0 ~ 9,所有数码管依次显示0 ~ F和- . 。
一、国信长天单片机竞赛实训平台的电路图与分析
国信长天单片机竞赛实训平台电路图
1.观察电路图
通过观察电路图,我们可以发现,数码管由a1~ dp1(h1)和com1~ com8控制,其中com1~ com4,com5 ~ com8分别控制两个四位数码管,a1~ dp1(h1)由个573移位寄存器连接电阻控制,com1~ com8由573寄存器控制,负责控制灯亮的位置,而寄存器分别由138的Y7与Y6控制。
2.关于数码管段码与显示的关系
16进制代码 | 显示的数字 | h | g | f | e | d | c | b | a |
---|
0xc0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0xf9 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
0xa4 | 2 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
0xb0 | 3 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
0x99 | 4 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
0x92 | 5 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
0x82 | 6 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0xf8 | 7 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
0x80 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0x90 | 9 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
0x88 | A | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
0x80 | B | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0xc6 | C | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
x0c0 | D | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0x86 | E | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
0x8e | F | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 |
0xbf | – | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
0x7f | . | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
如图所示,abcdefgh分别控制八个亮的部位,共阳级的意思是后端接阳极(1),接阴极(0)即可触发,则可以得到16进制的16个代数的二进制编码,a为低位,h为高位,改编成16进制编码,及为数码管段码。表格中列取的不代表是全部的,我们可以通过需要亮哪些,给它编码即可。
二、编写程序步骤
1.主程序
一般硬性格式的程序,因为一般都是这个框架,先让整体框架在你脑袋里形成,再一步一步完善。
主程序:
#include "reg52.h"
void main()
{
while(1)
{
}
}
2.数码管代数编码
将段码编写进入数组,调用时方便
unsigned char code smg_daishu[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
3.编写延时函数Delay
计算机执行程序的速度非常快,如果不主动添加延时函数让程序被动等待,则肉眼观察不到数码管的变化:
void delay(unsigned int t)
{
while(t--);
while(t--);
}
4.编写关闭外设函数
一般比赛需要关闭外设,同时防止给电时蜂鸣器乱叫:
void stop()
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2&=0x1f;
P2=(P2&0x1f)|0xa0;
P0=0;
P2&=0x1f;
}
关于底下这一行:
P2=(P2&0x1f)|0xa0;
上一篇文章有详细讲解,读者可以去自行阅读。这里是链接【单片机竞赛:LED灯的一般控制】。
5.编写138选择函数
void HC138(unsigned char n)
{
switch(n)
{
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
}
因为需要用到Y6与Y7两个端口,所以通过switch选择使用哪种。
6.编写数码管控制函数
void showsmgb(unsigned char dat,unsigned pos)
{
HC138(6);
P0=0x01 << pos;
HC138(7);
P0=dat;
}
void shousmga()
{
unsigned char i,j;
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
{
showsmgb(smg_daishu[j],i);
delay(60000);
}
}
for(j=0;j<16;j++)
{
HC138(6);
P0=0xff;
HC138(7);
P0=smg_daishu[j];
delay(60000);
}
}
1.Y6控制位置,Y7控制输入,shousmgb为通过选择HC138的端口,来输出所以需要的输出的东西
2.showsmga第一个for循环嵌套一个for循环,懂得c语言基础的读者很容易了解到,为了从首到尾依次亮,i为位置,j为数据。如有需要了解参寻五毛变向的博客。
3.第二个for循环为全亮,将smg_daishu[j];中的所有数据依次显示。
P0=0x01 << pos;
关于上面一行,这里为什么是左移运算符,因为数码管从左到右亮,其实为从数据的低位到高位,但是计算机中二进制低位在右,所以是左移运算符。
7.整合所有函数
#include "reg52.h"
void delay(unsigned int t)
{
while(t--);
while(t--);
}
unsigned char code smg_daishu[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void HC138(unsigned char n)
{
switch(n)
{
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
}
}
void showsmgb(unsigned char dat,unsigned pos)
{
HC138(6);
P0=0x01 << pos;
HC138(7);
P0=dat;
}
void shousmga()
{unsigned char i,j;
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
{
showsmgb(smg_daishu[j],i);delay(60000);
}
}
for(j=0;j<16;j++)
{
HC138(6);
P0=0xff;
HC138(7);
P0=smg_daishu[j];
delay(60000);
}
}
void stop()
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2&=0x1f;
P2=(P2&0x1f)|0xa0;
P0=0;
P2&=0x1f;
}
main()
{ stop();
while(1)
{
shousmga();
delay(60000);
}
}
将所需要循环的放入主函数的for循环中,将关闭外设代码放入主函数中,大功告成。
总结
将数码管所需显示的数据放入数组中存取,是一个良好的编程手法,如需显示其他的也可以这样使用,搞清楚com端与所显示的区别,关于数码管静态编程的部分你就掌握的差不多啦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)