![]() |
發布時間: 2018-4-26 11:49
正文摘要:遇到了這樣一個問題,我本來程序可以運行,加了一個數組uchar pic6[]后,編譯沒錯誤,燒到單片機里卻運行不了,我把定義改為uchar xdata pic6[], memory model改為Pdata,code Romesize改為compact就可以運行了, ... |
笨笨兔 發表于 2018-4-26 16:13 沒外加,用的89c52 |
沒設置過,不知道 |
data和xdata是不一樣的RAM xdata,你外加芯片了嗎? |
這個應該打開軟件可以配置的 |
我之前一直把兩個選項設為最大值,都是第三個. |
#include <reg52.h> #include <string.h> #include <stdio.h> #include <intrins.h> #include <stdlib.h> #define uchar unsigned char #define uint unsigned int #define FOSC_110592M unsigned int rec_data_len_uart=0; unsigned char idata Buffer_Uart0_Rec[25]={0}; unsigned char TIME_BASE; unsigned char MACT_ENDB; unsigned char Rece_Errp=0; uchar PH[30]={"AT+CMGS=\"15051861770\"\r\n"}; uchar code IC_DAT[]; uchar pic1[]; uchar code pic2[]; uchar key; uchar MEDAT[16][4]; uchar cabinet[16]; uchar contain[4]; uchar data pic6[]; bit key_flag=0; bit cabinet_1=0; bit cabinet_2=0; bit cabinet_3=0; bit cabinet_4=0; bit cabinet_5=0; bit cabinet_6=0; bit cabinet_7=0; bit cabinet_8=0; bit cabinet_9=0; bit cabinet_10=0; bit cabinet_11=0; bit cabinet_12=0; bit cabinet_13=0; bit cabinet_14=0; bit cabinet_15=0; bit cabinet_16=0; sbit RS = P0^7; sbit WRD = P0^6; sbit E = P0^5; sbit PSB = P0^4; sbit RES = P0^3; void TransferData(char data1,bit DI); void display(void); void display_grapic(void); void delayms(uint n); void DisplayLine(uchar line1,uchar line2); void DisplayGraphic(uchar code *adder); void initinal(void); void DelaySec(int sec); void delay(uint m); void lcd_mesg(uchar *adder1); void KeyScan(); sbit key1=P3^5; sbit key2=P3^4; uchar code IC_DAT[]={ " " //0X80 " Express " //0X90 " Intelligent " //0X88 " Cabinet " //0X98 }; uchar pic1[]={ " 歡迎使用 " " " " 輸入號碼 " " " }; uchar code pic2[]={ " " " " "短信發送中......" " " }; uchar code pic3[]={ " " " " " 短信已發送 " " " }; uchar data pic6[]={ " " " " "choose " " " }; uchar code pic5[]={ " " " " " 無可用柜 " " " }; uchar code pic7[]={ " " " " " Error " " " }; CheckCabinet() { char n=1; if(cabinet_1==0) { cabinet[n]=1; n++; } if(cabinet_2==0) { cabinet[n]=2; n++; } if(cabinet_3==0) { cabinet[n]=3; n++; } if(cabinet_4==0) { cabinet[n]=4; n++; } if(cabinet_5==0) { cabinet[n]=5; n++; } if(cabinet_6==0) { cabinet[n]=6; n++; } if(cabinet_7==0) { cabinet[n]=7; n++; } if(cabinet_8==0) { cabinet[n]=8; n++; } if(cabinet_9==0) { cabinet[n]=9; n++; } if(cabinet_10==0) { cabinet_10=10; n++; } if(cabinet_11==0) { cabinet[n]=11; n++; } if(cabinet_12==0) { cabinet[n]=12; n++; } if(cabinet_13==0) { cabinet[n]=13; n++; } if(cabinet_14==0) { cabinet[n]=14; n++; } if(cabinet_15==0) { cabinet[n]=15; n++; } if(cabinet_16==0) { cabinet[n]=16; } if(cabinet_1&&cabinet_2&&cabinet_3&&cabinet_4&&cabinet_5&&cabinet_6&&cabinet_7&&cabinet_8&&cabinet_9&&cabinet_10&&cabinet_11&&cabinet_12&&cabinet_13&&cabinet_14&&cabinet_15&&cabinet_16==1) { initinal(); lcd_mesg(pic5); DelaySec(2); return(n); } return(n); } char ChooseCabinet() { char i; char m; char k; cch: initinal(); delay(20); i=0; lcd_mesg(pic6); delayms(10); ccheck: do { KeyScan(); } while(key_flag==0); key_flag=0; if(key==10)//確認鍵 { if(i==1) { for(m=0;m<=15;m++) { if(pic6[39]-'0'==cabinet[m]) return(m+1); } lcd_mesg(pic7); DelaySec(2); goto cch; } else if(i==2) { k=(pic6[39]-'0')*10+(pic6[40]-'0'); for(m=0;m<=15;m++) { if(k==cabinet[m]) return(m+1); } lcd_mesg(pic7); DelaySec(2); goto cch; } else { lcd_mesg(pic7); DelaySec(2); goto cch; } } else if(key==11)//退格鍵 { --i; pic6[39+i]=' '; initinal(); delayms(2); lcd_mesg(pic6); delayms(20); goto ccheck; } else { pic6[39]=key+'0';//存輸入 i++; goto ccheck; lcd_mesg(pic6); } delay(5); } void GetMEDAT(char v) { srand(TH0); MEDAT[v][0]=rand()%9+0; MEDAT[v][1]=rand()%9+0; MEDAT[v][2]=rand()%9+0; MEDAT[v][3]=rand()%9+0; } void SystemInit(void) { TMOD=0x01; TH0=(65536-45872)/256; // 定時50ms //晶振:11.0592MHZ TL0=(65536-45872)%256; ET0=1; TR0=1; EA=1; } void Timer0_IRQ(void) interrupt 1 { TH0=(655365-45872)/256; TL0=(655365-45872)%256; //進入中斷50ms +1次 TIME_BASE++; if(TIME_BASE == 20) // 20ms * 50ms = 剛好等于1000ms 也就是1秒 { TIME_BASE = 0; MACT_ENDB++; // 一秒加一次 if(MACT_ENDB==20) // 等于剛好20秒時間到 { MACT_ENDB = 0; Rece_Errp=1; } } } void SerialInti()//初始化程序(必須使用,否則無法收發) { TMOD=0x20;//定時器1操作模式2:8位自動重載定時器 #ifdef FOSC_12M //在這里根據晶振大小設置不同的數值初始化串口 TH1=0xf3;//裝入初值,波特率2400 TL1=0xf3; #else TH1=0xfd;//裝入初值,波特率9600 TL1=0xfd; #endif //end of SOC_12M TR1=1;//打開定時器 SM0=0;//設置串行通訊工作模式,(10為一部發送,波特率可變,由定時器1的溢出率控制) SM1=1;//(同上)在此模式下,定時器溢出一次就發送一個位的數據 REN=1;//串行接收允許位(要先設置sm0sm1再開串行允許) EA=1;//開總中斷 ES=1;//開串行口中斷 } /*串行通訊中斷,收發完成將進入該中斷*/ void Serial_interrupt() interrupt 4 { unsigned char temp_rec_data_uart0; temp_rec_data_uart0 = SBUF;//讀取接收數據 RI=0;//接收中斷信號清零,表示將繼續接收 Buffer_Uart0_Rec[rec_data_len_uart]=temp_rec_data_uart0; //接收數據 rec_data_len_uart++; if(rec_data_len_uart>24) { rec_data_len_uart=0; //從頭開始接收數據 } } void Uart1Send(uchar c) { SBUF=c; while(!TI);//等待發送完成信號(TI=1)出現 TI=0; } //串行口連續發送char型數組,遇到終止號/0將停止 void Uart1Sends(uchar *str) { while(*str!='\0') { SBUF=*str; while(!TI);//等待發送完成信號(TI=1)出現 TI=0; str++; } } //延時函數大概是1s鐘,不過延時大的話不準... void DelaySec(int sec) { uint i , j= 0; for(i=0; i<sec; i++) { for(j=0; j<65535; j++) { } } } void initinal(void) //LCD字庫初始化程序 { delay(40); //大于40MS的延時程序 PSB=1; //設置為8BIT并口工作模式 delay(1); //延時 RES=0; //復位 delay(1); //延時 RES=1; //復位置高 delay(10); TransferData(0x30,0); //Extended Function Set :8BIT設置,RE=0: basic instruction set, G=0 :graphic display OFF delay(100); //大于100uS的延時程序 TransferData(0x30,0); //Function Set delay(37); ////大于37uS的延時程序 TransferData(0x08,0); //Display on Control delay(100); //大于100uS的延時程序 TransferData(0x10,0); //Cursor Display Control光標設置 delay(100); //大于100uS的延時程序 TransferData(0x0C,0); //Display Control,D=1,顯示開 delay(100); //大于100uS的延時程序 TransferData(0x01,0); //Display Clear delay(10); //大于10mS的延時程序 TransferData(0x06,0); //Enry Mode Set,光標從右向左加1位移動 delay(100); //大于100uS的延時程序 } /******************************************************************** * 名稱 : Main() * 功能 : 主函數 * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void main(void) { while(1) { start: initinal(); //調用LCD字庫初始化程序 delay(20); //大于100uS的延時程序 lcd_mesg(IC_DAT); //顯示中文漢字 delayms(10); do { KeyScan(); } while(key_flag==0); key_flag=0; if(key==12) //存快遞 { int z=17; int m; char v; SystemInit(); //開始定時 do { for(m=17;m<=27;m++) //號碼清除 { pic1[m]=' '; } memset(cabinet,0,sizeof(cabinet));//初始化可用柜號數組 if(CheckCabinet()==1) { goto start; } else { v=ChooseCabinet(); initinal(); lcd_mesg(pic1); ee1: do { KeyScan(); } while(key_flag==0&&Rece_Errp==0); if(Rece_Errp==1) goto ee2; key_flag=0; if(key==11)//退格鍵 { --z; pic1[z]=' '; initinal(); delayms(2); lcd_mesg(pic1); delayms(20); goto ee1; } else if(key==10) //存確認 { int i; for(i=0;i<=10;i++) PH[i+9]=pic1[i+17]; GetMEDAT(v); contain[0]=MEDAT[v][0]+'0'; contain[1]=MEDAT[v][0]+'0'; contain[2]=MEDAT[v][0]+'0'; contain[3]=MEDAT[v][0]+'0'; lcd_mesg(pic2); delayms(200); SerialInti(); Uart1Sends("AT+CSCS=\"GSM\"\r\n"); DelaySec(1);//延時大約3秒 1 Uart1Sends("AT+CMGF=1\r\n"); DelaySec(1);//延時3秒 Uart1Sends("AT+CSCA?\r\n"); DelaySec(1);//延時3秒 Uart1Sends("AT+CSMP=17,167,0,241\r\n"); DelaySec(1);//延時3秒 Uart1Sends(PH);//號碼 DelaySec(1);//延時3秒 Uart1Sends(contain);//修改短信內容,短信內容可為英文和數字 Uart1Send(0x1a); DelaySec(1);//延時3秒 lcd_mesg(pic3); DelaySec(2); } else { pic1[z]=key+'0';//存輸入 z++; delay(5); lcd_mesg(pic1); delayms(20); goto ee1; } } } while(Rece_Errp==1); ee2: Rece_Errp=0; goto start; } } } /******************************************************************** * 名稱 : 信息發送 * 功能 : * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void lcd_mesg(unsigned char *adder1) { unsigned char i; TransferData(0x80,0); //Set Graphic Display RAM Address delay(100); for(i=0;i<32;i++) { TransferData(*adder1,1); adder1++; } TransferData(0x90,0); //Set Graphic Display RAM Address delay(100); for(i=32;i<64;i++) { TransferData(*adder1,1); adder1++; } } /******************************************************************** * 名稱 : 信息判斷 * 功能 : * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void TransferData(char data1,bit DI) //傳送數據或者命令,當DI=0是,傳送命令,當DI=1,傳送數據. { WRD=0; RS=DI; delay(1); P2=data1; E=1; delay(1); E=0; } /******************************************************************** * 名稱 : 延時 * 功能 : * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void delayms(unsigned int n) //延時10×n毫秒程序 { unsigned int i,j; for(i=0;i<n;i++) for(j=0;j<2000;j++); } /******************************************************************** * 名稱 : 延時 * 功能 : * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void delay(unsigned int m) //延時程序 { unsigned int i,j; for(i=0;i<m;i++) for(j=0;j<10;j++); } void KeyScan() //鍵盤掃描程序,key應定義為全局無符號字符型 { uchar i,temp,temp1=0xfe; for(i=0;i<4;i++) { P1=temp1; temp=P1&0xf0; if(temp!=0xf0) { delayms(1); temp=P1&0xf0; if(temp!=0xf0) { while((P1&0xf0)!=0xf0); switch(temp) { case 0xe0:key=4*i+0;break; case 0xd0:key=4*i+1;break; case 0xb0:key=4*i+2;break; case 0x70:key=4*i+3;break; } key_flag=1; break; } } temp1=(temp1<<1)|0x01; } } |
西瓜_ 發表于 2018-4-26 13:59 沒有故障,代碼放樓下,剛剛試了一下,我的這個數組定義為data就能運行,定義為xdata就運行不了,這兩種keil都不報錯 |
貼代碼或者故障碼呀 |
我之前一直把兩個選項設為最大值,都是第三個 |