程序里面錯的地方是我從別的程序移植過來的,想請大家幫我分析一下錯在哪里,怎樣解決,謝謝!
單片機源程序如下:
- #include<reg52.h>
- //宏定義
- #define uint unsigned int
- #define uchar unsigned char
- #define Data_ADC0809 P0 //定義P0口為Data_ADC0809
- //sbit PARSER = P2^0; //串并行控制位
- //sbit BYTE = P2^1; //高低字節控制位
- //sbit RC = P2^4; //讀取轉換控制位
- //sbit BUSY = P2^2; //忙狀態位
- //函數聲明
- extern uchar ADC0809();
- sbit ST=P2^0;
- sbit EOC=P2^1;
- sbit OE=P2^2;
- sbit ADDR_A = P3^5; //低位地址控制位
- sbit ADDR_B = P3^6; //低位地址控制位
- sbit ADDR_C = P3^7; //高位地址控制位
- void ConfigUART(unsigned int baud); //串行口配置函數
- void ConfigTimer0(); //定時器0配置函數
- void SendData(unsigned char ch); //字符發送函數
- void SendString(char *s); //字符串發送函數
- void GetVoltage(); //ADC電壓獲取函數
- unsigned int Linear(double v); //線性插值函數,參數v為實測電壓
- void DataProcess(); //數據處理函數
- void LedBufRefresh(); //數碼管顯示緩沖區刷新函數
- void UartSend(); //串口數據發送函數
- void delay(uint t);
- unsigned char voltage[] = {'0','.','0','0','0',0};
- unsigned char time_used[] = {'0','0','0',0};
- unsigned char percentage[] = {'0','0','0',0};
- unsigned long j,time_used_value,result,percentage_value,voltage_value;
- unsigned int code time_sample[21]={0,18,36,54,72,90,108,126,144,162,180,198,216,234,252,270,288,306,324,342,360};
- double code voltage_sample[21]={4.35,4.24,4.135,4.005,3.92,3.889,3.858,3.826,3.8,3.78,3.762,3.743,3.725,3.705,3.686,3.667,3.65,3.628,3.492,3.05,2};
- //共陽數碼管顯示字符轉換表
- unsigned char code LedChar[] = {
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
- };
- //數碼管顯示緩沖區,初值0x00確保啟動時都不亮
- unsigned char LedBuff[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- void main()
- {
- ConfigUART(9600); //配置串行口工作模式及參數
- ConfigTimer0(); //配置定時器0用于數碼管刷新
- EA = 1; //打開總中斷
- while(1)
- {
- //正常模式
- if(Mode==0)
- {
- //讀取AD值
- temp=ADC0809();
- }
- GetVoltage(); //獲取ADC電壓值
- DataProcess(); //數據處理
- LedBufRefresh(); //顯示緩沖區刷新
- UartSend(); //串口發送
- for(j=0;j<30000;j++); //延時讀取
- }
- }
- /* 數據處理函數 */
- void DataProcess()
- {
- /* 計算電壓值 */
- voltage_value = (unsigned long)(((double)result * 10 / 32767) * 1000 + 0.5);
- /* 電壓值數組 */
- voltage[4] = '0' + voltage_value % 10;
- voltage[3] = '0' + (voltage_value /10) % 10;
- voltage[2] = '0' + (voltage_value /100) % 10;
- voltage[0] = '0' + (voltage_value /1000) % 10;
- /* 剩余用時數組 */
- time_used_value = Linear((double)result * 10 / 32767);
- time_used[2] = '0' + time_used_value % 10;
- time_used[1] = '0' + (time_used_value / 10) % 10;
- time_used[0] = '0' + (time_used_value / 100) % 10;
- /* 百分比數組 */
- percentage_value =
- (unsigned long)((double)(180000 - time_used_value * 500) / 168000 * 100 + 0.5);//改過數據
- percentage[2] = '0' + percentage_value % 10;
- percentage[1] = '0' + (percentage_value / 10) % 10;
- percentage[0] = '0' + (percentage_value / 100) % 10;
- if((percentage_value / 100) % 10) //處理百分比最高位
- {
- percentage[0] = '0' + (percentage_value / 100) % 10;
- }
- else
- {
- percentage[0] = ' ';
- }
- }
- /* 線性插值函數,參數v為實測電壓,返回插值時間結果 */
- unsigned int Linear(double v)
- {
- unsigned int i,t1,t2,t;
- double v1,v2;
- if(v >= 4.35) //大于最大電壓
- {
- t = 0;
- return t;
- }
- if(v <= 2) //小于最小電壓
- {
- t = 360;
- return t;
- }
- for(i=0; i<21; i++) //遍歷插值范圍
- {
- if(voltage_sample[i] < v)
- {
- v1 = voltage_sample[i-1];
- v2 = voltage_sample[i];
- t1 = time_sample[i-1];
- t2 = time_sample[i];
- t = t2 - (v - v2) * (double)(t2 - t1) / (v1 - v2);
- break; //計算插值結果t
- }
- else if(voltage_sample[i] == v)
- {
- t = time_sample[i]; //恰好取采樣值
- break;
- }
- }
- return t;
- }
- /* ADC電壓獲取函數 */
- void GetVoltage()
- uchar ADC0809()
- {
- uchar temp_=0x00;
- //初始化高阻太
- OE=0;
- //轉化初始化
- ST=0;
- //開始轉換
- ST=1;
- ST=0;
- //外部中斷等待AD轉換結束
- while(EOC==0)
- //讀取轉換的AD值
- OE=1;
- temp_=Data_ADC0809;
- OE=0;
- return temp_;
- }
- /* 定時器0中斷服務函數 */
- void InterruptTimer0() interrupt 1
- {
- static unsigned char i = 0; //動態掃描的索引
- TH0 = 0xFC; //重新加載初值
- TL0 = 0x67;
- //以下代碼完成數碼管動態掃描刷新
- P1 = 0x00; //顯示消隱
- switch(i) //動態掃描
- {
- case 0: ADDR_C = 0; ADDR_B = 0; ADDR_A = 0; i++; P1=LedBuff[0]; break;
- case 1: ADDR_C = 0; ADDR_B = 0; ADDR_A = 1; i++; P1=LedBuff[1]; break;
- case 2: ADDR_C = 0; ADDR_B = 1; ADDR_A = 0; i++; P1=LedBuff[2]; break;
- case 3: ADDR_C = 0; ADDR_B = 1; ADDR_A = 1; i++; P1=LedBuff[3]; break;
- case 4: ADDR_C = 1; ADDR_B = 0; ADDR_A = 0; i++; P1=LedBuff[4]; break;
- case 5: ADDR_C = 1; ADDR_B = 0; ADDR_A = 1; i++; P1=LedBuff[5]; break;
- case 6: ADDR_C = 1; ADDR_B = 1; ADDR_A = 0; i=0; P1=LedBuff[6]; break;
- //case 7: ADDR_C = 1; ADDR_B = 1; ADDR_A = 1; i=0; P1=LedBuff[7]; break;
- //保留最低為數碼管不使用
- default: break;
- }
- }
- /* 數碼管顯示緩沖區刷新函數 */
- void LedBufRefresh()
- {
- LedBuff[6] = ~LedChar[percentage_value % 10];
- LedBuff[5] = ~LedChar[(percentage_value / 10) % 10];
- if((percentage_value / 100) % 10) //百分比最高位處理
- {
- LedBuff[4] = ~LedChar[(percentage_value / 100) % 10]; //為1則顯示
- }
- else
- {
- LedBuff[4] = 0; //否則不顯示
- }
- LedBuff[3] = ~LedChar[voltage_value % 10];
- LedBuff[2] = ~LedChar[(voltage_value /10) % 10];
- LedBuff[1] = ~LedChar[(voltage_value /100) % 10];
- LedBuff[0] = ~(LedChar[(voltage_value /1000) % 10] & 0x7F); //最高位小數點處理
- }
- void UartSend()
- {
- SendString("當前電壓:");
- SendString(voltage);
- SendString("V");
- // SendString(" 已用時間:");
- // SendString(time_used);
- // SendString("Min");
- SendString(" 剩余電量:");
- SendString(percentage);
- SendString("%\r\n");
- }
- /* 串口配置函數,baud-通信波特率 */
- void ConfigUART(unsigned int baud)
- {
- SCON = 0x50; //配置串口為模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //配置T1為模式2
- TH1 = 256 - (11059200/12/32)/baud; //計算T1重載值
- TL1 = TH1; //初值等于重載值
- ET1 = 0; //禁止T1中斷
- ES = 1; //使能串口中斷
- TR1 = 1; //啟動T1
- }
- /* 定時器0配置函數 */
- void ConfigTimer0()
- {
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x01; //設置T0為模式1
- TH0 = 0xFC; //為T0賦初值0xFC67,定時1ms
- TL0 = 0x67;
- ET0 = 1; //使能T0中斷
- TR0 = 1; //啟動T0
- }
- /* UART中斷服務函數 */
- void InterruptUART() interrupt 4
- {
- if(RI) //接收到字節
- {
- RI = 0; //清零接收中斷標志位
- }
- if(TI) //字節發送完畢
- {
- TI = 0; //清零發送中斷標志位
- }
- }
- /* UART字符發送函數 */
- void SendData(unsigned char ch)
- {
- SBUF = ch; //啟動發送
- while(!TI); //等待結束
- }
- /* UART字符串發送函數 */
- void SendString(unsigned char *s)
- {
- while(*s) //循環發送
- {
- SendData(*s++);
- }
- }
復制代碼
編譯后報錯如下:
Build target 'Target 1'
compiling main.c...
MAIN.C(57): error C202: 'Mode': undefined identifier
MAIN.C(60): error C202: 'temp': undefined identifier
MAIN.C(138): error C132: 'ADC0809': not in formal parameter list
MAIN.C(138): error C141: syntax error near '{'
MAIN.C(139): error C244: 'temp_': can't initialize, bad type or class
MAIN.C(139): error C132: 'temp_': not in formal parameter list
MAIN.C(141): error C244: 'OE': can't initialize, bad type or class
MAIN.C(141): error C132: 'OE': not in formal parameter list
MAIN.C(143): error C244: 'ST': can't initialize, bad type or class
MAIN.C(143): error C132: 'ST': not in formal parameter list
MAIN.C(145): error C244: 'ST': can't initialize, bad type or class
MAIN.C(145): error C132: 'ST': not in formal parameter list
MAIN.C(146): error C244: 'ST': can't initialize, bad type or class
MAIN.C(146): error C132: 'ST': not in formal parameter list
MAIN.C(148): error C141: syntax error near 'while'
MAIN.C(148): error C141: syntax error near '==', expected ')'
MAIN.C(150): error C231: 'OE': redefinition
MAIN.C(150): error C231: 'OE': redefinition
MAIN.C(151): error C247: non-address/-constant initializer
MAIN.C(152): error C279: 'OE': multiple initialization
MAIN.C(152): error C231: 'OE': redefinition
MAIN.C(152): error C231: 'OE': redefinition
MAIN.C(153): error C141: syntax error near 'return'
MAIN.C(154): error C141: syntax error near '}'
Target not created
|