背景:目前,还有不少人使用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 <reg52.h>
#include <intrins.h>

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<i;i++)
      {
     _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的这一优点,对所设计电路进行联调仿真,使其有助于我们的学习工作,提高电路设计的成功率。

Proteus和Keil C51联调仿真完整解析(附程序)相关推荐

  1. Proteus和Keil C51联合仿真

    (1)将文件夹中的联机调试模块VDM51.dll 文件复制到安装后的Keil5目录中如目录Keil\C51\BIN.文件提取码如下: http://链接:https://pan.baidu.com/s ...

  2. keil流水灯c语言程序两个一起亮,我用keil c51编了一个流水灯程序,编译无误却只有第一和第二个灯亮了,最后停在第一个灯处不动...

    满意答案 zJ张俭 2014.02.09 采纳率:43%    等级:12 已帮助:10469人 你有几个错误: 1 你的定时器没有重装,导致第一次中断和后面的中断时间不一样,第一次时间短,后面的时间 ...

  3. hh模型仿真matlab程序,gardner算法算法matlab仿真请教(附程序)

    %定时恢复程序: clear all N=6000;  %符号数 K=4;     %每个符号采4个样点 Ns=K*N;  %总的采样点数 w=[0.5,zeros(1,N-1)];  %环路滤波器输 ...

  4. Proteus内部编程仿真STM32(附程序)

    目录 一.背景 二.STM32开发简介 三.STM32实例简述 四.Proteus内部寄存器编程 1.时钟函数Clock_Init() 2.GPIO函数 LED_Init() 3.延时函数 delay ...

  5. Proteus与keil 联调

    Proteus与keil 的联调 需要安装一个相关软件 软件链接:https://pan.baidu.com/s/17Lxzd-3IWPwh6O5S5G7EAw 提取码:75am 安装路径在你keil ...

  6. keil c51问答

    导读:  一.#pragma asm是什么意思?  #pragma asm  MOV P1,R7  NOP  NOP  MOV P1,#0  #pragma endasm  实际上就是一个在C51中内 ...

  7. 【单片机】Proteus安装、MDK5安装、Proteus与Keil联合仿真教程

    1.需要的文件 2. 文件"Proteus软件"的安装 参考:proteus7.8的安装.破解.汉化教程https://jingyan.baidu.com/article/86f4 ...

  8. 初学单片机:Proteus介绍、Proteus与Keil联调(Windows10环境下)

    Proteus是一个仿真软件,可以在里面设计电路并模拟测试,也可生成PCB的布线等等,反正就是强大的不行.初学单片机,除了开发板,这个仿真器就是一个很好的调式环境.软件安装信息: Proteus 8. ...

  9. proteus 与 keil 的安装及联调

    proteus 安装 Win10 系统的下载链接可以参考这里:https://tieba.baidu.com/p/5644915130?traceid= 百度网盘地址 链接1: http://pan. ...

最新文章

  1. 关于 通过http请求 无法访问Linux下的ftp服务的解决办法!
  2. 让android的TextView可以滚动
  3. 再学 GDI+[16]: GDI+ 的颜色常量表
  4. 服务器性能检测器,Linux服务器性能检测工具之 collectl
  5. UBI文件系统的制作与挂载案例
  6. [USACO 2009 Dec G]Video Game Troubles-----分组背包的改良版
  7. 已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,并把该字符串中的小写字母变成大写字母,其它字符保持不变。要求分别在屏幕上输出原字符串以及修改后的字符串。
  8. 李子柒停更半年后,网红经济的“二元一次方程式”解开了吗?
  9. IDEA 配置 JDK 源码
  10. JavaSE自学笔记016_Real(多线程)
  11. Action Unit Memory Network for Weakly Supervised Temporal Action Localization 笔记
  12. android CheckBoxPreference title,summy字体大小设置
  13. web服务:原理与技术01
  14. C#制作简易赛尔号登陆器
  15. ES6 尾调用和尾递归优化
  16. WIFI之点对点连接的方法
  17. 远程文件同步工具--rsync
  18. java静态数组定义_详解Java静态数组
  19. 安川机器人原点丢失_ABB机器人零点丢失解决办法
  20. 深度解析:华为海思的不利局面

热门文章

  1. 如何重置 Mac 上的 NVRAM
  2. 查询rssi指令_RSSI测量方法及网络设备、终端设备与流程
  3. 监测DNS服务器状态手动修复,电脑管家修复不了DNS配置_修复DNS技巧-高达阁杀毒软件站...
  4. 5W1H聊开源之Who——谁“发明”了开源?
  5. java 盖章透明_java实现图片上传后裁剪,把白色背景变成透明图(电子印章)
  6. PyTorch之填充操作
  7. 递推算法5——逆推法之猴子摘桃问题
  8. TouchID 指纹登录
  9. dataframe的两列转换成字典的key和value
  10. 【云原生 | 01】docker容器引擎