如果没有积分的同学可以,关注微信公众号吴小凹,发送点亮led 也可以获取该文件。
1. 找到proteus 工程文件。如果没有安装proteus 可以参考我的这篇博客。
51单片机仿真利器,proteus 8.13安装与激活_吴小凹的博客-CSDN博客
放置总线。
点完总线标记后,鼠标在固定位置再左键点击下,即可开始画线。
3.将P0端口都连接到总线上方即可。
点击端口末尾,或者快捷键w都可以完成连线。
4.放置8颗LED灯。可以放置一颗摆好位置后面直接复制即可。
电阻改成1k,一下即可,但是也不能太小了。
5.完成8颗led的复制。
6.关于元器件的选择及其修改参数,可以查看点亮led的那篇文章。
keil+proteus 完成最小系统,点亮led 灯实验_吴小凹的博客-CSDN博客
7.添加网络标号,网络标号就是使用一个字符代表两个地方是连在一起的意思。总线其实就相当于一个束线器而已,并没有连接上.
8.两边网络标号添加完成如下图所示。
9.给LED添加电源符号。共阳极8颗LED就连接好了。
修改程序:
1.选择led.文件夹。
2. 双击工程文件。如果没有安装软件可以参考我的这篇博客。
如何安装使用keil c51 安装并激活到2032-CSDN博客
3. 首先我们先改下代码,让8颗灯都亮起来。
/*51单片机的头文件*/
#include
/*主函数*/
int main()
{
/*拉低P1端口*/
P0=0;
/*单片机等待*/
while(1);
}
4. 编译生成hex,该步骤不在重复,请参考博文:
keil+proteus 完成最小系统,点亮led 灯实验_吴小凹的博客-CSDN博客
5. 此时文件下载到单片机的运行结果如下图。
6. 我们先将其修改为闪烁状态,加入延时代码。
/*51单片机的头文件*/
#include
// 引入stdint.h库,这个库提供了几种固定的整数类型。
#include
// 定义一个函数,名称为delay_ms,接受一个无符号16位整数(uint16_t)作为参数,表示延迟的毫秒数。
void delay_ms(uint16_t nms)
{
// 定义一个无符号8位整数(uint8_t),名称为i,用于循环控制。
uint8_t i;
// 进入一个while循环,条件是nms大于0。当nms为0时,跳出循环。
while(nms--)
{
// 进入一个for循环,循环次数是120次,i的值从0递增到119。
for(i=0;i<120;i++);
}
}
/*主函数*/
int main()
{
/*单片机等待*/
while(1)
{
/*拉低P1端口*/
P0=0x00;
delay_ms(500);
/*拉低P1端口*/
P0=0xff;
delay_ms(500);
}
}
下载代码后的效果会按照一定的频率进行闪烁。
7. 实现流水灯,我们发现根据我们的电路只需要给它0.就能亮给它1就是灭,我们要实现流水灯,就得每次点亮一颗,然后让其他熄灭。
逻辑1:点亮第一颗灯,其他灯熄灭。
逻辑2:点亮第二颗灯,其他灯熄灭。
……
但是如果是几十颗灯我们不能没个都写一个代码吧,所以我们,定义一个变量,让它每次向左移动一位,就可以了,代码如下。
/*51单片机的头文件*/
#include
#define uint16_t unsigned short
#define uint8_t unsigned char
// 定义一个函数,名称为delay_ms,接受一个无符号16位整数(uint16_t)作为参数,表示延迟的毫秒数。
void delay_ms(uint16_t nms)
{
// 定义一个无符号8位整数(uint8_t),名称为i,用于循环控制。
uint8_t i;
// 进入一个while循环,条件是nms大于0。当nms为0时,跳出循环。
while(nms--)
{
// 进入一个for循环,循环次数是120次,i的值从0递增到119。
for(i=0;i<120;i++);
}
}
/*主函数*/
int main()
{
uint8_t i;
/*单片机等待*/
while(1)
{
for(i=0;i<8;i++)
{
/*拉低P1端口*/
P0=0x01<
实验现象:会有一个灯循环的灭。
和我们的想法有点差距,但是离胜利不远了,只需修改一句代码即可,
将
P0=0x01<
修改为
P0=~(0x01<
将所有的灯取反就正好是流水灯的状态,修改完下载代码后效果如下。
到此我们流水灯实验就结束咯,我们下次再见,友友们。