这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 我这个单片机程序编译后提示错误很多,如何解决呢?

共5条 1/1 1 跳转至

我这个单片机程序编译后提示错误很多,如何解决呢?

工程师
2020-08-16 20:01:09     打赏

程序里面错的地方是我从别的程序移植过来的,想请大家帮我分析一下错在哪里,怎样解决呢?谢谢!

单片机源程序如下:

  1. #include<reg52.h>


  2. //宏定义

  3. #define uint unsigned int

  4. #define uchar unsigned char

  5. #define Data_ADC0809 P0                   //定义P0口为Data_ADC0809

  6. //sbit PARSER = P2^0;                              //串并行控制位

  7. //sbit BYTE = P2^1;                                //高低字节控制位

  8. //sbit RC = P2^4;                                  //读取转换控制位

  9. //sbit BUSY = P2^2;                                                                 //忙状态位


  10. //函数声明

  11. extern uchar ADC0809();


  12. sbit ST=P2^0;

  13. sbit EOC=P2^1;

  14. sbit OE=P2^2;


  15. sbit ADDR_A = P3^5;                              //低位地址控制位

  16. sbit ADDR_B = P3^6;                              //低位地址控制位

  17. sbit ADDR_C = P3^7;                                                                 //高位地址控制位


  18. void ConfigUART(unsigned int baud);              //串行口配置函数

  19. void ConfigTimer0();                             //定时器0配置函数

  20. void SendData(unsigned char ch);                 //字符发送函数

  21. void SendString(char *s);                        //字符串发送函数

  22. void GetVoltage();                               //ADC电压获取函数

  23. unsigned int Linear(double v);                   //线性插值函数,参数v为实测电压

  24. void DataProcess();                              //数据处理函数

  25. void LedBufRefresh();                            //数码管显示缓冲区刷新函数

  26. void UartSend();                                                                 //串口数据发送函数

  27. void delay(uint t);


  28. unsigned char voltage[] = {'0','.','0','0','0',0};

  29. unsigned char time_used[] = {'0','0','0',0};

  30. unsigned char percentage[] = {'0','0','0',0};

  31. unsigned long j,time_used_value,result,percentage_value,voltage_value;

  32. 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};

  33. 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};


  34. //共阳数码管显示字符转换表

  35. unsigned char code LedChar[] = {

  36.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

  37.     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

  38. };

  39. //数码管显示缓冲区,初值0x00确保启动时都不亮

  40. unsigned char LedBuff[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};


  41. void main()

  42. {

  43.         ConfigUART(9600);                            //配置串行口工作模式及参数

  44.         ConfigTimer0();                              //配置定时器0用于数码管刷新

  45.         EA = 1;                                      //打开总中断

  46.         while(1)

  47.         {

  48.                    //正常模式

  49.                 if(Mode==0)

  50.                 {

  51.                         //读取AD值

  52.                         temp=ADC0809();


  53. }

  54.                 GetVoltage();                            //获取ADC电压值

  55.                 DataProcess();                           //数据处理

  56.                 LedBufRefresh();                         //显示缓冲区刷新

  57.                 UartSend();                              //串口发送

  58.                 for(j=0;j<30000;j++);                    //延时读取

  59.         }

  60. }

  61. /* 数据处理函数 */

  62. void DataProcess()

  63. {

  64.         /* 计算电压值 */

  65.         voltage_value = (unsigned long)(((double)result * 10 / 32767) * 1000 + 0.5);

  66.         /* 电压值数组 */

  67.         voltage[4] = '0' + voltage_value % 10;

  68.         voltage[3] = '0' + (voltage_value /10) % 10;

  69.         voltage[2] = '0' + (voltage_value /100) % 10;

  70.         voltage[0] = '0' + (voltage_value /1000) % 10;        

  71.         /* 剩余用时数组 */

  72.         time_used_value =  Linear((double)result * 10 / 32767);

  73.         time_used[2] = '0' + time_used_value % 10;

  74.         time_used[1] = '0' + (time_used_value / 10) % 10;

  75.         time_used[0] = '0' + (time_used_value / 100) % 10;

  76.         /* 百分比数组 */

  77.         percentage_value =

  78.         (unsigned long)((double)(180000 - time_used_value * 500) / 168000 * 100 + 0.5);//改过数据

  79.         percentage[2] = '0' + percentage_value % 10;

  80.         percentage[1] = '0' + (percentage_value / 10) % 10;

  81.         percentage[0] = '0' + (percentage_value / 100) % 10;

  82.         if((percentage_value / 100) % 10)            //处理百分比最高位

  83.         {

  84.                 percentage[0] = '0' + (percentage_value / 100) % 10;

  85.         }

  86.         else

  87.         {

  88.                 percentage[0] = ' ';

  89.         }

  90. }

  91. /* 线性插值函数,参数v为实测电压,返回插值时间结果 */

  92. unsigned int Linear(double v)

  93. {

  94.         unsigned int i,t1,t2,t;

  95.         double v1,v2;

  96.         if(v >= 4.35)                                //大于最大电压

  97.         {

  98.                 t = 0;

  99.                 return t;

  100.         }

  101.         if(v <= 2)                                   //小于最小电压

  102.         {

  103.                 t = 360;

  104.                 return t;

  105.         }

  106.         for(i=0; i<21; i++)                          //遍历插值范围

  107.         {

  108.                 if(voltage_sample[i] < v)

  109.                 {

  110.                         v1 = voltage_sample[i-1];

  111.                         v2 = voltage_sample[i];

  112.                         t1 = time_sample[i-1];

  113.                         t2 = time_sample[i];

  114.                         t = t2 - (v - v2) * (double)(t2 - t1) / (v1 - v2);

  115.                         break;                               //计算插值结果t

  116.                 }

  117.                 else if(voltage_sample[i] == v)

  118.                 {

  119.                         t = time_sample[i];                  //恰好取采样值

  120.                         break;

  121.                 }

  122.         }

  123.         return t;

  124. }

  125. /* ADC电压获取函数 */

  126. void GetVoltage()


  127. uchar ADC0809()

  128. {

  129.         uchar temp_=0x00;

  130.         //初始化高阻太

  131.         OE=0;

  132.         //转化初始化

  133.         ST=0;

  134.         //开始转换

  135.         ST=1;

  136.         ST=0;

  137.         //外部中断等待AD转换结束

  138.         while(EOC==0)

  139.         //读取转换的AD值

  140.         OE=1;

  141.         temp_=Data_ADC0809;

  142.         OE=0;

  143.         return temp_;

  144. }




  145. /* 定时器0中断服务函数 */

  146. void InterruptTimer0() interrupt 1

  147. {

  148.         static unsigned char i = 0;                  //动态扫描的索引

  149.     TH0 = 0xFC;                                  //重新加载初值

  150.     TL0 = 0x67;

  151.                                                  //以下代码完成数码管动态扫描刷新

  152.     P1 = 0x00;                                                                    //显示消隐

  153.     switch(i)                                    //动态扫描

  154.     {

  155.         case 0: ADDR_C = 0; ADDR_B = 0; ADDR_A = 0; i++; P1=LedBuff[0]; break;

  156.         case 1: ADDR_C = 0; ADDR_B = 0; ADDR_A = 1; i++; P1=LedBuff[1]; break;

  157.         case 2: ADDR_C = 0; ADDR_B = 1; ADDR_A = 0; i++; P1=LedBuff[2]; break;

  158.         case 3: ADDR_C = 0; ADDR_B = 1; ADDR_A = 1; i++; P1=LedBuff[3]; break;

  159.                 case 4: ADDR_C = 1; ADDR_B = 0; ADDR_A = 0; i++; P1=LedBuff[4]; break;

  160.         case 5: ADDR_C = 1; ADDR_B = 0; ADDR_A = 1; i++; P1=LedBuff[5]; break;

  161.         case 6: ADDR_C = 1; ADDR_B = 1; ADDR_A = 0; i=0; P1=LedBuff[6]; break;

  162.         //case 7: ADDR_C = 1; ADDR_B = 1; ADDR_A = 1; i=0; P1=LedBuff[7]; break;

  163.                 //保留最低为数码管不使用

  164.         default: break;

  165.     }

  166. }

  167. /* 数码管显示缓冲区刷新函数 */

  168. void LedBufRefresh()

  169. {

  170.         LedBuff[6] = ~LedChar[percentage_value % 10];

  171.         LedBuff[5] = ~LedChar[(percentage_value / 10) % 10];

  172.         if((percentage_value / 100) % 10)                           //百分比最高位处理

  173.         {

  174.                 LedBuff[4] = ~LedChar[(percentage_value / 100) % 10];   //为1则显示

  175.         }

  176.         else

  177.         {

  178.                 LedBuff[4] = 0;                                         //否则不显示

  179.         }

  180.         LedBuff[3] = ~LedChar[voltage_value % 10];

  181.         LedBuff[2] = ~LedChar[(voltage_value /10) % 10];

  182.         LedBuff[1] = ~LedChar[(voltage_value /100) % 10];           

  183.         LedBuff[0] = ~(LedChar[(voltage_value /1000) % 10] & 0x7F); //最高位小数点处理

  184. }

  185. void UartSend()

  186. {

  187.         SendString("当前电压:");

  188.         SendString(voltage);

  189.         SendString("V");

  190. //        SendString("    已用时间:");

  191. //        SendString(time_used);

  192. //        SendString("Min");

  193.         SendString("    剩余电量:");

  194.         SendString(percentage);

  195.         SendString("%\r\n");

  196. }

  197. /* 串口配置函数,baud-通信波特率 */

  198. void ConfigUART(unsigned int baud)

  199. {

  200.     SCON  = 0x50;                                //配置串口为模式1

  201.     TMOD &= 0x0F;                                //清零T1的控制位

  202.     TMOD |= 0x20;                                //配置T1为模式2

  203.     TH1 = 256 - (11059200/12/32)/baud;           //计算T1重载值

  204.     TL1 = TH1;                                   //初值等于重载值

  205.     ET1 = 0;                                     //禁止T1中断

  206.     ES  = 1;                                     //使能串口中断

  207.     TR1 = 1;                                     //启动T1

  208. }

  209. /* 定时器0配置函数 */

  210. void ConfigTimer0()

  211. {

  212.     TMOD &= 0xF0;                                //清零T0的控制位

  213.         TMOD |= 0x01;                                //设置T0为模式1

  214.     TH0  = 0xFC;                                 //为T0赋初值0xFC67,定时1ms

  215.     TL0  = 0x67;

  216.         ET0  = 1;                                    //使能T0中断

  217.     TR0  = 1;                                    //启动T0

  218. }

  219. /* UART中断服务函数 */

  220. void InterruptUART() interrupt 4

  221. {

  222.     if(RI)                                       //接收到字节

  223.     {

  224.         RI = 0;                                  //清零接收中断标志位

  225.     }

  226.     if(TI)                                       //字节发送完毕

  227.     {

  228.         TI = 0;                                  //清零发送中断标志位

  229.     }

  230. }

  231. /* UART字符发送函数 */

  232. void SendData(unsigned char ch)

  233. {

  234.     SBUF = ch;                                   //启动发送

  235.         while(!TI);                                  //等待结束

  236. }

  237. /* UART字符串发送函数 */

  238. void SendString(unsigned char *s)

  239. {

  240.     while(*s)                                    //循环发送

  241.     {

  242.         SendData(*s++);

  243.     }

  244. }


复制代码




编译后报错如下:
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





关键词: 单片机     编译     keil     C51    

工程师
2020-08-16 20:14:06     打赏
2楼

直接根据错误提示改就好了。

你的error都是“未定义”,“重复定义”,“类型出错”这种。很容易排查的!


工程师
2020-08-16 20:19:37     打赏
3楼
没有声明变量。要定义变量。134行少了分号等等,总之双击错误去定位,然后去改,很容易的,这是基本的错误。



工程师
2020-08-16 20:23:56     打赏
4楼

建议检查错误的常用单词还是要记一下的 对修改错误很有帮助!


工程师
2020-08-17 18:12:37     打赏
5楼

这个你要在编译结果里面看呀


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]