在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2787|回复: 4

[求助] 急~~~STC的PWM和串口发送问题

[复制链接]
发表于 2011-4-15 12:06:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各位大神大虾,小弟编程过程中遇到几个问题, 希望能得到 各位的帮助,小弟不胜感激!·!

我开发用的是STC8925C,11.0592M的晶振
,这是我写的一段程序,作用是串口收到电脑给的信号(0~256),从而来调节占空比,但是我用串口调试的时候,不是按我想的0~256的变化,比如我输进去0x80,应该是出来一半的占空比,结果却出来高电平占大部分时间
#include <REG52.H>               
#include <stdio.h>
#include <intrins.h>
unsigned char ZKB1=0x00;
unsigned char ZKB2=0x00;
char flag=1;
sbit p1=P0^0;
sbit p2=P1^0;
void inituart(void)           /*串口初始化
{ SCON=0x40;         
  PCON=0x00;
  REN=1;
  TI=0;
  RI=0;
  TH1=0xfd;
  TL1=0xfd;
  TR1=1;
  }
unsigned char incept(void)            /* 串口接收子函数
{
   unsigned char uart_data;
   while(RI==0);
   RI=0;
   uart_data=SBUF;
return uart_data;
}
void  timer0(void) interrupt 2              时间中断0,即产生PWM
{               
TR0=0;
TH0=0xff;
if(flag==1)
{  TH0=0xff;
   TL0=ZKB1;
   flag=0;
   p2=1;
}
else
{ TH0=0xff;
   TL0=ZKB2;
   flag=1;
   p2=0;
}   
TR0=1;
}
void main(void)              主函数,
{
   inituart();
   TMOD=0x21;
   TH0=0xff;
   TL0=0x00;
   TR0=1;
   ET0=1;
   EA=1;
while(1)
   { while(RI==1)
   {ZKB1=incept();         
  ZKB2=0xff-ZKB1;}
   }
}


还有,我要实现在另外一个功能,就是采集电机上的encoder的位置,上面有A,B,A和B是正交的,A接int0,当A来信号,检测B的电平高低,从而判断是正转还是反转
#include <REG52.H>               
#include <stdio.h>
#include <intrins.h>
unsigned short position=0;
unsigned short position1=0;
sbit p1=P0^0;
void uart(void)             串口初始化
{ SCON=0x40;         
  PCON=0x00;
  REN=1;
  TI=0;
  RI=0;
  TMOD=0x20;
  TH1=0xfd;
  TL1=0xfd;
  TR1=1;
  }
void sendbuf(unsigned char _data)          串口发送子函数
{ SBUF=_data;
   while(TI==0);
   TI=0;
  }
void INT_0(void)interrupt 0
{  
   if (p1==0)
   position++;
    else
   position--;
}
  main()                            主函数,送出数据
{  uart();
   EA=1;
   EX0=1;
   IT0=1;
   while(1)
   {            
       sendbuf(position);
       position1=position&0xff00;
    position1=position1>>8;
    sendbuf(position1);
  }
}

这个CK的程序和PWM的程序放一起就不工作了,也不知道为什么,特别是把下面这段程序
void sendbuf(unsigned char _data)
{ SBUF=_data;
   while(TI==0);
   TI=0;
  }
放到PWM里,pwm就不出来结果来,是和接收口冲突了么?

希望各位好心人帮帮忙。小弟不胜感激
 楼主| 发表于 2011-4-15 12:13:06 | 显示全部楼层
这是我把两个功能放在一起的函数,实现不了功能,两个都不行,一个出来全是高电平,一个不出来数。
#include <REG52.H>               
#include <stdio.h>
#include <intrins.h>
unsigned char ZKB1=0x00;
unsigned char ZKB2=0x00;
char flag=1;
sbit p1=P0^0;
sbit p2=P1^0;
unsigned short position=0;
unsigned short position1=0;
void sendbuf(unsigned char _data)              定义串口发送程序
{ SBUF=_data;
   while(TI==0);
   TI=0;
  }
void INT_0(void)interrupt 0                        中断0,接encoder上A的int0,判断B,达到计数效果
{  
   if (p1==0)
   position++;
    else
   position--;
}
void inituart(void)                                  串口初始化
{ SCON=0x40;         
  PCON=0x00;
  REN=1;
  TI=0;
  RI=0;
  TH1=0xfd;
  TL1=0xfd;
  TR1=1;
  }
unsigned char incept(void)                            串口接收子函数
{
   unsigned char uart_data;
   while(RI==0);
   RI=0;
   uart_data=SBUF;
return uart_data;
}
  void sendbuf(unsigned char _data)
{ SBUF=_data;
   while(TI==0);
   TI=0;
  }
void  timer0(void) interrupt 2                时间中断0,产生PWM
{               
TR0=0;
TH0=0xff;
if(flag==1)
{  TH0=0xff;
   TL0=ZKB1;
   flag=0;
   p2=1;
}
else
{ TH0=0xff;
   TL0=ZKB2;
   flag=1;
   p2=0;
}   
TR0=1;
}
void main(void)                     主函数
{
   inituart();
   TMOD=0x21;
   TH0=0xff;
   TL0=0x00;
   TR0=1;
   ET0=1;
   EA=1;
while(1)
   { while(RI==1)
   {ZKB1=incept();         
  ZKB2=0xff-ZKB1;}
   }
}
发表于 2011-4-19 21:11:41 | 显示全部楼层
第一个需要将RX位置1,用于接收串口数据
发表于 2011-4-19 21:24:02 | 显示全部楼层
第二个
sendbuf(position);  sendbuf(position1);   最好将position的类型转换下
p1口接收数据时要先置1,再读数据
发表于 2011-4-19 21:35:45 | 显示全部楼层
第三个,接收数据前,将该位置1(RX,p1)
外部中断没开
没有调用输出函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-17 01:58 , Processed in 0.027443 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表