51单片机学习记录之经典流水灯
实现的功能
使用的51单片机型号为STC89C52RC,配置P1口与8个LED灯相连按照从左到右依次循环点亮再从右到左依次循环点亮,循环之间的间隔延迟为500ms=0.5秒。
使用的工具
51开发工具keil5必备开发软件, 以及51烧写软件stc-isp-v6.90。
程序的配置
在keil5里新建一个工程后新建一个mian.c文件带上51的头文件,这里多带上了一个#include "intrins.h"是会使用到_crol_与_cror_函数,_crol_的作用是对char类型的左移位,_cror_的作用char类型是右移位。
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
按照从左到右依次循环点亮再从右到左依次循环点亮间隔之间延迟500ms,这里需要对P1口初始化设置为P1=0x01;这样P1口就被设置为0000 0001 通过左右移位将1为高电平移位到每个P1的管脚上,形成流水灯。
void LED_run()
{
u8 i;
//从左到右移位
for(i=0;i<7;i++) //for循环6次
{
P1=_cror_(P1,1); //LED右移一位
Delay500ms();// 延迟500ms
}
//从右到左移位
for(i=0;i<7;i++) //for循环6次
{
P1=_crol_(P1,1);//LED左移一位
Delay500ms(); //延迟500ms
}
}
延迟是可以根据烧写软件stc-isp-v6.90来生成的延迟现在单片机的晶振和延迟时间就可以生成。
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
最后就是在main函数里将这些函数写进去。
void main()
{
P1=0x01;//初始化P1口
while(1)//循环
{
LED_run();//功能
}
}
最终的程序
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void LED_run()
{
u8 i;
//从左到右移位
for(i=0;i<7;i++) //for循环6次
{
P1=_cror_(P1,1); //LED右移一位
Delay500ms();// 延迟500ms
}
//从右到左移位
for(i=0;i<7;i++) //for循环6次
{
P1=_crol_(P1,1);//LED左移一位
Delay500ms(); //延迟500ms
}
}
void main()
{
P1=0x01;//初始化P1口
while(1)//循环
{
LED_run();//功能
}
}
之后就是对单片机进行烧写程序使用stc-isp-v6.90选择好芯片的型号,通讯口选择,打开文件程序下的hex文件,下方的下载程序等在烧写完成即可。