找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1850|回复: 2
打印 上一主题 下一主题
收起左侧

AT89C51在已有的程序里面加一个步进电机

[复制链接]
回帖奖励 4 黑币 回复本帖可获得 4 黑币奖励! 每人限 3 次
跳转到指定楼层
楼主
ID:122901 发表于 2016-5-24 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AT89C51在已有的程序里面加一个步进电机,设置两个键,控制步进电机的正反转。
在这个程序里面,加一个步进电机的控制程序,然后利用两个按键,控制它的正反转
#include <reg52.h>          //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义 变量范围0~255
#define uint  unsigned int  //无符号整型 宏定义 变量范围0~65535
//数码管段选定义       0    1    2    3    4 5 6  7   8    9
uchar code smg_du[]={0x21,0xf6,0x23,0x26,0x6c,0x4a,0xa0,0xf2,0x20,0x24,
//        A B  C   D    E   F 不显示
     
      0x28,0xe0,0xb1,0x62,0xb0,0x48 };  //断码
uchar dis_smg[1] = 0;
sbit beep =  P2^7;   //蜂鸣器
sbit hw = P3^2;      //红外
uchar set_time;      //设置的时间
uchar flag_alarm;    //报警标志位
uchar miao ;
uchar flag_v;
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
  for(j=0;j<120;j++);
}
/********************独立按键程序*****************/
void key()  //独立按键程序
{
static uchar key_new;
P1 |= 0x03;
if((P1 & 0x03) != 0x03)  //按键按下
{
  delay_1ms(1);       //按键消抖动
  if(((P1 & 0x03) != 0x03) && (key_new == 1))
  {      //确认是按键按下
   key_new = 0;
   switch(P1 & 0x03)
   {
    case 0x01:
      set_time ++; //设置的时间加1
     if(set_time > 9)
      set_time = 1;
     break;   //得到按键值
    case 0x02:  
     if(set_time == 0)
      set_time = 10;
      set_time --; //设置的时间减1
    break;   //得到按键值
   }
  }   
}
else   //按键松开
  key_new = 1;
}

/*********************定时器0、定时器1初始化******************/
void time_init()   
{
EA  = 1;     //开总中断
TMOD = 0X01;   //定时器0、
ET0 = 1;    //开定时器0中断
TR0 = 1;    //允许定时器0定时
}

/******************主程序**********************/   
void main()
{
time_init();   //定时器初始化程序
while(1)
{
  key();  //独立按键程序
  P0 = smg_du[set_time]; //显示时间
  if(hw == 0)             //有检测液滴
  {
   delay_1ms(1);   //消除干扰
   if(hw == 0)     //有检测液滴
   {
    miao   = 0;
    flag_v = 0;  
    beep = 1;   //关闭报警
   }
  }
  if(flag_alarm == 1)   //报警
  {
   if(miao - set_time <= 10)  //报警10秒
   {
    beep = ~beep;   //报警
    delay_1ms(300);   
   }
   else
   {
    beep = 1;   //关闭报警
   }
  }
}
}
/*********************定时器0中断服务程序************************/
void time0_int() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0;     //50ms
flag_v++;
if(flag_v >= 20) //1秒
{
  flag_v = 0;
  miao ++;
  if(miao >= set_time)
  {
   flag_alarm = 1;  //报警   
  }
  if(miao >= 100)
   miao = 100;
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:122901 发表于 2016-5-24 16:32 | 只看该作者
很急 ,谢谢大神帮助了
回复

使用道具 举报

板凳
ID:628459 发表于 2019-10-22 20:24 | 只看该作者
儒雅的嘿咻 发表于 2016-5-24 16:32
**** 作者被禁止或删除 内容自动屏蔽 ****

请问flag_v这个定义的是什么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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