背景:目前,还有不少人使用Proteus仿真诸如带有Firmware固件C51单片机时,先用Keil C51把C程序编译成.HEX文件,然后将.HEX文件导入Proteus项目中进行调试,调试发现软件问题需要修改C程序时,再回到Keil软件修改C程序,再编译再导入,以此反复 *** 作,效率低,浪费时间。
网上也有指导我们采用Proteus和Keil C51联调的帖子,但大都浮于软件使用,浅尝辄止,不够详细,没有完整的例子,这里以一个完整的例子为依托来完整解析Proteus和Keil C51联调的使用过程。
一、雨刮器控制电路细分为四个部分:1、利用三端稳压器7805设计的直流稳压电源电路,为AT89C51单片机及L298双全桥驱动器提供5V电压。
2、带上电复位及工作频率的AT89C51单片机最小系统。
3、4端输入L298双全桥驱动的步进电机驱动电路。
4、四档刮水速度的调节按键及指示LED电路。
1、直流稳压电源电路。
主要通过电容组合滤波,减小纹波电压,抑制高频干扰,将直流12V转换为直流5V,原理图如下:
2、单片机最小系统
复位电路:将C51单片机的RST引脚通过一个电容连接到5V,再通过一个电阻连接到地,由此形成一个RC充放电路,保证上电时C51有一个短暂的高电平复位。
晶振电路:通过两个22pF和一个12MHz的晶振提供C51单片机的晶振源。
原理图如下:
3、步进电机驱动电路
L298是双全桥驱动芯片,逻辑和驱动电源是分离的,TTL逻辑电平控制ENA/ENB为H(高电平)的情况下,逻辑电平输入INx(H/L)就会体现在驱动输出OUTx上,进而控制步进电机的正反转,实现雨刮片的来回往复刮水,控制逻辑如下表,具体可以参考L298的datasheet。
L298的逻辑使能信号ENA/ENB,以及逻辑输入信号INx来自单片机的P1口,P1.7管脚通过接一个LED灯显示步进电机的正(亮)反(灭)转,四个OUTx输出接步进电机,原理图如下:
4、四档调速按键及指示
通过四个输入P3口低电平信号的按键,让C51单片机在程序上调节电机每次步进的延时,达到调节刮水速度,调节速度的改变在刮水完成正反一轮后执行,所以调速后的LED指示要滞后于按键,原理图如下:
5、完成的雨刮器控制电路如下:
二、Proteus和Keil C51联调软件设置
1、建立项目时,选择带Firmware,并选好自己所用的可编程IC器件。
2、点击上图的Compilers,找到“Keil for 8051",在该行的后面选择安装Keil C51的目录,选好并识别好已装的Keil编译器后,Installed列会变为Yes。
3、设置好之后,就可以选择Keil for 8051编译器了。
4、新建的项目Firmware固件程序就是C语言,而不是汇编语言了,编写修改main.c程序即可,不需要来回在Proteus和Keil之间来回切换。
5、Proteus调试和在Keil环境下大同小异,单步,跳出等等都可以实现,变量以及P端口值的变化,也可以观察到。
三、该例的C程序也给大家贴出来,调试过的,可以直接使用。
对程序有疑问的可以回帖提问,如果对您有帮忙,别忘了点赞,谢谢关注。
#include
#include
sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8] = {0x31,0x33,0x32,0x36,0x34,0x3c,0x38,0x39}; //四相八拍正转编码
uchar code REV[8] = {0xB9,0xB8,0xBc,0xB4,0xB6,0xB2,0xB3,0xB1}; //四相八拍反转编码
uint count;
uint i;
uint n=0;
void delay(uint t)
{
uint m;
while(t--)
{
for(m=0;m<125;m++) { }
}
}
void delay5us(uint i)
{
uint j;
for(j=0;j {
_nop_();
_nop_();
}
}
void motor_forward(void)
{
for(i=0;i<4;i++)
{
for(count = 0; count < 8; count++)
{
P1 = FFW[count];
delay5us(n);
}
}
}
void motor_backward(void)
{
for(i=0;i<4;i++)
{
for(count=0; count<8; count++)
{
P1 = REV[count];
delay5us(n);
}
}
}
void Key_Scan(void)
{
if(K1==0&&K2==1&&K3==1&&K4==1)
{
n =10;
P0 = 0x0E;
}
else if(K1==1&&K2==0&&K3==1&&K4==1)
{
n =50;
P0 = 0x0D;
}
else if(K1==1&&K2==1&&K3==0&&K4==1)
{
n =100;
P0 = 0x0B;
}
else if(K1==1&&K2==1&&K3==1&&K4==0)
{
n =200;
P0 = 0x07;
}
else
{ P0 = 0x0F; }
}
void main(void)
{
while (1)
{
Key_Scan();
motor_forward();
delay(100);
motor_backward();
}
}
四、总结
可以实现Firmware固件及外围电路的联调是Proteus的一大优势,我们应该高效地利用Proteus的这一优点,对所设计电路进行联调仿真,使其有助于我们的学习工作,提高电路设计的成功率。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)