小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 9715|回复: 8

新手求助 单片机不响应ttl的命令

[复制链接]
发表于 2012-12-18 18:45:40 | 显示全部楼层 |阅读模式
从打算搞一个小车到现在已经很久了,昨天买的两个db120到手了,于是赶紧刷了op。经过一天的捣腾,现在通过电脑控制端发送控制命令,路由器的ttl口上完全可以输出,路由器ttl输出的命令也可以收到。可是对于命令,单片机却没有任何动作。
我用的是开发板 板子P2口接8个led
下面是程序



#include <reg51.h>
#include <intrins.h>
#include < stdio.h >
//定义继电器的管脚
sbit     K0_0 =  P2^0;   //对应继电器
sbit     K0_1 =  P2^1;   //对应继电器
sbit     K0_2 =  P2^2;   //对应继电器
sbit     K0_3 =  P2^3;   //对应继电器
sbit     K0_4 =  P2^4;   //对应继电器
sbit     K0_5 =  P2^5;   //对应继电器
sbit     K0_6 =  P2^6;   //对应继电器
sbit     K0_7 =  P2^7;   //对应继电器
//控制左右旋转
sbit A0=P2^0; //定义步进电机连接端口
sbit B0=P2^1;
sbit C0=P2^2;
sbit D0=P2^3;

#define Coil_A0 {A0=1;B0=0;C0=0;D0=0;}//A相通电,其他相断电
#define Coil_B0 {A0=0;B0=1;C0=0;D0=0;}//B相通电,其他相断电
#define Coil_C0 {A0=0;B0=0;C0=1;D0=0;}//C相通电,其他相断电
#define Coil_D0 {A0=0;B0=0;C0=0;D0=1;}//D相通电,其他相断电
#define Coil_OFF0 {A0=0;B0=0;C0=0;D0=0;}//全部断电
//控制上下旋转
sbit A1=P2^4; //定义步进电机连接端口
sbit B1=P2^5;
sbit C1=P2^6;
sbit D1=P2^7;

#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF1 {A1=0;B1=0;C1=0;D1=0;}//全部断电
unsigned char Speed;
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
  DelayUs2x(245);
}
}
void delay(unsigned int ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
unsigned char tmp;
main()
{
int i;
TMOD = 0x20;   // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD;    // 波特率9600
TL1 = 0xFD;

SCON = 0x50;   // 设定串行口工作方式
PCON &= 0xef;   // 波特率不倍增
  
TR1 = 1;    // 启动定时器1
IE = 0x0;    // 禁止任何中断
for (i=0;i<=500;i++)
{
delay (1000);//延时1秒
  }
while(1)
{

  if(RI)      // 是否有数据到来
  {
   RI = 0;
   tmp = SBUF;    // 暂存接收到的数据
   switch(tmp-48)    //判断12345678
   {
    case 1:K0_0=!K0_0;break;
    case 2:K0_1=!K0_1;break;
    case 3:K0_2=!K0_2;break;
    case 4:K0_3=!K0_3;break;
    case 5:K0_4=!K0_4;break;
    case 6:K0_5=!K0_5;break;
    case 7:K0_6=!K0_6;break;
    case 8:K0_7=!K0_7;break;
    case 91=0x00;break; //全开
    case 01=0xff;break; //全关
   
   
   }
   if (tmp==82)  //输入L
   {
   Speed=10; //调整速度
   for (i=0;i<=4;i++)
    {
    Coil_A0                 //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
        DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                          //数字越小,转速越大,力矩越小
        Coil_B0
        DelayMs(Speed);
        Coil_C0
        DelayMs(Speed);
        Coil_D0
        DelayMs(Speed);
    Coil_OFF0
    }
   
   }
   if (tmp==76)   //输入R
   {
   Speed=10; //调整速度
   for (i=0;i<=4;i++)
    {
    Coil_D0                 //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
        DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                          //数字越小,转速越大,力矩越小
        Coil_C0
        DelayMs(Speed);
        Coil_B0
        DelayMs(Speed);
        Coil_A0
        DelayMs(Speed);
    Coil_OFF0
    }
   
   }
   if (tmp==68)  //输入D
   {
   Speed=10; //调整速度
   for (i=0;i<=4;i++)
    {
    Coil_A1                 //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
        DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                          //数字越小,转速越大,力矩越小
        Coil_B1
        DelayMs(Speed);
        Coil_C1
        DelayMs(Speed);
        Coil_D1
        DelayMs(Speed);
    Coil_OFF1
    }
   
   }
   if (tmp==85)   //输入U
   {
   Speed=10; //调整速度
   for (i=0;i<=4;i++)
    {
    Coil_D1                 //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
        DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                          //数字越小,转速越大,力矩越小
        Coil_C1
        DelayMs(Speed);
        Coil_B1
        DelayMs(Speed);
        Coil_A1
        DelayMs(Speed);
    Coil_OFF1
    }
   
   }
  }  
}
}


无论是直接通过电脑串口给单片机命令 还是通过路由器输出的命令,都不亮灯。程序是在数码之家炒的,一个智能家居系统的。原理跟小车类似,目前手里没有其他材料,所以先打算用这个练练。求高手 不甚感激

回复

使用道具 举报

发表于 2012-12-18 19:49:21 | 显示全部楼层
楼主没有深入的了解,就不要乱套用的。还是老老实实的用论坛的下位机和上位机吧。估计是上位机和下位机用的控制代码不一样。你可能一个是ASCII、一个是Hex吧。或者上位机发送的不是你要的代码
还有你用串口助手直接发送给单片机能成功执行吗?
回复 支持 反对

使用道具 举报

发表于 2012-12-18 22:13:53 | 显示全部楼层
51开发板上的TTL是5V的,路由上输出的是3.3V的,是可能出现不能控的情况
回复 支持 反对

使用道具 举报

发表于 2012-12-19 09:51:28 | 显示全部楼层
念香 发表于 2012-12-18 22:13
51开发板上的TTL是5V的,路由上输出的是3.3V的,是可能出现不能控的情况

这个 怎么能转换一下???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-19 10:52:18 | 显示全部楼层
那用论坛的上位机和下位机也得论坛的控制板了啊,自己用单片机的话 ttl电压都是5v的
回复 支持 反对

使用道具 举报

发表于 2012-12-19 14:57:22 | 显示全部楼层
本帖最后由 cxw0102 于 2012-12-19 14:59 编辑
ccfx 发表于 2012-12-19 10:52
那用论坛的上位机和下位机也得论坛的控制板了啊,自己用单片机的话 ttl电压都是5v的

不用啊。我做的小车所有东西都是自己买的,新的703n路由,这个要自己接ttl和刷固件。驱动板是买的现成的。单片机是自己焊的最小系统。就接个晶振,用的stc的89c52。摄像头用的几年前买的视讯通。电机时买的黄色的TT电机。上位机用的论坛的,下位机也是配套的。没什么修改,其实也可以修改,看的懂和自己需要什么照着改就可以了,直接引出来的ttl,没出现什么电压不匹配现象。我觉得你像我一样不是十分懂得话就用论坛的下位机吧,我的反正是成功了,那个比较简单而且120论坛也有作品。
回复 支持 反对

使用道具 举报

发表于 2012-12-31 01:13:35 | 显示全部楼层
试试:路由的RX——单片机的TX;路由的TX——单片机的RX。
回复 支持 反对

使用道具 举报

发表于 2014-11-4 12:21:13 | 显示全部楼层
直接通过电脑TTL是可以控制的 可以通过串口发送命令
回复 支持 反对

使用道具 举报

发表于 2015-2-14 09:00:02 | 显示全部楼层
楼主的动手能力超强啊!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-22 23:31 , Processed in 1.119654 second(s), 20 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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