历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2019年12月24日 | 单片机直流电机调速并显示的仿真与程序源码

2019-12-24 来源:51hei

直流电机调速系统有如下功能按钮:
正转P2^3输出PWMP2^4为1
反转P2^4输出PWMP2^3为1
PWM占空比+1
开始/暂停

直流电机调速仿真原理图如下
 

电路原理图如下:
 

67-元件清单
1)    9*15万用板
2)    STC89C51单片机
3)    40脚IC座
4)    1602液晶
5)    16p母座
6)    16p排针
7)    10k电阻*3
8)    1k电阻*5
9)    3v直流电机
10)    3*1万用板
11)    磁铁*2
12)    塑料管
13)    3144霍尔传感器
14)    4148二极管*4
15)    8050三极管*4
16)    8550三极管*2
17)    103排阻
18)    104独石电容
19)    10uf电解电容
20)    30pf瓷片电容*2
21)    12M晶振
22)    按键*6
23)    自锁开关
24)    DC电源插口
25)    导线若干
26)    焊锡若干
27)    USB电源线或电池盒

单片机源程序如下:

#include

#define uchar unsigned char

#define uint unsigned int 

void displaym();

sbit en=P2^5;                //1602  6管脚

sbit rs=P2^7;         //1602端口        4管脚

sbit rw=P2^6;//lcd1602控制端口 5管脚

sbit num1=P1^0;                                                //占空比加1

sbit num2=P1^1;                                                                   //占空比减一

sbit num3=P1^2;                                                                                           //正传

sbit num4=P1^3;                                                                                                         //反转

sbit num5=P1^4;                                                                                                                   //开始停止切换


sbit out=P3^4;                                                         //PWM输出用于正传

sbit out1=P3^7;                        //PWM输出用于反转


uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;





void delay(uint z)//延时1ms函数

{


uint x,y;

for(x=0;x     for(y=0;y<110;y++);

}




void write_com(uchar com)//向1602写一字节(控制指令)

{

  rs=0;

  P0=com;

  delay(5);

  en=0;

  delay(10);

  en=1;

}

void write_data(uchar date)//向1602写一字节(数据)

{

  rs=1;

  P0=date;

  delay(5);

  en=0;

  delay(5);

  en=1;

}

void init()//初始化函数

  en=0;

  rw=0;

  write_com(0x01);         //lcd初始化

  write_com(0x38);                                           //5X7显示

  write_com(0x0c);                         //关闭光标

  TMOD=0x01;               //定时器方式1           

  TH0=0xdc;

  TL0=0x00;                //定时器装入初值 

  EA=1;                    //开总中断 

  ET0=1;                   //定时器0开中断

  TR0=1; 

  EX1=1;

IT1=1;                 //定时器启动  

TH1=0xfc;

  TL1=0x66;//定时100us

  ET1=1;                   //定时器1开中断

  TR1=1;

  write_com(0x80);

  write_data('V');

  write_data(':');

  write_com(0x87);                 //第一行显示转速

  write_data('r');

  write_data('p');

  write_data('m');

  write_com(0xc0); 

  write_data('z');

  write_data('h');

  write_data('a');

  write_data('n');

  write_data('k');

  write_data('o');

  write_data('n');

  write_data('g');

  write_data('b');

  write_data('i');          //在第二行显示zhankongbi:

  write_data(':');

  displaym();

}

void keyscan()  //键盘扫描函数

  if(num1==0)     

  {

    delay(5);      //消除抖动

         if(num1==0)

         {

                if(m<=199)

                 m++;

                        displaym();                                                                  //设定占空比加一

     }

  }

  if(num2==0)

  {

    delay(5);

         if(num2==0)

         {

                  if(m>=1)

                m--;

                        displaym();                                        //设定占空比减一

        

         }

  }

    if(num3==0)

  {

    delay(5);

         if(num3==0)

         {

          zheng=1;                //正传标志置1

          fan=0;          // 反转标志置0

        

         }

  }

      if(num4==0)

  {

    delay(5);

         if(num4==0)

         {

          zheng=0;                 //正传标志置0

          fan=1;          // 反转标志置1

        

         }

  }

      if(num5==0)

  {

    delay(5);

         if(num5==0)

         {

         while(num5==0)         ;

          kai=1-kai;

         }

  }

}

void display()

{

  write_com(0x82);

  zhuansu=zhuansu*30;          //将两秒内的计数乘以30得到转每分


  if(zhuansu/10000!=0)

   write_data(zhuansu/10000+0x30);                                                  //如果转速的万位不为0        正常显示否则显示空格

   else

   write_data(' ');


  if(zhuansu/1000==0)

  write_data(' ');

  else 

  write_data(zhuansu%10000%1000+0x30);                                                                //如果转速小于1000 千位为空格 否则正常显示

  

  if(zhuansu/100==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000/100+0x30);                                           //如果转速小于100 百位为空格 否则正常显示


    if(zhuansu/10==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000%100/10+0x30);                                  //如果转速小于10 十位为空格 否则正常显示


  write_data(zhuansu%10000%1000%100%10+0x30);

  write_com(0xd0);                          //如果没有这句,当中断内的显示函数执行完,就会在转速的位置显示占空比数据,导致乱码

}

void displaym()

{

write_com(0xcb);

   if(m/200%10!=0)

  write_data(m/200%10+0x30);                           //如果占空比百位不为0则显示百位否则显示空格

  else 

  write_data(' ');

  

  if(m/200%10==0&&m/20%10==0)

  write_data(' ');

  else

  write_data(m/20%10+0x30);                                 //如果占空比小于10 十位正常显示  否则显示空格

  

  write_data(m/2%10+0x30);                                 //显示个位

}

void main()

{

    flag_1=0;

        m=100;                                                         //占空比为100

推荐阅读

史海拾趣

AIC [Analog Intergrations Corporation]公司的发展小趣事

随着技术的不断进步,艾派克逐渐在打印机芯片领域取得了突破。公司成功研发出一系列从打印机主控SoC芯片到耗材加密芯片的全系列打印机芯片产品,不仅满足了国内市场的需求,还成功打入国际市场,成为全球打印机通用耗材芯片的重要供应商。这一成就标志着艾派克在打印机芯片领域的领先地位得到了进一步巩固。

Davicom公司的发展小趣事

Davicom公司在成立之初就面临着电子行业中模拟与数字技术的融合挑战。公司凭借其强大的研发团队,成功开发出全球首款将模拟与数字技术完美结合的嵌入式以太网络IC,这一突破性的技术不仅解决了当时行业内的技术难题,也为Davicom赢得了市场先机。

Fine Products Microelectronics Corp公司的发展小趣事

为了进一步提升自身的技术实力和市场竞争力,Davicom积极寻求与业界巨头的合作。经过多轮谈判,Davicom最终与一家国际知名的IC设计大厂达成战略合作协议。双方共同研发出一系列高性能、低功耗的网络通讯IC产品,这些产品一经推出便受到市场的热烈欢迎。

FCT Electronics公司的发展小趣事

FCT Electronics的创立可以追溯到二十年前,当时电子行业正处于飞速发展的阶段。几位富有远见和创业精神的工程师看到了电子测试设备市场的巨大潜力,于是联手创立了FCT Electronics。公司最初的产品是一款简易的电路板测试仪,因其精准度高、操作简便而迅速在市场上占有一席之地。随着业务的不断拓展,FCT Electronics逐渐成为电子行业测试设备领域的佼佼者。

GaN Systems公司的发展小趣事

为了更好地服务全球客户,GAIA盖亚电源积极实施全球化战略,在全球范围内设立了25个分支机构,形成了覆盖广泛的销售和技术支持网络。这些分支机构不仅负责当地市场的开拓和维护,还为客户提供了及时、专业的技术支持和售后服务。通过本地化管理,GAIA盖亚电源能够更加灵活地应对不同地区的市场需求,进一步提升客户满意度和品牌影响力。

DB Lectro Inc公司的发展小趣事

DB Lectro Inc公司自创立之初,就致力于气体检测技术的研发与创新。在公司总部的加利福尼亚州研发中心,一群充满激情的工程师们夜以继日地工作,成功研发出了首款高精度、高稳定性的气体检测仪器。这款产品凭借其卓越的性能和精准的检测结果,迅速在污水处理、化工等领域打开了市场。随着技术的不断进步和产品的不断升级,DB Lectro Inc逐渐在气体检测领域树立了领先地位。

问答坊 | AI 解惑

Protel99SE精彩教程

Protel99SE精彩教程 此教程采用的样板软件是PROTEL99SE汉化版,对于学习PROTEL99SE很有用~99SE是PROTEL家族中目前最稳定的版本,功能强大。采用了*.DDB数据库格式保存文件,所有同一工程相关的SCH、PCB等文件都可以在同一*.DDB数据库中并存,非常 ...…

查看全部问答>

和初学者说说我学单片机的经过(ZT)

和初学者说说我学单片机的经过(ZT) 第一次知道"单片机"这三个字,那是1997年.那时我还在读中专,疯狂的在自学电子,这三个字是从 < <电子报> > 上看到的,但当时对单片机没一点认识,电子方面也是一片空白,所以单片机到底是何物,就 ...…

查看全部问答>

我爱龙芯之简介篇

     前段时间在论坛上上传了一个关于龙芯的PPT,应管理员soso的想法,觉得可以收集一点龙芯的资料,让我们认识自己中国人的芯。以下部分是我结合百科词条摘录的一部分内容,作为对龙芯的简单介绍吧!     其实, ...…

查看全部问答>

请教AD9851的电压放大问题

要做一个基于AD9851的信号发生电路,初定指标是频率1Hz~30M,已经是高频了,电压为5V。 最关键的是芯片产生信号后,要进行滤波,电压放大,以及功率放大 不知道选择哪款的运放比较合适,是否需要进行级联? 恳请论坛里有模电或者高频经验的高手 ...…

查看全部问答>

MSDN <>中的问题:

Super servers address all of these issues. Rather than have each service accept connections on its own thread, services.exe spins one thread on system startup and listens on a number of sockets, up to 64, for services that request ...…

查看全部问答>

关于启动起址的问题

小弟请问,平时我们把bootloader拷到flash中后,但是如果程序在链接时指定的入口地址是在SDRAM中,那么上电后,硬件是不是会把程序copy到sdram中相应的位置去呢?还是就在flash中执行?谢谢! 还有skyeye执行程序时,用file=bootloader,boot=yes &nbs ...…

查看全部问答>

LED灯具损坏常见原因及保护方案

replyreload += \',\' + 697127;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

在DC综合后的网表文件怎么导入到PT中进行时序分析

做的一个简单的cla电路,综合后得到电路网表。然后使用write -hierarchy -output cla.db 和write -format Verilog -hierarchy -output cla.v 保存了综合后的网表。但是用pt读后:read_db cla.db 这个说No-Design were read和read_verilog cla.v 这 ...…

查看全部问答>

MSP430如何直接用IAR烧写D43文件

MSP430如何直接用IAR烧写D43文件,用MSP430 USB型仿真器直接通过IAR建工程烧写IAR编译生成的.D43结尾的文件,方便用于生产使用,不用给原代码,防止工程师原代码泄露,方便实用 [ 本帖最后由 kingheimer 于 2013-3-5 12:59 编辑 ]…

查看全部问答>

赛前题目分析

本帖最后由 paulhyde 于 2014-9-15 03:37 编辑 赛前题目分析.doc    …

查看全部问答>