proteus仿真51流水灯和点阵(心形)
使用SDCC,不能简单套用keil环境下的语法,以下是SDCC中8051.h头文件与keil环境下reg51.h头文件的区别:
关于如何在proteus上调用在codeblocks上编写好的C51代码:
- 在proteus上双击51单片机或右击51单片机点击编辑属性
浏览到codeblocks编译后的hex文件即可。
现在开始流水灯:
原理图:
代码:
#include <mcs51/8051.h> void delay() { for(int i=0;i<100;i++) for(int j=0;j<100;j++); } int main() { while(1) { for(P1=0x01;P1<=0x80;P1=P1<<1) delay(); } }
运行结果:只能进行一次流水作用
原因分析:代码运行到P1=0x80时,进行左移后P1=0x00,在进行左移时P1一直为0x00,导致程序一直运行在for循环中。
解决方法(不唯一):
//将for循环改为如下形式 for(P1=0x01;P1>0x00;P1=P1<<1)
点阵(心形):
点阵:就是LED阵列,点亮通过操作行和列的电平来实现。列为共阳,行为共阴。
原理图:
![](https://img2018.cnblogs.com/blog/1735797/201907/1735797-20190708184133763-384091809.png)
代码:
#include <mcs51/8051.h> int a[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; int b[8]={0xf3,0xed,0xdd,0xbb,0xbb,0xdd,0xed,0xf3}; void delay() { for(int i=0;i<100;i++); } void main(void) { while(1) { for(int i=0;i<8;i++) { P2=a[i]; P1=b[i]; delay(); } } }
实现效果: