大神求救:51单片机发送字符串显示零

[复制链接]
4996|56
 楼主| Jinss 发表于 2014-9-10 18:10 | 显示全部楼层
wangch_sh 发表于 2014-9-10 16:51
在一个文件中定义,在其他文件中用extern声明。

请问前辈是C文件还是头文件中定义,在头文件还是C文件中声明?
 楼主| Jinss 发表于 2014-9-10 18:14 | 显示全部楼层
前辈,如果在头文件中定义字符数组变量,在C文件中使用,串口发出去的都是零呀。为什么呀?
我之前是吧字符数组直接定义在串口C文件中的就可以
 楼主| Jinss 发表于 2014-9-10 18:15 | 显示全部楼层
望前辈指教。
wangch_sh 发表于 2014-9-10 18:16 | 显示全部楼层
你不是多个C文件吗?
wangch_sh 发表于 2014-9-10 18:17 | 显示全部楼层
多个C文件对应多个H文件
wangch_sh 发表于 2014-9-10 18:19 | 显示全部楼层
不管你在C文件里定义还是声明,在一组文件(C文件加上对应的H文件)只能有一个。
也就是说C文件定义了,H文件就什么都不用做。
C文件声明了,H文件就什么也不用做。
反之,也一样。
 楼主| Jinss 发表于 2014-9-10 18:19 | 显示全部楼层
我只用一个H文件。其他全是C文件,而且C文件都包含这个H文件。我是这样做的。
wangch_sh 发表于 2014-9-10 20:23 | 显示全部楼层
在H文件里定义,在用到的C文件里声明。
xuwulian 发表于 2014-9-11 11:37 | 显示全部楼层
C文件:
unsigned char state1data[7]={"STATE1"};
头文件:
extern unsigned char state1data[7];
这样才行
 楼主| Jinss 发表于 2014-9-11 19:56 | 显示全部楼层
wangch_sh 发表于 2014-9-10 20:23
在H文件里定义,在用到的C文件里声明。

前辈能不能举个具体的例子。小弟谢谢了。
wangch_sh 发表于 2014-9-11 20:13 | 显示全部楼层

本帖子中包含更多资源

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

×
 楼主| Jinss 发表于 2014-9-11 20:19 | 显示全部楼层
有没有前辈遇到过串口打印出错的情况。

本帖子中包含更多资源

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

×
 楼主| Jinss 发表于 2014-9-11 20:21 | 显示全部楼层
本帖最后由 Jinss 于 2014-9-11 22:16 编辑

本来应该打印1:0.012:0.151:0.012:0.15
  1. void interrupt0() interrupt 0
  2. {
  3.         timercount = 0;         //reset  
  4.         IE = 0x0;                   //disable all interrupt
  5. //        TCON = 0x05;        //0b0000 0101
  6.                                          //shutdown t0 and t1
  7.                                          //reset t0 and t1 interrupt flag bit
  8.         if(INTc == 0)             //state1
  9.         {
  10.                 //TCON = 0x01;//int0 negative edge triggered,int0
  11.                                         //low voltage triggered
  12.                 uart();
  13.                 IE = 0x83;       //enable t0 and int0 inerrupt
  14.                 TR0 = 1;
  15.         }
  16.         else                          //state2
  17.         {
  18.                 uart();
  19.                 IE = 0x89;        //enable UART1,t1 and int0 interrupt
  20.                 TR1 = 1;
  21.         }
  22.         INTc = ~INTc;
  23. }
  24. void uart()
  25. {
  26.         unsigned char i;
  27.         unsigned char state1data[7]={"1:0.01"};
  28.         unsigned char state2data[7]={"2:0.15"};
  29.         RCAP2L = 0xdc;
  30.         RCAP2H = 0xff;
  31.         T2CON = 0x34;        //timer2
  32.         SCON = 0x40;          //0b0100 0000
  33.                                         //mode 1, receive disabled,
  34.         PCON = 0x0;           //baudrate no multiply, frame no error check

xuanxuy 发表于 2014-9-11 23:03 | 显示全部楼层
RCAP2L=0xa0;//载入初值9600
RCAP2H=0xff;


应该改为

RCAP2L=0xa0;//载入初值9600
RCAP2H=0xa0;
这样应该就对了
qq2512262471 发表于 2014-9-11 23:21 | 显示全部楼层
 楼主| Jinss 发表于 2014-9-12 22:04 | 显示全部楼层
xuanxuy 发表于 2014-9-11 23:03
RCAP2L=0xa0;//载入初值9600
RCAP2H=0xff;

89c52rc的定时器2用作串口时钟的时候,RCAP2H和RCAP2L构成一个16位的寄存器存放定时器溢出的重装值。不是你说的这样的吧。
wangguiyuan1983 发表于 2014-9-14 19:51 | 显示全部楼层
学习了!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部