硬件:普中科技51开发板(HC6800-EM3 V2.2)
软件:Keil V5.37.0.0
MCU: STC89C516
通过51单片机控制8个LED灯依次点亮,形成流水灯。
(1) LED控制涉及到74HC573芯片,上图中的U13。想知道该芯片如何工作的,应该看他的数据手册。
(2)74HC573芯片手册参考链接74HC573数据手册 - 百度文库。
(3)74HC573引脚:OE(output enable), LE(latch enable)
(4)74HC573芯片是一个锁存器,简单来说就是由输入引脚Dx来控制输出引脚Qx(X等于0-7)。OE和LE影响Dx控制Qx的结果。
(5)当OE为L,LE为L时74HC573工作在锁存模式,此时Qx的输出被锁存(进入锁存状态之前是高就一直是高,是低就一直是低,这就叫锁存。),这就是锁存器的作用。
(6)当OE为L,LE为H时74HC573工作在跟随模式,此时Qx的输出跟随Dx的输入变化而变化。此时逻辑上可以认为74HC573是透明的。
LED灯也就是我们所说的发光二极管,LED灯分为阳极和阴极。具有单向导电性。只有阳极接正,阴极接低,LED才会被点亮。根据图中,LED阴极接地,所以阳极应该接正极。
总结:这里通过P0端口接J12端口,P0端口的引脚输出高电平,则相对应的LED灯被点亮。
P00对应D11,......... P07对应P18。
(1)跑马灯和流水灯: 流水灯是8颗LED其中7灭1亮,亮的在移动;跑马灯是8颗LED7亮1灭,灭的在移动。
/*头文件包含*/
#include
#include
/*函数声明*/
void Delay_ms(unsigned int n);
void main(void)
{
unsigned char i = 0;
P0 = 0x00; /*关闭所有LED灯*/
while(1)
{
for(i = 0; i < 8; i++)
{
P0 = 0x01 << i;
Delay_ms(500);
}
}
}
#if 1
void Delay_ms(unsigned int n) //@12.000MHz 12Tģʽ
{
unsigned char i, j;
for( ; n>0; n--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
#endif
(1)51单片机我们使用最多的就是宏晶科技的单片机,该厂家单片机可到官网(STC: 32位 8051 单片机创新者, ISP/IAP 技术创新者,中华有为:除了胜利,我们已无路可走http://www.stcmcudata.com/)下载软件STC-ISP软件。
(2)打开软件,点击keil仿真设置页面中的“添加型号和头文件......”按钮,在弹出的“浏览文件夹”中,选择keil的安装目录,目录下需要有C51目录和UVx目录存在。
(1)以STC89C516单片机为例。
(2)查看该单片机的外接晶振频率,这里外接的晶振为12MHz。
(3)该单片机可选择工作在12T模式和6T模式。即12时钟/机器周期和6时钟/机器周期。(说人话就是一个机器周期等于12个时钟周期就是12T,一个机器周期等于6个时钟周期就是6T)。
(4)现在新出的很多单片机都是1T的。
(5)单片机中常见的周期
晶振周期:晶振振荡的周期,一般也称为振荡周期。也就是晶振振荡一个周期所花的时间,比如1MHz晶振震荡周期是 1/1MHz(1/1000000)s,也就是1微妙。
时钟周期:时钟周期,如果晶振的输出没有经过分频或倍频就直接作为cpu的工作时钟,则时钟周期就等于晶振的振荡周期;如果晶振的输出经过分频或倍频后作为cpu的工作时钟,则时钟周期就就是分频或倍频后的。即时钟周期是CPU的实际工作频率的倒数。51单片机没有分频或倍频,而STM32中有。51单片机中晶振周期等于时钟周期。
注:学习51单片机经常看见时钟周期就是振荡周期这种说法是不够严谨的。
机器周期:机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。
注:机器周期要跟指令集设计有关是时钟周期的倍数,晶振周期只跟硬件脉冲的周期有关。
总结:先由晶振产生一定的晶振周期,晶振周期提供给单片机,(单片机内部可以分频或倍频)经过分频,单片机按照时钟频率工作,若干个时钟周期可以执行完一条指令的其中一部分。
(1)使用单片机小精灵软件,我已上传到我的CSDN,不用积分下载的。
该软件进行软件延时也非常的方便,选在外部晶振的频率和单片机是多少T的就行。
(2)使用STC-ISP软件。
该软件在复制代码时如出现_nop_();需要包含头文件intrins.h。
#include
该指令为单周期指令,只消耗一个机器周期。
补充:使用STC-ISP软件延时时,选择不同的8051指令集,生成的代码不同,根据所使用的单片机型号进行选择。例如:选择STC89C516时选择STC-V1指令。