[问答] 帮忙解释下

[复制链接]

实习生

发表于 2018-3-12 22:50:50   223 查看 1 回复 显示全部楼层 倒序浏览
分享
/****************************************************
      =========  直流电机控制+速度显示  ==========
****************************************************/
#include<reg52.h>     //头文件
#define uchar unsigned char   //宏定义
#define uint  unsigned int
#define CYCLE 10     //定义PWM的周期T为10ms
//数码管段选定义      0     1    2    3    4    5 6  7   8    9
uchar code smg_du[]={0x28,0xee,0x72,0xa2,0xe4,0x41,0x21,0xea,0x70,0xa0,
        0x60,0x25,0x34,0x26,0x61,0x71,0xff};  //断码
uchar dis_smg[8] = {0};
/***************************************************
    端口定义
***************************************************/
sbit PWM1=P2^0;     //PWM输出口1(电机正转)
sbit PWM2=P2^5;     //PWM输出口2(电机反转)
sbit K1=P2^7;     //加速
sbit K2=P2^6;     //减速
sbit K3=P2^3;     //正反转
sbit K4=P2^2;     //启动停止
//数码管位选定义
sbit smg_we1 = P3^4;     //数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
/***************************************************/
uchar PWM_ON=0;     //PWM高电平时间
uchar count=0;       //中断计时
uchar num=0;
uchar num1=0;        //中断时间计数
uint num2=0;        //外部中断次数
uchar flat=0;     //正反转标示位
uchar flag=0;        //刷新数据标示位

/***************************************************
  函数名称:延时子函数
     函数功能:按键消抖
***************************************************/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}

/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
  case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
}
}
/********************数码显示函数*************************/
void display()
{
static uchar i;   
uint shuju;
if(flag==1)
{
  flag=0;
  shuju=num2;    //电机一秒转的圈数  
  num2=0;
}
if(flat==0)
  dis_smg[3] = smg_du[10];  //"A" //正转
else
  dis_smg[3] = smg_du[15];  //"F" //反转
dis_smg[0] = smg_du[shuju % 10];   //显示
dis_smg[1] = smg_du[shuju / 10 % 10];
dis_smg[2] = smg_du[shuju / 100 % 10];  
i++;
if(i > 4)
  i = 0;
P1 = 0xff;      //段选         
smg_we_switch(i);   //位选
P1 = dis_smg;   //段选      
delayms(3);  
}
/***************************************************
    函数名称:按键子函数
    函数功能:
***************************************************/
void key()
{
if(K4==0)     //启动 停止
{
  delayms(5);
  if(K4==0)
  {
   while(!K4)
    display();    //显示函数
       num=!num;
  }
}
if(K1==0)     //加速键
{
  delayms(5);
  if(K1==0)
  {
   while(!K1)
    display();    //显示函数
   if(num<3)
   num++;
  }
}
if(K2==0)     //减速键
{
  delayms(5);
  if(K2==0)
  {
   while(!K2);
   if(num>0)
   num--;
  }
}
if(K3==0)       //电机正反转按键
{
  delayms(5);
  if(K3==0)
  {
   while(!K3) ;
   flat++;
   if(flat==2)
   flat=0;
   num1 = 0;
   num2 = 0;
  }
}

switch(num)
{
  case 0: PWM_ON=0;  break; //占空比为00%
  case 1: PWM_ON=40;  break; //占空比为40%
  case 2: PWM_ON=70;  break; //占空比为70%
  case 3: PWM_ON=100;  break; //占空比为100%
  default:
  break;
}
}

void  init()
{
  PWM1=1;     //初始化
PWM2=1;
TMOD=0x11;     //打开定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
}
/**************************************************
    函数名称:主函数
    函数功能:
**************************************************/
void main()
{
    init();
while(1)
{

  key();
  display();   //显示函数
}
}

/**************************************************
    函数名称:定时器/计数器0中断子函数
    函数功能:
**************************************************/
void T1_time() interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count++;
if(count>CYCLE)
  count=0;
if(count<PWM_ON)   //如果计时时间在不大于高电平时时间,电机转
{
  if(flat==0)
  {
   PWM1=0;
   PWM2=1;
  }
  if(flat==1)
  {
   PWM1=1;
   PWM2=0;
  }
}
else      //如果计时时间大于高电平时时间,电机停
{
  PWM1=1;
  PWM2=1;
}
}
void T0_time() interrupt 1   //定时器0
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num1++;
if(num1==20)      //每1s刷新一次数据
{
  num1=0;
  flag=1;
}
}
void timer() interrupt 0    //外部中断1
{
  num2++;
}


标签:帮忙 解释

实习生

发表于 2018-3-12 23:16:31    楼主|
大神帮忙解释下代码,报酬私聊2436849192
回复

点赞 举报

高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /8 下一条

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区