找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3990|回复: 7
收起左侧

missing';'before'0000' 为什么c语言的程序会出现这样的错误?

[复制链接]
ID:401913 发表于 2018-10-13 21:22 | 显示全部楼层 |阅读模式
1黑币
错误提示:missing';'before'0000'
捕获1.PNG
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. sbit KEY1 = P1^0;                 // 上调报警温度
  4. sbit KEY2 = P1^1;                 // 下调报警温度
  5. sbit LED1 = P1^2;                 // 正常时绿灯亮
  6. sbit LED2 = P1^3;                 // 报警时红灯亮
  7. sbit BUZZ = P1^6;
  8. sbit IO_18B20 = P3^2;  //DS18B20通信引脚
  9. #define LCD1602_DB  P0
  10. sbit LCD1602_RS = P2^0;
  11. sbit LCD1602_RW = P2^1;
  12. sbit LCD1602_E  = P2^2;

  13. bit enBuzz = 0;                            //蜂鸣器使能标志
  14. bit flag1s = 0;              //1s定时标志
  15. unsigned int warnT = 30;     //报警温度值
  16. unsigned char T0RH = 0;     //T0重载值的高字节
  17. unsigned char T0RL = 0;     //T0重载值的低字节

  18. void ConfigTimer0(unsigned int ms);           
  19. unsigned char IntToString(unsigned char *str, int dat);
  20. extern bit Start18B20();
  21. extern bit Get18B20Temp(int *temp);
  22. extern void InitLcd1602();
  23. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  24. extern void LcdWriteCmd(unsigned char cmd);


  25. //DS18B20程序:

  26. /* 软件延时函数,延时时间(t*10)us */
  27. void DelayX10us(unsigned char t)
  28. {
  29.     do {
  30.         _nop_();
  31.         _nop_();
  32.         _nop_();
  33.         _nop_();
  34.         _nop_();
  35.         _nop_();
  36.         _nop_();
  37.         _nop_();
  38.     } while (--t);
  39. }
  40. bit Get18B20Ack()
  41. {
  42.         bit ack;

  43.         EA = 0;
  44.         IO_18B20 = 0;
  45.         DelayX10us(50);
  46.         IO_18B20 = 1;
  47.         DelayX10us(6);
  48.         ack = IO_18B20;
  49.         while(!IO_18B20);
  50.         EA = 1;

  51.         return ack;
  52. }

  53. void  Write18B20(unsigned char dat)
  54. {
  55.         unsigned char mask;
  56.         EA = 0;
  57.         for(mask=0x01; mask!= 0; mask<<=1)
  58.         {
  59.                 IO_18B20 = 0;
  60.                 _nop_();
  61.                 _nop_();
  62.                 if((mask&dat) == 0)
  63.                         IO_18B20 = 0;
  64.                 else
  65.                         IO_18B20 = 1;
  66.                 DelayX10us(6);
  67.                 IO_18B20 = 1;
  68.         }
  69.         EA = 1;
  70. }

  71. unsigned char Read18B20()
  72. {
  73.         unsigned char dat;
  74.         unsigned char mask;

  75.         EA = 0;
  76.         for(mask=0x01; mask!=0; mask<<=1)
  77.         {
  78.                 IO_18B20 = 0;
  79.                 _nop_();
  80.                 _nop_();
  81.                 IO_18B20 = 1;
  82.                 _nop_();
  83.                 _nop_();
  84.                 if(!IO_18B20)
  85.                         dat &= ~mask;
  86.                 else
  87.                         dat |= mask;
  88.                 DelayX10us(6);
  89.         }
  90.         EA = 1;

  91.         return dat;
  92. }

  93. bit Start18B20()
  94. {
  95.         bit ack;

  96.         ack = Get18B20Ack();
  97.         if(ack == 0)
  98.         {
  99.                 Write18B20(0xCC);
  100.                 Write18B20(0x44);
  101.         }
  102.         return ~ack;
  103. }

  104. bit Get18B20Temp(int *temp)
  105. {
  106.         bit ack;
  107.         unsigned char LSB, MSB;

  108.         ack = Get18B20Ack();
  109.         if(ack == 0)
  110.         {
  111.                 Write18B20(0xCC);
  112.                 Write18B20(0xBE);
  113.                 LSB = Read18B20();
  114.                 MSB = Read18B20();
  115.                 *temp = ((int)MSB<<8) + LSB;
  116.         }
  117.         return ~ack;
  118. }



  119. //LCD1602程序:




  120. /* 等待液晶准备好 */
  121. void LcdWaitReady()
  122. {
  123.     unsigned char sta;

  124.     LCD1602_DB = 0xFF;
  125.     LCD1602_RS = 0;
  126.     LCD1602_RW = 1;
  127.     do {
  128.         LCD1602_E = 1;
  129.         sta = LCD1602_DB; //读取状态字
  130.         LCD1602_E = 0;
  131.     } while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
  132. }
  133. /* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
  134. void LcdWriteCmd(unsigned char cmd)
  135. {
  136.     LcdWaitReady();
  137.     LCD1602_RS = 0;
  138.     LCD1602_RW = 0;
  139.     LCD1602_DB = cmd;
  140.     LCD1602_E = 1;
  141.     LCD1602_E = 0;
  142. }
  143. /* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
  144. void LcdWriteDat(unsigned char dat)
  145. {
  146.     LcdWaitReady();
  147.     LCD1602_RS = 1;
  148.     LCD1602_RW = 0;
  149.     LCD1602_DB = dat;
  150.     LCD1602_E = 1;
  151.     LCD1602_E = 0;
  152. }
  153. /* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
  154. void LcdSetCursor(unsigned char x, unsigned char y)
  155. {
  156.     unsigned char addr;

  157.     if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址
  158.         addr = 0x00 + x;  //第一行字符地址从0x00起始
  159.     else
  160.         addr = 0x40 + x;  //第二行字符地址从0x40起始
  161.     LcdWriteCmd(addr | 0x80);  //设置RAM地址
  162. }
  163. /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
  164. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
  165. {
  166.     LcdSetCursor(x, y);   //设置起始地址
  167.     while (*str != '\0')  //连续写入字符串数据,直到检测到结束符
  168.     {
  169.         LcdWriteDat(*str++);
  170.     }
  171. }
  172. /* 初始化1602液晶 */
  173. void InitLcd1602()
  174. {
  175.     LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口
  176.     LcdWriteCmd(0x0C);  //显示器开,光标关闭
  177.     LcdWriteCmd(0x06);  //文字不动,地址自动+1
  178.     LcdWriteCmd(0x01);  //清屏
  179. }






  180. void main()
  181. {
  182.     bit res;
  183.         bit backup = 1;
  184.     int temp;          //读取到的当前温度值
  185.     int intT, decT;      //温度值的整数和小数部分
  186.     unsigned char len,len1;
  187.     unsigned char str[12],str1[12];

  188.     EA= 1;            //开总中断
  189.         P1= 0XF3;
  190.     ConfigTimer0(1);    //T0定时1ms
  191.     Start18B20();       //启动DS18B20
  192.     InitLcd1602();      //初始化液晶

  193.     while (1)
  194.     {
  195.             
  196.                 if (flag1s)   //每秒更新一次温度
  197.                 {
  198.                     flag1s = 0;
  199.                     res = Get18B20Temp(&temp);  //读取当前温度
  200.                     if (res)                    //读取成功时,刷新当前温度显示
  201.                     {
  202.                         intT = temp >> 4;              //分离出温度值整数部分
  203.                         decT = temp & 0xF;            //分离出温度值小数部分
  204.                         len = IntToString(str, intT);      //整数部分转换为字符串
  205.                                     len1 = IntToString(str1, warnT);  //报警温度转换为字符串
  206.                         str[len++] = '.';                //添加小数点
  207.                         decT = (decT*10) / 16;     //二进制的小数部分转换为1
  208. //位十进制位
  209.                         str[len++] = decT + '0';     //十进制小数位再转换为
  210. //ASCII字符
  211.                                         str[len++] = 0xdf;         //添加字符串"℃"
  212.                                         str[len++] = 'C';
  213.                                         str[len++] = ' ';
  214.                                         str[len] = '\0';             //添加字符串结束符
  215.                                         str1[len1++] = 0xdf;       //添加字符串"℃"
  216.                                         str1[len1++] = 'C';
  217.                                         str1[len1] = '\0';           //添加字符串结束符
  218.                                         if (intT < warnT)                    //超过报警温度时执行报警
  219.                                         {                                            
  220.                                              enBuzz = 0;                                        //关闭蜂鸣器
  221.                                                  LcdWriteCmd(0x01);             //清屏
  222.                                                  LcdShowStr(2, 0, "Temperature");        //显示第一行         
  223.                                                  LcdShowStr(2, 1, str);         //显示实时温度
  224.                                                  LcdShowStr(9, 1, "<");      
  225.                                                  LcdShowStr(11, 1, str1);       //显示报警温度                                                                                 
  226.                                         }
  227.                                         else
  228.                                         {                                
  229.                                                  enBuzz = 1;                                    //启动蜂鸣器发声  
  230.                                                  LcdWriteCmd(0x01);             //清屏
  231.                                                  LcdShowStr(4, 0, "Warning!");  //显示警告   
  232.                                                  LcdShowStr(0, 1, "Temp:");     
  233.                                                  LcdShowStr(5, 1, str);         //显示实时温度
  234.                                                  LcdShowStr(11, 1, ">");
  235.                                                  LcdShowStr(12, 1, str1);       //显示报警温度
  236.                                         }                                                                                                         
  237.                     }
  238.                     else                        //读取失败时,提示错误信息
  239.                     {
  240.                         LcdShowStr(4, 1, "error!");
  241.                     }
  242.                     Start18B20();               //重新启动下一次转换
  243.                 }
  244.     }
  245. }
  246. /* 按键动作函数 */
  247. void KeyAction ()
  248. {
  249.      if (KEY1 == 0)
  250.          {
  251.              KEY1 = 1;         
  252.                  warnT++;
  253.          }
  254.          else if (KEY2 == 0)
  255.          {
  256.              KEY2 = 1;
  257.                  warnT--;
  258.          }
  259. }
  260. /* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
  261. unsigned char IntToString(unsigned char *str, int dat)
  262. {
  263.     signed char i = 0;
  264.     unsigned char len = 0;
  265.     unsigned char buf[6];

  266.     if (dat < 0)  //如果为负数,首先取绝对值,并在指针上添加负号
  267.     {
  268.         dat = -dat;
  269.         *str++ = '-';
  270.         len++;
  271.     }
  272.     do {          //先转换为低位在前的十进制数组
  273.         buf[i++] = dat % 10;
  274.         dat /= 10;
  275.     } while (dat > 0);
  276.     len += i;         //i最后的值就是有效字符的个数
  277.     while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
  278.     {
  279.         *str++ = buf[i] + '0';
  280.     }
  281.     *str = '\0';  //添加字符串结束符
  282.     return len;   //返回字符串长度
  283. }
  284. /* 配置并启动T0,ms-T0定时时间 */
  285. void ConfigTimer0(unsigned int ms)
  286. {
  287.     unsigned long tmp;  //临时变量

  288.     tmp = 11059200 / 12;      //定时器计数频率
  289.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  290.     tmp = 65536 - tmp;        //计算定时器重载值
  291.     tmp = tmp + 28;           //补偿中断响应延时造成的误差
  292.     T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
  293.     T0RL = (unsigned char)tmp;
  294.     TMOD &= 0xF0;   //清零T0的控制位
  295.     TMOD |= 0x01;   //配置T0为模式1
  296.     TH0 = T0RH;     //加载T0重载值
  297.     TL0 = T0RL;
  298.     ET0 = 1;        //使能T0中断
  299.     TR0 = 1;        //启动T0
  300. }
  301. /* T0中断服务函数,完成250ms, 1s定时 */
  302. void InterruptTimer0() interrupt 1
  303. {
  304.     static unsigned int tmr1s = 0;
  305.         static unsigned int tmrms = 0;

  306.     TH0 = T0RH;         //重新加载重载值
  307.     TL0 = T0RL;
  308.         if (enBuzz)                //蜂鸣器发声处理
  309.         {
  310.             BUZZ = ~BUZZ;   //启动蜂鸣器发声        
  311.                 LED1 = 0;
  312.                 LED2 = 1;
  313.         }
  314.         else
  315.         {
  316.             BUZZ = 1;                //关闭蜂鸣器
  317.                 LED1 = 1;
  318.                 LED2 = 0;
  319.         }
  320.     tmr1s++;
  321.         tmrms++;
  322.         if (tmrms >= 250)        //延时250ms
  323.         {
  324.             tmrms = 0;
  325.         KeyAction ();
  326.         }
  327.     if (tmr1s >= 1000)  //定时1s
  328.     {
  329.         tmr1s = 0;
  330.         flag1s = 1;        
  331.     }
  332. }
复制代码

回复

使用道具 举报

ID:409338 发表于 2018-10-14 10:39 | 显示全部楼层
报错,错误在reg52.h里面。你得把这个头文件贴出来看看。
回复

使用道具 举报

ID:388197 发表于 2018-10-14 11:01 | 显示全部楼层
我将代码复制下来,再我电脑上(keil4 c51)编译能通过,楼主检查下是否修改过头文件

评分

参与人数 1黑币 +20 收起 理由
admin + 20 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:401913 发表于 2018-10-14 16:38 | 显示全部楼层
越雨 发表于 2018-10-14 10:39
报错,错误在reg52.h里面。你得把这个头文件贴出来看看。

头文件怎么看?就只有这整个代码
回复

使用道具 举报

ID:401913 发表于 2018-10-14 16:39 | 显示全部楼层
cjm82 发表于 2018-10-14 11:01
我将代码复制下来,再我电脑上(keil4 c51)编译能通过,楼主检查下是否修改过头文件

代码我是从网上找的,一运行就出现这个问题,都没改过头文件
回复

使用道具 举报

ID:137736 发表于 2018-10-14 17:44 | 显示全部楼层
包含的头文件可能没找到或者损坏。自己查找到打开看看,或下个头文件覆盖掉。
回复

使用道具 举报

ID:155507 发表于 2018-10-14 18:11 | 显示全部楼层
是keil的问题!
所以把keil卸载了,在安装keil才能运行的
回复

使用道具 举报

ID:213173 发表于 2018-10-14 19:09 | 显示全部楼层
631607010604 发表于 2018-10-14 16:39
代码我是从网上找的,一运行就出现这个问题,都没改过头文件

把这个头文件REG52.H放在工程文件里,引用时不用尖括号用双引号就可以了。
#include "REG52.H" reg51.zip (876 Bytes, 下载次数: 5)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表