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