(四)
说到这里,我们来讲讲数码管的显示方式,可分为两种:动态扫描和静态显示。上面我
们所说的即为静态显示。但是如果我们采用动态扫
描显示,那么就可以解决上面的问题,即可以显示多个数码管了。上面我们所说的静态显示
把数码管的COM 脚接至VCC 或GND 端,其他的接至PX
口上,这样只要PX 口上输出相应的高低电平,就可以显示对应的数字或字符。但是如果我
们采用动态扫描的方法,比如显示6个数码管,硬件
连接可以这样解决:a--dp 还是接至P0.0--P0.7 上,还有 6 个 COM 脚再接至另外口的
P2.0--P2.5。P0 口作段选 (控制数字字符)P2 口作位选 (选
通哪个数码管导通)这样我们控制P0 和P2 口就可以控制6 个数码管了。但是,细心的朋
友,会问这样的问题:P2 位选,是让数码管一个一个亮
的,那还是不能控制6个一起亮或灭嘛!? ^_^ 想想好象是对的哦?怎么办...难道错了?
嘿嘿,问你个问题?黑夜里,拿着一支烟,在你面前快速的晃动,你会发现什么样的现
象?是不是原本不连续的点变成了一条看上去连
续的曲线或者直线!再回过头来,仔细想想我们的数码管!原理是一样的,你可别忘了,我
们的单片机可是一个计算机哦,计算机的运算速
度,大家可想而知吧!
这里再说说51单片机的机器周期和时钟周期等概念。所谓机器周期就是访问一次存储器
的时间。而1个机器周期包括12 个时钟周期。如果
单片机工作在 12M 晶体下,那么一个时钟周期为:1/12 微妙。一个机器周期12*1/12 1微
妙。如果晶体为6M,时钟周期和机器周期各是多少呢
?在汇编中,我们还要关心,指令执行的机器周期长短不一,有1个周期、2 个周期和4 个
周期等。
说着说着,跑了这么远了...还是回到原来的话题,如果我们把位选的P2也看作上面的“烟”
一划而过,那么我们看到的是不是6个一起亮
或一起灭了!^_^ 哈哈,原来如此... 记住,在任何某一时刻,有且只有一个数码管能
发光。如果你能把这句话理解了,你是真明白
我的意思了!朋友,现在给你个任务,让6个数码管分别显示 1、2、3、4、5、6。看你自
己可以搞定不?你自己先试着写写看咯...
#include
voidDelay(unsigned char a)
{
unsignedchar i;
while(--a ! 0)
{
for(i 0;i< 125;i++);
}
}
voidmain(void)
{
while(1)
{
P0 0x06;//1 的码段
P2 0x01;//选通一位,或者P2_0 1;
Delay(20);//延时约20毫秒
P0 0X00;//关闭显示
P0 0x5b;//2 的码段
P2 0x02;//选通一位,或者P2_1 1;
Delay(20);
P0 0X00;
P0 0x4f;//3 的码段
P2 0x04;//选通一位,或者P2_2 1;
Delay(20);
P0 0X00;
P0 0x66;//4 的码段
P2 0x08;//选通一位,或者P2_3 1;
Delay(20);
P0 0X00;
P0 0x6d;//5 的码段
P2 0x10;//选通一位,或者P2_4 1;
Delay(20);
P0 0X00;
P0 0x7d;//6 的码段
P2 0x20;//选通一位,或者P2_5 1;
Delay(20);
P0 0X00;
}
}
(五)
相信大家一定见过数字时钟,教学楼大厅一定有吧。每次路过,基本上只是随便瞟上一
眼,根本没去想过他的工作原理什么。但是今天
你也可以把他做出来了,是不是觉得自己很有成就感呢!呵呵!^_^
接上面所讲的,我们先来做个简单的实验:在一个数码管上轮流显示0--9 这 10个数字。
还楞着干什么,快动手写程序呀!好象有点难哦,
要不先不要往下看了,嘿嘿,关机吧,自己先去想想,怎么样?
#include
unsigned char code SEG_TAB[ ] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9
数字
voidDelay(unsignedint a)//unsigned int 定义为无符整形,取值范围为0--32768
{
unsignedchar i;
while(--a ! 0)
{
for(i 0;i< 125;i++);
}
}
voidmai