单片机c编程问题

来源:百度知道 编辑:UC知道 时间:2024/06/03 22:54:25
我用的是Keil uVision2编程器,要做一个正弦波,用了一个数组来表示采样点,int a[64];数组的数大于32时,编译时会有错误,信息是
DAC0.C(29): error C241: 'main': auto segment too large
这是什么意思?段太大了?我写的程序如下

#include<reg51.h>
#define data8 P0
sbit cs_xfer=P2^0;
sbit wr1_wr2=P3^6;
main(){
int number1[64]={0,0,2,5,9,15,21,29,37,46,
56,67,79,90,103,115,128,140,152,165,
176,188,199,209,218,226,234,240,246,250,
253,255,255,255,253,250,246,240,234,226,
218,209,199,188,176,165,152,140,128,115,
103,90,79,67,56,46,37,29,21,15,
9,5,2};

int i,a;
cs_xfer=0;
wr1_wr2=0;
for(;;){
for(i=1;i<=64;i++)
{
a=2000;
while(a!=0)
{
data8=number1[i];
a=a-1;
}
}
}
}

数据太多了大于128了,单片机运行时将数据调入RAM,而51只有128个,程序里加上其它就要报错了,
解决方法: 将数据放入程序空间 "code"
int code number1[64]={0,0,2,5,9,15,21,29,37,46,
56,67,79,90,103,115,128,140,152,165,
176,188,199,209,218,226,234,240,246,250,
253,255,255,255,253,250,246,240,234,226,
218,209,199,188,176,165,152,140,128,115,
103,90,79,67,56,46,37,29,21,15,
9,5,2};

数据太多了,装不小,你试试看chat a[64]能否通过。

在C51编译的时候,如果出现了“error C241: 'main': auto segment too large” 的错误,主要原因是由于 51 "DATA" 存储容量不足。
解决方法为:
(1)把宣告"DATA"的变数改成 "XDATA"
=>unsigned char XXXX 改成 unsigned char xdata XXXX
(2)快速的方法 : 在Keil C 的 Target标签中,
将Memory Model从small 设定为large,
这样编译的存储空间就从"DATA" 变成了 "XDATA",也就解决了存储容量不足的问题。