导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→方波脉冲八路分时输出程序

* 97351: 请大家帮我看看程序

   czoowl 
czoowl发表的帖子 

 方波脉冲八路分时输出程序
抱歉,原来的程序没有经过仿真验证就发出来了,结果漏洞百出,让大家见笑了。下面的是我上机仿真之后修改过的程序,修改了一些地方,此外加了一些注释,大家帮我看看,挑挑毛病,谢谢!

/************************************************************
SAmain.c
摘要: 新背投六轴控制程序
当前版本: 1.01
Writer: czoowl
完成日期: 2006/08/31
开始编写日期: 2006/08/29
功能简介: 按下按键1,切换方波输出通道,由P1.4~P1.6控制;按下按键2,发方波,先发一个脉冲,
          如果检测到按键没有抬起,过几百毫秒后则连续发方波。
************************************************************/
#define uchar unsigned char
#define uint unsigned int
//#include "89c55wd.h"

#include   <AT89X55.H>  
uchar bdata g_channel_num = 0x07;  //选择哪个通道输出方波
uchar bdata g_work_flag = 0x00;
sbit g_one_pulse = g_work_flag^0;  // 1:single step complete
sbit g_run_stop = g_work_flag^1;    // 1:run     0:stop

void Delay(uchar h_data)
{
   uchar bdata l_data = 0x00;
   while (h_data--)
   {
      for (l_data=0x00; l_data  <0x80; l_data++);
   }
}

void Initialize(void)
{
   EA = 0;
   EX0 = 0;
   T2CON = 0x00;
   T2MOD = T2MOD|0x02;
   RCAP2H = 0x00;
   RCAP2L = 0x00;
   IT0 = 1;    //edge
   g_run_stop = 0;
}

uchar Keyscan(void)  //按键扫描程序
{
   uchar bdata p1_bak = 0x00;
   uchar bdata result = 0x00;
   if ((P1 & 0x0c) != 0x0c)
   {
      Delay(0x80);
      if ((P1 & 0x0c) != 0x0c)  //去抖
      {
          p1_bak = P1 & 0x0c;
          if (0x08 == p1_bak) result = 0x01;
          if (0x04 == p1_bak) result = 0x02;
      }
   }
   return (result);
}

void Main(void)
{
   uchar bdata key_order = 0x00;
   uchar bdata i, j;
   uchar bdata onestep_delay = 0x00;
   Initialize();
   EA = 1;
   while (1)
   {
      key_order = Keyscan();
      if (0x01 == key_order)  //按键1,方波输出通道切换
      {
         g_channel_num++;
         if (g_channel_num >   0x07) 
         {
            g_channel_num = 0x00;
         }
           
         switch (g_channel_num)
         {
            case 0:
               P1_4 = 0;
               P1_5 = 0;
               P1_6 = 0;
               break;
            case 1:
               P1_4 = 1;
               P1_5 = 0;
               P1_6 = 0;
               break;
            case 2:
               P1_4 = 0;
               P1_5 = 1;
               P1_6 = 0;
               break;
            case 3:
               P1_4 = 1;
               P1_5 = 1;
               P1_6 = 0;
               break;
            case 4:
               P1_4 = 0;
               P1_5 = 0;
               P1_6 = 1;
               break;
            case 5:
               P1_4 = 1;
               P1_5 = 0;
               P1_6 = 1;
               break;
            case 6:
               P1_4 = 0;
               P1_5 = 1;
               P1_6 = 1;
               break;
            default:
               P1_4 = 1;
               P1_5 = 1;
               P1_6 = 1;
         }//end of switch (g_channel_num);
      }//end of if (0x01 == key_order)
      else if (0x02 == key_order)  //按键2,发方波
      {
         if (!g_run_stop)  //如果原来是停止状态,先发一个脉冲,单步走一下
         {
            EX0 = 1;
            IT0 = 1;    //edge
            EA = 1;
            TR2 = 1;
            g_one_pulse = 0;
            g_run_stop = 1;
            i = 0x00;
            j = 0x00;
            while (!g_one_pulse)  //等待第一个脉冲发完
            {
               i++;
               if (0 == i) 
               {
                  j++;
               }
               if (0xff == j) 
               {
                  break;
               }             
            }                
         }    
         else  //发完一个脉冲勒,进入连续发状态
         {    
            onestep_delay++;
            Delay(0x02);
            if (0x05 == onestep_delay)  //判断单步之后的延世到了否
            {
               EX0 = 0;
               EA = 1;
               TR2 = 1;
            }
            
         }
      }//end of if (0x02 == key_order)
      else  //无按键,电机停转
      {
         while (INT0);
         TR2 = 0;
         T2 = 0;
         EX0 = 0;
         g_run_stop = 0;
         onestep_delay = 0x00;
      }
   }//end while (1)
}//end main


void Ext0_int(void) interrupt 0 using  2  //EXT0,用来检测第一个脉冲
{
   TR2 = 0;
   EA = 0;
   g_one_pulse = 1;
}



发表时间:2006年9月2日9:30:48

  
回复该帖

本主题共有 4 帖,分页:>>>>>该主题的所有内容[4]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  97504.[详细]这是1.02版程序,请大家帮我看看,有什么不好的习惯,用法请大家指出来,谢谢!..
摘要:/************************************************************ SAmain.c 摘要: 新背投六轴控制程序 当前版本: 1.02......(6541字)
- [czoowl][1015次] 2006年9月7日

  97505.[详细]这是原理图
摘要:[upload=jpg]uploadfile/2006-9-7_16-45-29_84.jpg[/upload]......(56字)
- [czoowl][983次] 2006年9月7日

[上一篇帖子]:有CSSA5.1lyn5912@163.com 有CSSA5.1
[下一篇帖子]:c8051f[灌水][推荐]杭州科企电子系C8051F,大量现货清仓,价格超底优惠 ,具体