AT89S52测试脉冲输出

 /*AT89S52测试脉冲输出 2012 5 8PCB四入四出板
L270 CODE 771 PAST 测试步进电机伺服电机旋转位置**/
/*****---------------********/
/*****|手动:     XXX |******/
/*****|               |******/  
/***** ---------------*******/
               #include <REG51.H>
               #include <intrins.H>
               #define  uint unsigned int  
               #define  uchar unsigned char
               uint     aa=0;
               #define  Lcd_Bus P2     /*MCU P2<---> LCM */
               sbit     RS=P3^5;        //RS     PIN4
               sbit     RW=P3^6;        //RW  PIN5
               sbit     E=P3^7;        //E     PIN6
               sbit        KEYA=P1^3;       /*加按键*/
               sbit        KEYB=P1^2;       /*减按键*/
               sbit        KEY1=P1^0;       /*功能按键*/
               sbit        KEY2=P1^1;       /*功能按键*/
               sbit     MDIRECT=P3^1;  //Direction
               sbit     MTORCP=P3^0;   //
               bdata    char com_data;           /********/
               uchar    flag;
               uint     h,l,m,n,k,s,g,x;           /****个十百代码缓冲**/
               uint     i,j;                     /**半自动按键输入计数器**/
               uint     t1,t2,t3;                /****总数个十百千****/
               void     delay_iic(int v);        /****eeprom读写延时**/
               void     write_com(unsigned char cmdcode);
               void     write_data(unsigned char Dispdata);
               void     delay(uint k);           /****延时****/
/*------------------延时1mS子程序------------------------*/
              void Delay1ms()        //@11.0592MHz
              {
               unsigned char i, j;
               _nop_();
               _nop_();
               _nop_();
               i = 11;
               j = 190;
                do
                  {
                while (--j);
                }
                while (--i);
               }
/*------------------延时子程序------------------------*/
               void delay(uint t)
               {
               uint i,j;
               for(i=0;i<t;i++)
               for(j=0;j<121;j++);
               }
/*------------------检查忙位--------------------------*/
        void chk_busy()
              {
               RS=0;
               RW=1;
               E=1;
               Lcd_Bus=0xff;
               while((Lcd_Bus&0x80)==0x80);
               E=0;
               }
/*------------------写命令到LCD-----------------------*/
          void write_com(unsigned char cmdcode)
               {
                chk_busy();
                RS=0;
                RW=0;
                E=1;
                Lcd_Bus=cmdcode;
                delay(5);                                        /*在数据写入的时候加入适当的延时*/
                E=0;
                delay(5);
               }
/*-------------------写数据到LCD----------------------*/
          void write_data(unsigned char Dispdata)
               {
                chk_busy();
                RS=1;
                RW=0;
                E=1;
                Lcd_Bus=Dispdata;
                delay(5);                                        /*在数据写入的时候加入适当的延时 */
                E=0;
                delay(5);
               }
/*------------------初始化LCD屏-----------------------*/
           void lcdreset()
               {
                delay(300);
                RW=0;
                delay(10);                                       /*选择基本指令集 */
                write_com(0x30);                                 /*选择8bit数据流 */
                delay(5);
                write_com(0x0F);                                 /*开显示(无游标、不反白) */
                delay(10);
                write_com(0x01);                                 /*清除显示,并且设定地址指针为00H */
                delay(50);
               // write_com(0x18);                                 /*游标或显示移位控制 */
                delay(50);
                write_com(0x04);                                 /*游标的移动方向及指定显示的移位*/
                delay(0);
               }
/**************顶出**************************/
               void xsdc()
               {
                write_com(0x84);    /*---顶---*/
                write_data(0xB6);
                write_data(0xA5);                               
                write_com(0x85);    /*---出---*/
                write_data(0xB3);
                write_data(0xF6);   
               }
/**************顶退**************************/
               void xsdt()
               {
                write_com(0x84);    /*---顶---*/
                write_data(0xB6);
                write_data(0xA5);                               
                write_com(0x85);    /*---退---*/
                write_data(0xCD);
                write_data(0xCB);   
               }
/***************显示  手动 ***************/
               void xs0()
               {
                write_com(0x80);    /*---手---*/
                write_data(0xCA);
                write_data(0xD6);                               
                write_com(0x81);    /*---动---*/
                write_data(0xB6);
                write_data(0xAF);  
                write_com(0x82);    /*---CLEAR---*/
                write_data(0xB6);
                write_data(0xA0);
                }
/*----------电机前进------------*/
               void   MotorForward( uint m)            /*写数据B子函数*/
               {
                uint i;
                EA=0;                              //关总中断
                for(i=0;i<m;i++)                //800个脉冲转动一圈。
                {
                 MTORCP=0;                      /*子函数开始*/
                   Delay1ms();                    //延时1毫秒
                 MTORCP=1;
                  Delay1ms();
                }
               EA=1;                          //开总中断
               }      
/*----------电机后退------------*/
               void   MotorBack(uint m)          /*写数据B子函数*/
               {                            /*子函数开始*/
                uint i;
                   EA=0;                          //关总中断
                for(i=0;i<m;i++)            //800个脉冲转动一圈。
                {
                 MTORCP=0;                  /*子函数开始*/
                 Delay1ms();
                   MTORCP=1;
                  Delay1ms();
                }
                EA=1;                            //开总中断
               }
/*----------------清除 动作 显示 -----------*/
               void  xs9()
               {   
                write_com(0x84);            /*---CLEAR---*/
                write_data(0xB6);
                write_data(0xA0);                                 
                write_com(0x85);            /*---CLEAR---*/
                write_data(0xB6);
                write_data(0xA0);                 
               }
/*------------------主循环程序----------------*/      
                void   main( )              /*主程序开始*/
                {  
                P0=255;
                P1=255;
                P2=255;
                P3=255;
                lcdreset();                 /*液晶复位*/
                xs0();                         /*显示手动 设定波值*/
                delay(3000);
                 while(1)                    //主程序循环
                 {
                 delay(200);
                 k=0;
                 i=0;
                 j=0;
                 delay(200);
                 delay(200);
                  if(!KEY1)                    //检测自动键  aa=926;
                  {                         //按下自动键进入条件判断语句
                   for(;k<=5;)              /*小于等于5循环*/
                   {
                    if(!KEY1)               /*检测自动按键为低电平?*/
                    {                       /*循环检测 */
                    k++;
                    delay(5);
                    }
                    else if(~!KEY1)         /*检测自动按键为高电平?*/
                    {
                    k=0;                    /*寄存器复位*/   
                    }    
                   }
                   xsdc();                    //显示顶出
                   MotorForward(800);             //电机前进
                   xs9();                    //清除 动作 显示
                   k=0;                        /*抗干扰计数器*/
                  }
                  if(!KEY2)                    //检测自动键  aa=926;
                  {                         //按下自动键进入条件判断语句
                   for(;k<=5;)              /*小于等于5循环*/
                   {
                    if(!KEY2)               /*检测自动按键为低电平?*/
                    {                       /*循环检测 */
                    k++;
                    delay(5);
                    }
                    else if(~!KEY2)         /*检测自动按键为高电平?*/
                    {
                    k=0;                    /*寄存器复位*/   
                    }    
                   }
                   xsdt();                    //显示顶出
                   MotorBack(800);             //电机前进
                   xs9();                    //清除 动作 显示
                   k=0;                        /*抗干扰计数器*/
                  }
                  if(!KEYA)                    //检测自动键  aa=926;
                  {                         //按下自动键进入条件判断语句
                   for(;k<=5;)              /*小于等于5循环*/
                   {
                    if(!KEYA)               /*检测自动按键为低电平?*/
                    {                       /*循环检测 */
                    k++;
                    delay(5);
                    }
                    else if(~!KEYA)         /*检测自动按键为高电平?*/
                    {
                    k=0;                    /*寄存器复位*/   
                    }    
                   }
                   xsdc();                    //显示顶出
                   MotorForward(400);         //电机前进
                   xs9();                    //清除 动作 显示
                   k=0;                        /*抗干扰计数器*/
                  }
                  if(!KEYB)                    //检测自动键  aa=926;
                  {                         //按下自动键进入条件判断语句
                   for(;k<=5;)              /*小于等于5循环*/
                   {
                    if(!KEYB)               /*检测自动按键为低电平?*/
                    {                       /*循环检测 */
                    k++;
                    delay(5);
                    }
                    else if(~!KEYB)         /*检测自动按键为高电平?*/
                    {
                    k=0;                    /*寄存器复位*/   
                    }    
                   }
                   xsdt();                    //显示顶出
                   MotorBack(400);             //电机前进
                   xs9();                    //清除 动作 显示
                   k=0;                        /*抗干扰计数器*/
                  }
                 }
                }  //2015 10 17 16:58

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值