关于单片机 数组使用

请教一下,我想用电脑给单片机发送一串数字,比如 +IPD,0,2:01 共11位数,最后两位可变,如果最后两位为01则P1.0输出高电平,若最后两位为89则P1.0输出低电平,请问一下C语言怎么编程,最好能帮忙解释(接收数据后 使用数组 开辟缓冲区 那一块),谢谢。

你给的信息太有限,
我需要知道你的单片机的具体型号,还有你创建工程的属性。
我先猜一下:
你用的是stc增强型52单片机,除了自带的256字节内存还有256字节的扩展内存,并且你在工程属性里面选择的是大内存模式(large:
variables
in
xdata
)这样在你定义内存的时候如果不加data,idata,pdata关键字的话,默认就是xdata。这用的是外部ram,是通过p0和p2口用总线模式扩展芯片得到的,可访问64k的内存空间。但是stc增强型52内置了256字节(某些版本会更大,我猜你用的是256的),默认访问方式一样,但是被stc集成到了片内。你定义了一个a[160]一个b[160],加起来远远超过256.按你的说法,有用的是160+48(这里你又有一个表达错误,a[0]~a[47]应该是48个。)=208个,算上你其他地方定义的变量,应该满256个,那么a[48]~a[159]是怎么出现的呢,理论上是从p0口读回来的。但是这里你还有一个不严谨的地方,不知道你有没有证明到底是a[48]~a[159]全部成为了0xff还是b[48]~b[159]早早的就成为了0xff。
处理办法一:内存模式先改成small:variables
in
data
.
这时你应该都无法通过编译。
然后改变这句话:void
copy2(char
a[160])
变成
void
copy2(char
pdata
a[160])
方法二:直接改
char
b[160]=
变成
char
code
b[160]=
试试看。
如果猜错了,请别笑话我。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-03-08
数组名是一个指针,而且是常量指针,不可改变指向
数组名指向数组的第一个元素并不指向整个数组,因为步长不是整个数组的长度
可以使用指针访问数组元素和使用数组下标访问数组元素一样
[ ]中的数字代表偏移量
数组与指针的区别
数组并不是指针。
指针保存的是数据的地址,数组保存数据本身,指针间接访问数据,首先取得指针的内容,把他做为地址,从这个地址提取数据;数组直接访问数据
数组做为函数参数时会退化为指针。本回答被网友采纳
第2个回答  2019-03-06
看你需要定义什么类型的数组, 8位 的是 char array[20]; 16位的是 int array[20]; 20表示数组的大小
赋值的话可以 array[0]=100; 表示 数组的第一个元素 的值=100追问

谢谢你的回答,我是想知道 uchar buf[16],num 其中为逗号后面的num是什么作用?谢

第3个回答  2019-03-08
#include<reg51.h>
#define uchar unsigned char
uchar rec[12];
uchar code dd[9]="+IPD,0,2:";
uchar num;
bit uartflag;
sbit p10=P1^0;
void uart() interrupt 4
{
uchar dat,i;
if(RI)
    {
    RI=0;
    dat=SBUF;
    if(dat=='+')
        {
        num=0;
        }
    rec[num]=dat;
    num++;
    if(num>=11)uartflag=1;
    }
}
main()
{
uchar i,error;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
ES=1;
EA=1;
uartflag=0;
num=0;
while(1)
    {
    if(uartflag)
        {
        error=0;
        for(i=0;i<9;i++)
            {
            if(dd[i]!=rec[i]error=1;
            }
        if(error==0)
            {
            if(rec[9]=='0' && rec[10]=='1')p10=0;
            else if(rec[9]=='8' && rec[10]=='9')p10=1;
            }
        }
    }
}

追问

感谢你的回答,但是程序有错误,不能生产hex文件

第4个回答  2019-03-06
回答问题领红包
相似回答