找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2203|回复: 0
收起左侧

基于51单片机的方向盘模拟转动Proteus仿真程序

[复制链接]
ID:737077 发表于 2020-5-28 14:30 | 显示全部楼层 |阅读模式
该设计采用proteus仿真完成,附代码和仿真电路图
51hei.png
注意,原来PWM输出引脚P3.7变成了P2.6,两个按键引脚也变了。

单片机源程序如下:
  1.     #include <reg52.h>
  2.     #define uchar unsigned char
  3.     #define uint unsigned int
  4.     sbit START=P1^0;//启动信号
  5.     sbit EOC=P1^1;//转换结束信号
  6.     sbit ENA=P1^2;//输出使能
  7.     sbit CLOCK=P1^3;//时钟信号
  8.     sbit led=P2^6;//位定义LED灯端口
  9.     sbit P14=P1^4;//A地址输入线端
  10.     sbit P15=P1^5;//B地址输入线端
  11.     sbit P16=P1^6;//C地址输入线端

  12.         sbit w0=P2^0;
  13.         sbit w1=P2^1;
  14.         sbit w2=P2^2;
  15.         sbit w3=P2^3;
  16.     uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管段码表,高电平段导通,低电平位导通。
  17.     uchar getdata,count;//电位器分压5V电压模拟量经ADC0808转化为数字量变量、定时器0中断次数变量
  18.     uint temp;//电位器分压5V电压模拟量经ADC0808转化为多少份电压值数字量变量
  19.       void DelayMS(uchar t)
  20.     {
  21.        uchar i,j;
  22.        for (i=0;i<t;i++)
  23.         for (j=0;j<123;j++);
  24.       }
  25.     //  void ADC0808()//读ADC0808子程序
  26.     //{
  27.     //   P3=0xff;//P3全部置高电平准备读数据
  28.     //   ENA=1;
  29.     //   getdata=P3;//读出转换数据赋与addata
  30.     //   ENA=0;//读数完毕
  31.     //  }
  32.       void Display(uint temp)
  33.     {
  34.        //P2=0xfe;//第1个数码管显示千位数
  35.            w3=1;w2=1;w1=1;w0=0;
  36.        P0=DSY_CODE[temp/1000];
  37.        DelayMS(1);
  38.        P0=0x00;
  39.        //P2=0xfd;//第2个数码管显示百位数
  40.        w3=1;w2=1;w1=0;w0=1;
  41.            P0=DSY_CODE[temp%1000/100];
  42.        DelayMS(1);
  43.        P0=0x00;
  44.        //P2=0xfb;//第3个数码管显示十位数
  45.        w3=1;w2=0;w1=1;w0=1;
  46.            P0=DSY_CODE[temp%100/10];
  47.        DelayMS(1);
  48.        P0=0x00;
  49.        //P2=0xf7;//第4个数码管显示个位数
  50.        w3=0;w2=1;w1=1;w0=1;
  51.            P0=DSY_CODE[temp%10];
  52.        DelayMS(1);
  53.        P0=0x00;
  54.     }
  55.       void main()
  56.     {
  57.        TMOD=0x11;//定时计数器1设置方式1
  58.        TH0=(65536-500)/256;//定时500us,即0.5ms,大概0.005s。
  59.        TL0=(65536-500)%256;
  60.        TH1=0xff;//定时65520us,即65.520ms,大概0.065s。
  61.        TL1=0xf0;
  62.        EA=1;
  63.        ET0=1;
  64.        ET1=1;//允许定时计数器1中断以便产生CLOCK时钟
  65.        TR0=1;
  66.        TR1=1;
  67.        P14=0;//A地址输入线端
  68.        P15=0;//B地址输入线端
  69.        P16=0;//C地址输入线端
  70.        while(1)
  71.     {
  72.         START=0;//启动信号初始为低电平
  73.         ENA=0;//允许输出信号初始为低电平
  74.         START=1;//启动信号由低电平变为高电平,产生上升沿,内部寄存器清零。
  75.         START=0;//启动信号由高电平变为低电平,产生下降沿,开始A/D转换。
  76.     //  while(EOC==0);//等待转换完成,开始A/D转换时为低电平,A/D转换结束后为高电平。
  77.         while (!EOC)//等待转换完成,开始A/D转换时为低电平,A/D转换结束后为高电平。
  78.       {
  79.     //   ADC0808();//模拟量转换
  80.          P3=0xff;
  81.          ENA=1;//允许输出A/D数据到单片机
  82.          getdata=P3;//电位器分压5V电压模拟量经ADC0808转化为数字量变量数据
  83.          temp=getdata*19.6/50;//由于实际电压的模拟量范围是0v~5v,ADC0808测量的是数字量信号0~255(即8个0到8个1),表达式temp=getdata*19.6/50中19.6是用5v按255份来分成每份5v/255=0.0196v=19.6mv,getdata为电位器分压5V电压模拟量经ADC0808转化为数字量变量,最大为255,为何又除以50?由于所用电压为5V,且PWM(脉冲宽度调制)一个周期内产生高低电平共100个,除以50是按50mv一份来算,刚好是100份,也就是5V,又符合PWM(脉冲宽度调制)一个周期高低电平个数,从而把电位器调节电压与PWM(脉冲宽度调制)联系起来,实现了通过电位器调节电压值份数大小来间接调节PWM(脉冲宽度调制)大小去驱动负载。
  84.          Display(temp);//显示电位器分压5V电压模拟量经ADC0808转化为多少份电压值数字量变量
  85.          ENA=0;//输出完毕
  86.     //   temp=getdata*19.6/50;//由于实际电压的模拟量范围是0v~5v,ADC0808测量的是数字量信号0~255(即8个0到8个1),表达式temp=getdata*19.6/50中19.6是用5v按255份来分成每份5v/255=0.0196v=19.6mv,getdata为电位器分压5V电压模拟量经ADC0808转化为数字量变量,最大为255,为何又除以50?由于所用电压为5V,且PWM(脉冲宽度调制)一个周期内产生高低电平共100个,除以50是按50mv一份来算,刚好是100份,也就是5V,又符合PWM(脉冲宽度调制)一个周期高低电平个数,从而把电位器调节电压与PWM(脉冲宽度调制)联系起来,实现了通过电位器调节电压值份数大小来间接调节PWM(脉冲宽度调制)大小去驱动负载。
  87.         }
  88.       }
  89.     }
  90.       void Time0() interrupt 1
  91.     {
  92.        TH0=(65536-100)/256;//重装定时500us,即0.5ms,大概0.005s。
  93.        TL0=(65536-100)%256;
  94.        count++;//中断1次为0.5ms
  95.        if (count==200)//PWM周期为0.5ms*100=50ms=0.05s
  96.        count=0;
  97.        if (count<temp)//判断定时器0中断次数变量是否小于电位器分压5V电压模拟量经ADC0808转化为多少份电压值数字量变量
  98.        led=1;//LED灯灭
  99.        else
  100.        led=0;//LED灯亮
  101.       }
  102.       void Time1() interrupt 3
  103.     {
  104.        TH1=0xff;//重装定时65520us,即65.520ms,大概0.065520s。
  105.        TL1=0xf0;
  106.        CLOCK=~CLOCK;//时钟信号输入端一般为500KHz,该定时器1定时时间为65520微妙,即65.520毫秒,亦0.065520秒,相当于高低电平各占0.065520秒,一个周期就是高低电平时间,则T=0.065520sX2=0.13104s,大概T=0.1s,频率为1/0.1s=10Hz=0.010KHz。
  107.       }
复制代码

所有资料51hei提供下载:
方向盘模拟2.zip (59.11 KB, 下载次数: 18)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表