一、Proteus部分
1、保存项目
(一)【文件】\rightarrow保存设计
(二)某盘\rightarrowProteus(双击)\rightarrow空白处右键\rightarrow新建文件夹\rightarrow 重命名“项目”
(三)双击项目\rightarrow文件名输入“1.流水灯” \rightarrow保存
(四)点击元件模式(左侧黄色运放按钮)\rightarrow点击“P”
(五)输入关键字\rightarrow选中器件\rightarrow确定
(六)放置元器件
先单击元件的关键字\rightarrow在原理图编辑窗口的合适位置再次单击即可
双击元器件的值即可修改
放置VCC
电路原理图如图所示
2、烧录程序
双击单片机\rightarrow点击Program File后面的文件夹标志\rightarrow上传.hex文件\rightarrow确定
若仿真时出现Cannot open ‘C:\User\XXX\AppDate\Local\Temp\LISA4823.SDF’
步骤:右键“此电脑”–>属性–>高级系统配置–>环境变量–>将“用户变量”和“系统变量”中TEMP与TMP的变量值改为%SystemRoot%\TEMP。
二、keil部分
1、创建项目
(一)新建一个文件夹保存项目
(二)双击"keil"\rightarrow“项目”\rightarrow“新uVision项目”
(三)将文件命名为项目名
(四)选择单片机型号
(五)单击“是(Y)”
(六)新建Text
(七)保存
(八)命名“.c”文件
(九)双击“Source Group 1”
(十)添加“.c”文件
(十一)生成.hex文件
点击“输出”\rightarrow勾选“创建HEX文件”
(十二)编译
2、参考程序
(一)位操法
缺点:代码冗长
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit L1=P1^0;//将P1^0赋值给变量L1
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;
sbit L5=P1^4;
sbit L6=P1^5;
sbit L7=P1^6;
sbit L8=P1^7;
void delay(uint n)//延时函数(n)ms
{
uchar i;
uint j;
for(j=0;j<n;j++)
for(i=0;i<123;i++);
}
void flash1()//LED1亮0.5s后熄灭
{
L1=0;//LED1亮
delay(500);
L1=1;//LED1灭
}
void flash2()
{
L2=0;
delay(500);
L2=1;
}
void flash3()
{
L3=0;
delay(500);
L3=1;
}
void flash4()
{
L4=0;
delay(500);
L4=1;
}
void flash5()
{
L5=0;
delay(500);
L5=1;
}
void flash6()
{
L6=0;
delay(500);
L6=1;
}
void flash7()
{
L7=0;
delay(500);
L7=1;
}
void flash8()
{
L8=0;
delay(500);
L8=1;
}
void main (void)
{
while(1)
{
flash1();
flash2();
flash3();
flash4();
flash5();
flash6();
flash7();
flash8();
flash8();
flash7();
flash6();
flash5();
flash4();
flash3();
flash2();
flash1();
}
}
(二)数组总线法
优点:代码简短
缺点:点亮数据编写比较麻烦,且容易出错
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//前8个数据为左移点亮数据,后8个数据为右移点亮数据
void delay(uint n)
{
uchar i;
uint j;
for(j=0;j<n;j++)
for(i=0;i<123;i++);
}
void main (void)
{
uchar i;
while(1)
{
for(i=0;i<16;i++)
{
P1=tab[i];
delay(500);
}
}
}
三、LED流水灯
这个是最常用的仿真实验,主要是对P口的输出信号,一般都是共阳极,给低电平点亮。如果共阴极高电平点灯则电流小,驱动不够。这共阳极接上拉电阻,阻值低则LED越亮,但是不能太低,太低则输出态为高阻态。51单片机的P0口是一个OC门输出的I/O口,所以要加上拉电阻才能有电平输出,在PROTEUS里的蓝色为低电平,红色为高电平,灰色则是高阻态,如果不是P0口,则不需要上拉电阻。
P0口第一个功能是数据接口,第二个功能是地址低八位,P2口第二个功能是地址高八位。另外除了P0口没有内部上拉电阻外,其他三个都有内部上拉电阻。
绘图的时候有个坑大家注意:用proteus画仿真图时,元件的每个引脚都必须有一段导线与其它元件或电路相连才行,不能用引脚直接连接。所有LED都有一个结点,这样才行的。不然中间6个LED灯不亮。
四、C程序
C程序比较简单,这里面要引用reg51.h头文件,也可以引用REGX52头文件也是可以的,51头文件是proteus自带的,52的头文件需要另外添加到工程里面。还有个延时程序,NOP,这个可以在程序前面自己定义,也可以引用头文件的定义,执行Nop指令只使程序计数器PC加1,所以占用一个机器周期。
#include <reg51.h>
void _nop_ (void);
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P0=0xFE;//1111 1110
Delay500ms();
P0=0xFD;//1111 1101
Delay500ms();
P0=0xFB;//1111 1011
Delay500ms();
P0=0xF7;//1111 0111
Delay500ms();
P0=0xEF;//1110 1111
Delay500ms();
P0=0xDF;//1101 1111
Delay500ms();
P0=0xBF;//1011 1111
Delay500ms();
P0=0x7F;//0111 1111
Delay500ms();
}
}
1、延时程序的时间可以改进,通过函数的参数来控制时间,循环控制,基本的时间如1ms可以通过软件生成。