串口通信 点击:203 | 回复:2



老狼

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 821回
  • 年度积分:0
  • 历史总积分:1588
  • 注册:2008年3月01日
发表于:2008-10-25 21:05:06
楼主

下面这段程序是要实现对574的采样的,其中定义了一个标志点在void initserial() ,发送0到PC机,但单片机一上电就通过串口调试助手收到两数据,前面一个是随机的,后面才是0.搞不懂为什么前面有个随机数!

?

#include /*包含51单片机的C语言库文件*/
#include /*使用其中定义的宏来访问绝对地址*/
#include
#include /*字符循环库函数*/
#include
#define uint unsigned int
#define uchar unsigned char 
#define ADCOM XBYTE 【0x4000】 /*AD芯片命令口,任何数据发送给它都会启动它采样*/
#define ADHI XBYTE 【0x4002】 /*AD芯片高八位地址*/
#define ADLO XBYTE 【0x4003】 /*AD芯片低四位地址;注意,这里只有四位,所以待会高八位要做一个向左环移四位再相加*/
uint TEST;
uchar bdata sample_permit,send_permit;
uchar command;
void sentdata(); /*函数声明*/
void initserial();
main()
{ initserial() ;
P1=0xf8; /*采样通道设置为0通道*/
sample_permit=0;
send_permit=0;
while(sample_permit==0);
ADCOM=0;
while(send_permit==0);
sentdata();
while(1);
}

void interserial() interrupt 4
{
EA=0;
if(RI)
{
sample_permit=1;
RI=0;
}
EA=1;
}

void interint0(void) interrupt 0 using 1 /*开INT0(P3.2跟ADstate引脚连在一起)中断。*/
{
uint ad_hl;
uchar k0;
EA=0;
for(k0=0;k0<=20;k0++)
{ _nop_(); } /*延时*/
ad_hl=((uint)ADHI<<4)+(ADLO&0x0f); /*ad_hl取采样得到的12位二进制数据*/
TEST=(ad_hl&0x0fff);
send_permit=1;
EA=1;
}
void initserial()
{
SCON = 0x50; /* SCON 工作方式1, 允许发送; 单机通信, 开中断*/
TMOD = 0x20; /*T1在方式2,8位,常数自动装入*/
TH1=0xfd; /*TH1 用于设置波特率, 9.6kB/s*/
IP=0x10; /*优先级别,串口为高优先级*/
PCON=0x00; /*波特率不加倍*/
EA=1; /*允许总中断*/
EX0=1; /*允许INT0中断*/
ES=1; /*允许串口中断*/
TCON = 0x41; /* TCON 启动定时器1,外部中断0采用边沿触发模式*/
SBUF=0;
while(TI==0); /*等待发送出去*/
TI=0;
}

void sentdata()
{
uchar ad_h,ad_l;
ad_h=(uchar)(TEST>>8); /*变为八位*/
ad_l=(uchar)(TEST&0x00ff); /*变为八位*/
SBUF=ad_h;
while(TI==0); /*等待发送出去*/
TI=0;
SBUF=ad_l;
while(TI==0); /*等待发送出去*/
TI=0;
}




老狼

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 821回
  • 年度积分:0
  • 历史总积分:1588
  • 注册:2008年3月01日
发表于:2008-10-27 08:39:16
1楼

谢谢大家解决一下啊!

老狼

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 821回
  • 年度积分:0
  • 历史总积分:1588
  • 注册:2008年3月01日
发表于:2008-10-27 19:28:03
2楼
问题已经解决了!可能是烧录时问题吧,重新烧了一次就OK了

热门招聘
相关主题

官方公众号

智造工程师