这个程序编译的时候总是出现下面这个情况 MedWin v2.39 Translating F:\单片机\挑战杯\程序1\tzb.c...... C51 COMPILER V7.50 - SN: K1DZP-5IUSHE COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2004 C51 COMPILATION COMPLETE. 0 WARNING(S), 1 ERROR(S) ERROR C249 IN LINE 238 OF TZB.C: 'DATA': SEGMENT TOO LARGE Translate completely and find errors!
程序如下 /*------------------------------------------------------** ** 程序的基本简介 ** **定义: ** **------------------------------------------------------*/ #include <reg52.h> #include <absacc.h> #include <intrins.h> #define uchar unsigned char uchar sbuf[10],rbuf[60],chgbuf[60]; uchar count,second=0,minute,hour; bit fgsm,fghot,fgrd; bit revfg,intfg; sbit p20=P2^0; sbit p21=P2^1; /*------------------------------------------------------** **函数声明 **------------------------------------------------------*/ void delay50ms(unsigned int nb); void init(); dat_bulid(); void data_chg(); M_contor(); send();
/*-----------------------------------------------------** ** 函数原型:void delay50ms(unsigned int nb) ** ** 函数功能:50ms定时 ** 入口参数: nb **-----------------------------------------------------*/ void delay50ms(unsigned int nb) { uchar i; while(nb--) { for(i=0;i<125;i++); } } /*-----------------------------------------------------** **函数原型:void init() ** **函数功能:串口定时器初始化,方式2,波特率9600 ** **入口参数:无 ** **-----------------------------------------------------*/ void init() { TMOD=0x21; TL1=0xfd; TH1=TL1;
TH0=0x0c; TL0=0xdc; SCON=0x50; PCON=0x00; TR1=1; EA=1; } /*-------------------------------------------------------** **函数原型:void time0() interrupt 1 using 1 ** **函数功能:时间定时,用于开启家用电器 ** **入口参数:无 **-------------------------------------------------------*/ void time0() interrupt 1 using 1 { count++; TH0=0x0c; TL0=0xdc; if(count==16) { count=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; } } } } }
/*------------------------------------------------------** **函数原型:void int0() interrupt 0 using 0 ** **函数功能:外部中断入口,p15代表烟雾传感器,p16代表 ** **热释电传感器,p17代表无线模块接受中断 ** **fgsm烟雾传感器,fghot热释电传感器,fgrd无线 ** **入口参数:无 ** **-------------------------------------------------------*/ void int0() interrupt 0 using 0 { intfg=1; switch(P1&0xe0) { case 0x20: fgsm=1; break; case 0x40: fghot=1; break; case 0x80: { if((P1&0x0f)==0x0f) fgrd=1; }break; default: break; } }
/*------------------------------------------------------** **函数原型:void uart1() interrupt 4 using 1 ** **函数功能:串口接受中断 ** **出口参数:全局变量rbuf[] ** **------------------------------------------------------*/ void uart1() interrupt 4 using 1 { uchar i; revfg=1; RI=0; for(i=0;i<5;i++) { rbuf=SBUF; while(RI==0); RI=0; } } /*-----------------------------------------------------** **函数原型:dat_bulid() ** **函数功能:实现发送前的数据处理 ** **p20热水器,p21空调 ** **入口参数:无 ** **------------------------------------------------------*/ dat_bulid() { uchar i; P2=0xff; for(i=0;i<60;i++) { delay50ms(20); delay50ms(20); } //延时两分钟,等待主人遥控信息 if(fgsm) sbuf[0]=0x01; else sbuf[0]=0x00; if(fghot&(!fgrd)) sbuf[1]=0x03; else sbuf[1]=0x02; i=P2&0x03; //读取家电运行状况 switch(i) { case 0x00: {sbuf[2]=0x05;sbuf[3]=0x07;}break; case 0x01: {sbuf[2]=0x04;sbuf[3]=0x07;}break; case 0x02: {sbuf[2]=0x05;sbuf[3]=0x06;}break; case 0x03: {sbuf[2]=0x04;sbuf[3]=0x06;}break; default:break; } }
/*----------------------------------------------------------** **函数原型:void data_chg() ** **函数功能:16进制转换10进制 ** **入口参数:无 ** **出口参数:无 ** **-----------------------------------------------------------*/ void data_chg() { uchar i; for(i=0;i<60;i++) chgbuf=(rbuf/16)*10+rbuf%16; } /*-----------------------------------------------------------** **函数原型:M_contor() ** **函数功能:实现对家用电器的定时控制 ** **入口参数:无 ** **出口参数:无 ** **-----------------------------------------------------------*/ M_contor() { uchar i; data_chg(); hour=chgbuf[1]; minute=chgbuf[2]; TR0=1; //开定时中断 for(i=3;i<60;i++) { if((chgbuf&0x0e)==0x00) { if((chgbuf&0x01)==0x01) { if((hour=chgbuf[i+1])&(minute=chgbuf[i+2])) p20=1; } else { if((hour=chgbuf[i+1])&(minute=chgbuf[i+2])) p21=0; } } else if((chgbuf&0x0e)==0x02) { if((chgbuf&0x01)==0x01) { if((hour=chgbuf[i+1])&(minute=chgbuf[i+2])) p20=1; } else { if((hour=chgbuf[i+1])&(minute=chgbuf[i+2])) p21=0; } } else { if((chgbuf&0x01)==0x01) { if((hour=chgbuf[i+1])&(minute=chgbuf[i+2])) p20=1; } else { if((hour=chgbuf[i+1])&(minute=chgbuf[i+2])) p21=0; } } } } /*------------------------------------------------------** **函数原型:void send() ** **函数功能:数据的发送 ** **入口参数:全局变量sbuf[] ** **------------------------------------------------------*/ send() { uchar i; dat_bulid(); ES=0; //发送时关串口中断 for(i=0;i<4;i++) { SBUF=sbuf; while(TI==0); TI=0; } ES=1; } /*----------------------------------------------------------------** **函数原型: **函数功能: **-----------------------------------------------------------------*/ void main() { init(); send(); while(1) { if(revfg) { revfg=0; M_contor(); } if(intfg) { intfg=0; send(); } } } |