导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→这是1.02版程序,请大家帮我看看,有什么不好的习惯,用法请

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

   czoowl 
czoowl发表的帖子 

 这是1.02版程序,请大家帮我看看,有什么不好的习惯,用法请大家指出来,谢谢!
/************************************************************
SAmain.c
摘要: 新背投六轴控制程序
当前版本: 1.02
Writer: czoowl
完成日期: 2006/09/06
开始编写日期: 2006/08/29
功能简介: 
          V1.01:
          按下按键1,切换方波输出通道;按下按键2,发方波,先发一个脉冲,
          如果检测到按键没有抬起,过毫秒后则连续发方波。

          V1.02:
          增加了按住按键后加速运动的功能,初始速度为10Hz,最高速为337Hz。
          硬件上加了一个CD4024分频器进行32分频。
************************************************************/
#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_step_flag = g_work_flag^0;  // 1:single step complete
sbit g_run_stop_flag = g_work_flag^1;    // 1:run     0:stop

uchar bdata g_key_flag = 0x00;
sbit g_key_channel_flag = g_key_flag^0;  //一次按键切换通道一次

uchar bdata g_run_flag = 0x00;
sbit g_speed_up_down_flag = g_run_flag^0;  //1: speed up     0: speed down

uint bdata g_pulse_frequency = 0xF000;    //the frequency of pulse

void Delay(uchar h_data)  //延时程序,h_data = 1时为1.12ms。
{
   uchar bdata l_data = 0x00;
   while (h_data--)
   {
      for (l_data=0x00; l_data  <0x80; l_data++);
   }
}

void Initialize(void)   //初始化
{
   EA = 0;
   TR0 = 0;
   TR1 = 0;
   ET0 = 1;
   ET1 = 1;
   TMOD = 0x52;
   T2CON = 0x00;
   T2MOD = T2MOD|0x02;
   RCAP2H = 0xF0;
   RCAP2L = 0x00;
   g_pulse_frequency = 0xF000;
   g_run_stop_flag = 0;
   TH1 = 0xff;
   TL1 = 0xff;
   TH0 = 0x00;
   TL0 = 0x00;
   while (T1)  //等待脉冲为低电平
   {
      TR2 = 1;
   }
   TR2 = 0;
   T2 = 0;
}

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

void Frequency_change (uint t2_frequency)  //把设定的频率值给定
{
   RCAP2L = (t2_frequency & 0x00ff);
   RCAP2H = (t2_frequency>  >  8);
}

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,方波输出通道切换
      {
         if (g_key_channel_flag)
         {
            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);
            g_key_channel_flag = 0;  //防止一次按键执行两次命令
         }
      }//end of if (0x01 == key_order)
      else if (0x02 == key_order)  //按键2,发方波
      {
         if (!g_run_stop_flag)  //如果原来是停止状态,先发一个脉冲,单步走一下
         {
            RCAP2H = 0xF0;
            RCAP2L = 0x00;
            TH1 = 0xff;
            TL1 = 0xff;
            TR1 = 1;
            TR2 = 1;
            g_one_step_flag = 0;
            g_run_stop_flag = 1;
            i = 0x00;
            j = 0x00;
            while (!g_one_step_flag)  //等待第一个脉冲发完
            {
               i++;
               if (0 == i) 
               {
                  j++;
               }
               if (0xff == j) 
               {
                  break;  //超时退出
               }             
            }                
         }    
         else  //发完一个脉冲后,进入连续发状态
         {    
            onestep_delay++;
            Delay(0x10);
            if (0x05 == onestep_delay)  //判断单步之后的延世到了否
            {
               TR2 = 1;
               TR0 = 1;
            }
            
         }
      }//end of if (0x02 == key_order)
      else  //无按键,电机停转
      {
         while (T1)  //等待脉冲为低电平
         {
            TR2 = 1;
         }
         TR2 = 0;
         T2 = 0;
         TR1 = 0;
         TH1 = 0xff;
         TL1 = 0xff;
         g_run_stop_flag = 0;  //STOP
         g_speed_up_down_flag = 1;  //Speed Up
         g_pulse_frequency = 0xF000;
         g_key_channel_flag = 1;
         onestep_delay = 0x00;
      }
   }//end while (1)
}//end main

/*
void Ext0_int(void) interrupt 0 using  1  //EXT0,用来检测第一个脉冲
{
}

*/
void T0_int (void) interrupt 1 using 2  //T0中断,用来加减速
{
   if (0 == g_speed_up_down_flag)  //减速,暂时未用
   {
      g_pulse_frequency -= 0x02;
      if (g_pulse_frequency   < 0xF000)
      {
         while (T1)  //等待脉冲为低电平
         {
            TR2 = 1;
         }
         TR2 = 0;
         T2 = 0;
         TR0 = 0;
         g_pulse_frequency = 0xF000;
      }
      Frequency_change(g_pulse_frequency);
   }
   else  //加速
   {
      g_pulse_frequency += 0x02;
      if (g_pulse_frequency >   0xFF00)
      {
         TR0 = 0;
         g_pulse_frequency = 0xFF00;
      }
      Frequency_change(g_pulse_frequency);
   }
}

void T1_int (void) interrupt 3 using 3  //T1中断,用来测移动的位移和单步
{
   while (T1)  //等待脉冲为低电平
   {
      TR2 = 1;
   }
   TR2 = 0;
   T2 = 0;
   g_one_step_flag = 1;
}


发表时间:2006年9月7日16:41:25

  
回复该帖

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

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

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

[上一篇帖子]:这是原理图[upload=jpg]uploadfile/2006-9-7_16-45-29_84.j
[下一篇帖子]:寻找开发团队开发一单片机排队管理系统目前已有半成品可以实现排队管理功能与动态视频信息播放功能。现需要