Proteus和Keil C51联调仿真完整解析

Proteus和Keil C51联调仿真完整解析,第1张

背景:目前,还有不少人使用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的这一优点,对所设计电路进行联调仿真,使其有助于我们的学习工作,提高电路设计的成功率。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564711.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存