我们前面学习了如何创建工程,现在就来实现一个流水灯吧。
一、八位发光二极管
led灯原理图
下图为led灯的原理图:
led灯阳极:P0[7…0]
led灯阴极:共阴极,P2.3非
点亮led灯的条件
通电:P0=0xff
P2.3=1
模式:推挽输出
在实验板中,点亮led灯除了需要通电,还需要设置I/O口模式,可以通过设置寄存器P0M0[7…0]和P0M1[7…0]的值来实现,每一个led灯的I/O模式由P0M1和P0M0对应一位的组合决定(P0M1、P0M0共同控制了P0的I/O模式)
HIGH | LOW | I/O模式 |
---|---|---|
0 | 0 | 准双向口,灌电流可达到20mA |
0 | 1 | 推挽输出(强上拉输出,需加限流电阻) |
1 | 0 | 输入高阻 |
1 | 1 | 开漏模式,内部上拉电阻断开 |
P0M1和P0M0组合决定了8位led的I/O模式,如下图:
二、时间设置
四种周期:
振荡周期:晶体的振荡器周期(1/12us)
状态周期:振荡周期二分频得到的脉冲信号。前半部分和后半部分成为P1和P2,P1有效时完成算术路基运算,P2有效时完成内部寄存器的访问传输。
机器周期:完成一个基本操作所需要的时间成为机器周期。一个及其周期包含6个状态周期(12个振荡周期,即1us)
指令周期:CPU执行一条指令需要的时间。一般为1-4个机器周期。
软件延时函数:
延时:可以通过1ms可以执行多少条指令来定义函数,执行空操作来实现时间延迟。
STC-ISP延时函数:
三、流水灯实现
Init()函数:设置寄存器的值
sbit led_sel=P2^3;//P2^3----E3
uchar led;
void Init(){
P0M1=0x00;
P0M0=0xff;
P2M1=0x00;
P2M0=0x08;
led_sel=1;
}
描述:P0M1、P0M0设置led灯的I/O模式为推挽输出,P2M1、P2M0设置P2.3的I/O模式,设置P2.3=1使得led灯阴极姐低电平。这样Led灯在P0为0xff时就可以全亮了
Delay200ms()函数:延迟时间:
void Delay200ms() //@11.0592MHz
{
unsigned char i, j, k;
//_nop_();
//_nop_();
i = 9;
j = 104;
k = 139;
do{
do{
while (--k);
} while (--j);
} while (--i);
}
main()函数:控制led灯左移
void main()
{
Init();
led=0x01;
while(1)
{
P0=led;
Delay200ms();
if(led==0x80)
led=0x01;
else
led=led<<1;
}
}
描述:每隔200ms,P0的值左移一位,灯只有最左边的灯亮时,P0=0x01,即只有最右边的灯亮。这样,led灯就可以以自循环左移实现流水灯啦。
第二篇单片机学习笔记完结,cheers ! ??