基于stc51单片机的电子时钟设计
硬件资源
焊接电路板中使用STC系列单片机,一个四位一体数码管、一个二极管,以及一些必要辅助子电路。数码管的位选端口为P3^0、P3^1、P3^2、P3^3,段选端口为P1的8个端口;调节小时、分钟端口分别为P0^0、P0^4,二极管指示灯接P2^2口。
由于使用的数码管为共阳极数码管,因此根据数码管结构图可知,P3口必须置高电平选通其中一位,P0口低电平点亮相应的断码,这和共阴极数码管0x3f代表0不一样,这里表示为0xc0,编程时应该注意。
在数码管的段码连接上,我用的是a、b、c、d、e、f、g、h所对应的管脚11、7、4、2、1、10、5、3分别接P1^0、P1^1、P1^2、P1^3、P1^4、P1^5、P1^6、P1^7。因此,如果要显示一个数字3的话,由排列 hgfe dcba 得到 1011 0000 就是0xb0,但是不太确定P1口高低位是如何的,因此必须经过测试程序进行确定。
#include reg52.h>
#define uint unsigned int
void delay(uint cnt) //延时(cnt)ms
{
uint i;
while(cnt--)
{
for(i=0;i 110;i++);
}
}
main()
{
while(1)
{
P2=0x00;
P3=0xaa; //选通其中的两位
P1=0xc0; //段码赋值1100 0000
delay(20);
}
}
通过测试,得到的结果为0000,且指示灯亮。由于段码:h、g、f、e、d、c、b、a对应着断码之P3=hgfedcba,所以低位对低位,a、b、c、d、e、f、g、h分别接P1^0、P1^1、P1^2、P1^3、P1^4、P1^5、P1^6、P1^7是正确的。
当P1=0xc0时,P1=1100 0000,也就对应着a=b=c=d=e=f=0点亮(低电平),g=h=1熄灭(高电平)。两外对于选位P3=0xaa,实际只接了P3的前4个端口,即低4位端口,也就是1010,其中P3^0=P3^2=0,而P3^1=P3^3=1。再根据数码管选位端口12—9—8—6,我把12接P3^0、9接P3^1、8接P3^2、6接P3^3。
12
------------------------------------------------------------------------
A B C D E F G H
11 7 4 2 1 10 5 3
------------------------------------------------------------------------
9
------------------------------------------------------------------------
A B C D E F G H
11 7 4 2 1 10 5 3
------------------------------------------------------------------------
8
------------------------------------------------------------------------
A B C D E F G H
11 7 4 2 1 10 5 3
------------------------------------------------------------------------
6
------------------------------------------------------------------------
A B C D E F G H
11 7 4 2 1 10 5 3
------------------------------------------------------------------------
选位这里和硬件的连接方式有关,这里不再多说,不过做时钟的时候只可能一次扫描一个位的段码值,这里为了直观起见,可以采用一一映射方式对选位的四个值进行编码。
tab[4]={0x01,0x02,0x04,0x8}; //从左至右第n个数码管点亮需要向P3口送入的值;
tab1[4]={tab[0],tab[1],tab[2],tab[3]}; //从左至右选通第几个数码管?
这样,只需要关注第几个点亮就可以,不需要关注点亮时具体该向P3口输出的值。我使用的数码管并非标注的四位一体七段数码管,中间含有两个连体的二极管组成的两点,可以做时钟的小时同分钟的分隔符,它由8号管脚选通,由h管脚也就是3号管脚置低电平点亮。
小结:
选段选位怎么选不用太多关注,因为这和硬件的链接方式有关,再设计硬件的时候,尽量直观。根据寄存器P1 的值,比如01111111,这里有个高位低位的问题,当把这个值送至寄存器P1时,是按照高地位匹配的方式进行分配的,当然要知道P1^0时低位,而P1^7是高位,于是有P1^7=0。
- 基于stc51单片机的光立方c语言源代码(11-30)
- STC51单片机SPI接口单主单从模式通信-汇编语言(11-30)
- Atmel和STC的51单片机通用ISP下载线制作(11-29)
- STC51单片机的下载问题相关(11-28)
- stc51单片机内部扩展RAM应用(11-22)
- 调整单片机时钟精度的解决方案(10-04)