找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1398|回复: 9
打印 上一主题 下一主题
收起左侧

我这段单片机程序写的有问题吗?为什么编译不通过

[复制链接]
跳转到指定楼层
楼主
if(heavy1<100)                 {LED0=0;LED1=0;LED2=0;LED3=0;}
        if((heavy1>=100)&&(heavy1<200)){LED0=1;LED1=0;LED2=0;LED3=0;}
                if((heavy1>=200)&&(heavy1<300)){LED0=0;LED1=1;LED2=0;LED3=0;}
                if((heavy1>=300)&&(heavy1<400)){LED0=0;LED1=0;LED2=1;LED3=0;}
                if((heavy1>=400)&&(heavy1<500)){LED0=0;LED1=0;LED2=0;LED3=1;}
                if(heavy1>=500)                {LED0=1;LED1=1;LED2=1;LED3=1;}        
这是我写的,看起来没什么问题啊,为什么编译通过?完整程序如下:

  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <intrins.h>
  5. #define KeyPort P1
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define DataPort P0

  9. sbit ADDO = P3^2;
  10. sbit ADSK = P3^3;
  11. unsigned int num;
  12. unsigned int dnf;
  13. float i;
  14. unsigned int priceV;
  15. sbit LED0 = P3^4;
  16. sbit LED1 = P3^5;
  17. sbit LED2 = P3^6;
  18. sbit LED3 = P3^7;

  19. /*-----------------------------------------------
  20.   LCD12864引脚接口
  21. ------------------------------------------------*/
  22. sbit RS = P2^4;
  23. sbit RW = P2^5;
  24. sbit E  = P2^6;
  25. sbit RES = P2^3;
  26. sbit PSB = P2^1;
  27. sbit PAUSE = P3^0;
  28. unsigned char temp[16];
  29. unsigned char lol[16];
  30. void DelayUs2x(unsigned char t)
  31. {   
  32. while(--t);
  33. }
  34. void DelayMs(unsigned char t)
  35. {

  36. while(t--)
  37. {
  38.      //大致延时1mS
  39.      DelayUs2x(245);
  40.          DelayUs2x(245);
  41. }
  42. }
  43. /*------------------------------------------------
  44.                     检测忙位
  45. ------------------------------------------------*/
  46. void Check_Busy()
  47. {  
  48.     RS=0;
  49.     RW=1;
  50.     E=1;
  51.     DataPort=0xff;
  52.     while((DataPort&0x80)==0x80);//忙则等待
  53.     E=0;
  54. }
  55. /*------------------------------------------------
  56.                    写命令
  57. ------------------------------------------------*/
  58. void Write_Cmd(unsigned char Cmd)
  59. {
  60.         Check_Busy();
  61.         RS=0;
  62.         RW=0;
  63.         E=1;
  64.         DataPort=Cmd;
  65.         DelayUs2x(5);
  66.         E=0;
  67.         DelayUs2x(5);
  68. }
  69. /*------------------------------------------------
  70.                     写数据
  71. ------------------------------------------------*/
  72. void Write_Data(unsigned char Data)
  73. {
  74.         Check_Busy();
  75.         RS=1;
  76.         RW=0;
  77.         E=1;
  78.         DataPort=Data;
  79.         DelayUs2x(5);
  80.         E=0;
  81.         DelayUs2x(5);
  82. }
  83. /*------------------------------------------------
  84.                    液晶屏初始化
  85. ------------------------------------------------*/
  86. void Init_ST7920()
  87. {  
  88.    DelayMs(40);           //大于40MS的延时程序
  89.    PSB=1;                 //设置为8BIT并口工作模式
  90.    DelayMs(1);            //延时
  91.    RES=0;                 //复位
  92.    DelayMs(1);            //延时
  93.    RES=1;                 //复位置高
  94.    DelayMs(10);
  95.    Write_Cmd(0x30);       //选择基本指令集
  96.    DelayUs2x(50);         //延时大于100us
  97.    Write_Cmd(0x30);       //选择8bit数据流
  98.    DelayUs2x(20);         //延时大于37us
  99.    Write_Cmd(0x0c);       //开显示(无游标、不反白)
  100.    DelayUs2x(50);         //延时大于100us
  101.    Write_Cmd(0x01);       //清除显示,并且设定地址指针为00H
  102.    DelayMs(15);           //延时大于10ms
  103.    Write_Cmd(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
  104.    DelayUs2x(50);         //延时大于100us
  105. }


  106. /*------------------------------------------------
  107.                    显示字符串
  108. x:横坐标值,范围0~8
  109. y:纵坐标值,范围1~4
  110. ------------------------------------------------*/
  111. void LCD_PutString(unsigned char x,unsigned char y,unsigned char *s)
  112. {
  113. switch(y)
  114.      {
  115.           case 1: Write_Cmd(0x80+x);break;
  116.           case 2: Write_Cmd(0x90+x);break;
  117.           case 3: Write_Cmd(0x88+x);break;
  118.           case 4: Write_Cmd(0x98+x);break;
  119.       default:break;
  120.          }
  121. while(*s>0)
  122.    {
  123.       Write_Data(*s);
  124.       s++;
  125.       DelayUs2x(50);
  126.    }
  127. }
  128. /*------------------------------------------------
  129.                       清屏
  130. ------------------------------------------------*/
  131. void ClrScreen()
  132. {
  133.    Write_Cmd(0x01);
  134.    DelayMs(15);
  135. }
  136. /*------------------------------------------------
  137.                    延时函数
  138. ------------------------------------------------*/
  139. void delay(uchar z)
  140. {
  141.         uchar x;
  142.         for(;z>0;z--)
  143.                 for(x=22;x>0;x--);
  144. }
  145.                   
  146. unsigned long ReadCount(void)
  147. {
  148. unsigned long Count; unsigned char i;
  149. ADSK=0;        //使能AD(PD_SCK 置低)
  150. Count=0;
  151. while(ADDO);        //AD转换未结束则等待,否则开始读取
  152. for (i=0;i<24;i++)
  153. {
  154. ADSK=1;        //PD_SCK 置 高 ( 发 送 脉 冲 )
  155. Count=Count<<1; //下降沿来时变量Count左移一位,右侧补零
  156. ADSK=0;        //PD_SCK 置低
  157. if(ADDO) Count++;
  158. }
  159. ADSK=1;
  160. Count=Count^0x800000;//第25个脉冲下降沿来时,转换数据
  161. ADSK=0;
  162. return(Count);
  163. }
  164. ///////////////////////////////////////////////////////////////// //////////////////////
  165. /*------------------------------------------------
  166. 按键扫描函数,返回扫描键值
  167. ------------------------------------------------*/
  168. unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
  169. {
  170. unsigned char cord_h,cord_l;//行列值中间变量
  171. KeyPort=0x0f;            //行线输出全为0
  172. cord_h=KeyPort&0x0f;     //读入列线值
  173. if(cord_h!=0x0f)    //先检测有无按键按下
  174. {
  175.   DelayMs(10);        //去抖
  176.   if((KeyPort&0x0f)!=0x0f)
  177.   {
  178.     cord_h=KeyPort&0x0f;  //读入列线值
  179.     KeyPort=cord_h|0xf0;  //输出当前列线值
  180.     cord_l=KeyPort&0xf0;  //读入行线值

  181.     while((KeyPort&0xf0)!=0xf0);//等待松开并输出

  182.     return(cord_h+cord_l);//键盘最后组合码值
  183.    }
  184.   }return(0xff);     //返回该值
  185. }
  186. /*------------------------------------------------
  187.           按键值处理函数,返回扫键值
  188.            可以根据需要改变返回值

  189.                           | 1 | 2 | 3 | + |  
  190.                           | 4 | 5 | 6 | - |  
  191.                           | 7 | 8 | 9 | * |  
  192.                           | 0 | . | = | / |
  193. ------------------------------------------------*/
  194. unsigned char KeyPro(void)
  195. {
  196. switch(KeyScan())
  197. {

  198.         case 0x77:return  1  ;break;//1
  199.         case 0x7b:return  2  ;break;//2
  200.         case 0x7d:return  3  ;break;//3                 
  201.         case 0xb7:return  4  ;break;//4
  202.         case 0xbb:return  5  ;break;//5
  203.     case 0xbd:return  6  ;break;//6
  204.     case 0xd7:return  7  ;break;//7
  205.         case 0xdb:return  8  ;break;//8
  206.     case 0xdd:return  9  ;break;//9         
  207.     case 0xe7:return 10 ;break;//*
  208.     case 0x7e:return 11;break;//A  设置单价                                    
  209.     case 0xbe:return 12 ;break;//B         去皮                             
  210.     case 0xde:return 13 ;break;//C  附加功能                                                   
  211.     case 0xee:return 14 ;break;//D    重置                                   
  212.         case 0xed:return 15 ;break;//#
  213.     case 0xeb:return 16  ;break;//0                                                                     
  214.   default:return 0;break;

  215. }
  216. }


  217. /*------------------------------------------------
  218.               主程序
  219. ------------------------------------------------*/
  220. main()
  221. {

  222. int priceV;
  223. char v=0;
  224. unsigned long   weight   ;
  225. unsigned long   heavy  ;
  226. float                     heavy1 ;
  227. float           poi;
  228. int d1,d2;
  229. int LED0=0;
  230. int LED1=0;
  231. int LED2=0;
  232. int LED3=0;
  233.         ClrScreen();
  234.     Init_ST7920();   //初始化
  235. heavy= ReadCount();        DelayMs(100);
  236. heavy= ReadCount();        DelayMs(100);
  237. heavy= ReadCount();        DelayMs(100);
  238. while (1)
  239. {
  240. for( v=0;v<2;v++)
  241.   {        weight += ReadCount();     }         
  242.   weight =weight/3;
  243. heavy1= weight-heavy  ;
  244. heavy1= (float)heavy1/1900;
  245.         DelayMs(150);        DelayMs(150);
  246. if(heavy1>10000)heavy1=0;
  247. d1 = weight / 1000;        d2 = weight % 1000;
  248. num=KeyPro();      
  249. poi=priceV*heavy1*10;            
  250.                 LCD_PutString(0,1,"重量:");
  251.                 LCD_PutString(0,2,"单价:");
  252.                 LCD_PutString(0,3,"总价:");
  253.                    LCD_PutString(0,4,"共计:");
  254.                 LCD_PutString(7,2,"元");
  255.                 LCD_PutString(7,3,"元");
  256.                 LCD_PutString(7,4,"元");
  257.         switch(num)
  258.         {
  259.         case 1:        priceV*=10; priceV+=1;            break;                // 1
  260.         case 2:        priceV*=10; priceV+=2;                break;                 // 2
  261.         case 3:        priceV*=10; priceV+=3;                break;                 // 3
  262.         case 4:        priceV*=10; priceV+=4;                break;                 // 4
  263.         case 5:        priceV*=10; priceV+=5;                break;                 // 5
  264.         case 6:        priceV*=10; priceV+=6;                break;                 // 6
  265.         case 7:        priceV*=10; priceV+=7;                break;                 // 7
  266.         case 8: priceV*=10; priceV+=8;                break;                 // 8
  267.         case 9: priceV*=10; priceV+=9;                break;                 // 9
  268. //        case 10: priceV='.';                        break;                 // 9
  269.         case 11: heavy= ReadCount();        break;
  270.         case 12: i+=poi;                    break;
  271.     case 13: i=0;                       break;
  272.         case 14: ClrScreen();               break;
  273.         case 15: priceV=0;                        break;                  // 0
  274.         case 16: priceV*=10;                         break;
  275.       
  276.         }
  277.                 sprintf(temp,"%5.2fg " ,heavy1);
  278.                LCD_PutString(3,1, temp);
  279.                 sprintf(lol,"%4d",priceV);
  280.                 LCD_PutString(3,2,lol);
  281.                 sprintf(lol,"%4.1f ",poi/10);                           
  282.                 LCD_PutString(3,3,lol);
  283.                 sprintf(lol,"%4.1f",i/10);
  284.             LCD_PutString(3,4,lol);
  285.         DelayMs(200);               
  286. //                sprintf(temp," %4d%-d          ",d1,d2);
  287. //            LCD_PutString(0,4, temp);
  288.                 DelayMs(200);      
  289. //if(heavy1>503)
  290. //   {
  291. //   ClrScreen();
  292. //   sprintf(lol,"警告警告警告警告");
  293. //            LCD_PutString(0,1, lol);
  294. //                 sprintf(lol,"警告警告警告警告");
  295. //            LCD_PutString(0,2, lol);
  296. //                 sprintf(lol,"警告警告警告警告");
  297. //            LCD_PutString(0,3, lol);
  298. //                 sprintf(lol,"警告警告警告警告");
  299. //            LCD_PutString(0,4, lol);
  300. //                DelayMs(200);                 DelayMs(200);
  301. //                ClrScreen();
  302. //   }
  303. }
  304. }
  305. // switch(heavy1)
  306. // {
  307. //  case 100:led0=1;led1=0;led2=0;led3=0;                                                 break;
  308. //  case 200:led0=0;led1=1;led2=0;led3=0;                                                 break;
  309. //  case 300:led0=0;led1=0;led2=1;led3=0;                                                 break;
  310. //  case 400:led0=0;led1=0;led2=0;led3=1;                                                 break;
  311. //  case 500:led0=1;led1=1;led2=1;led3=1;                                                 break;
  312. // }
  313.         if(heavy1<100)                 {LED0=0;LED1=0;LED2=0;LED3=0;}
  314.         if((heavy1>=100)&&(heavy1<200)){LED0=1;LED1=0;LED2=0;LED3=0;}
  315.                 if((heavy1>=200)&&(heavy1<300)){LED0=0;LED1=1;LED2=0;LED3=0;}
  316.                 if((heavy1>=300)&&(heavy1<400)){LED0=0;LED1=0;LED2=1;LED3=0;}
  317.                 if((heavy1>=400)&&(heavy1<500)){LED0=0;LED1=0;LED2=0;LED3=1;}
  318.                 if(heavy1>=500)                {LED0=1;LED1=1;LED2=1;LED3=1;}      
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:387733 发表于 2018-8-27 09:19 | 只看该作者
函数大括号不匹配吧,最后这段程序是哪个函数里面的呢?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:164602 发表于 2018-8-27 09:37 | 只看该作者
你的程序中这些语句是没有问题的。
问题在于:你注释掉一些语句又新写一些时,将大括号的}没有移动到相应位置。
我移动到最后(两个),编译也不能过,是其它的系统错误了,没有语句错误。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:384109 发表于 2018-8-27 10:24 | 只看该作者
应该把编译时的错误提示贴出来,另外主程序的大括号好像配对不完整

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:308437 发表于 2018-8-27 10:29 | 只看该作者
把你编译结果发来看下,看提示
回复

使用道具 举报

6#
ID:386561 发表于 2018-8-27 10:41 | 只看该作者
嗯,不用想了,这判断就是放的位置有问题,自己没留意到,本身没有任何问题
回复

使用道具 举报

7#
ID:387733 发表于 2018-8-27 12:58 | 只看该作者
      我把最后的大括号移到末尾,提示DATA变量地址空间溢出,把某个数组的变量属性由 DATA 改成 IDATA 就通过了。
      看别人的程序是一件很累的事,特别是不完整的程序。而自己调试,纠错应该是我们这一行必须具备的能力,所以碰到问题应该尽可能的自己解决。
      

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:386561 发表于 2018-8-27 21:12 | 只看该作者
sxhwdz 发表于 2018-8-27 12:58
我把最后的大括号移到末尾,提示DATA变量地址空间溢出,把某个数组的变量属性由 DATA 改成 IDATA 就 ...

懂你的意思,只是自己找不到的时候还是希望求助他人了,
回复

使用道具 举报

9#
ID:390775 发表于 2018-8-31 16:28 | 只看该作者
这两个函数没有在main中  编译时你的语法通过不了
如果你想把这两个函数放到  while(1)中则 你需要 把函数放到倒数第二个  } 中




如果是main中则是  倒数第一个}中


希望对你有帮助

回复

使用道具 举报

10#
ID:392076 发表于 2018-8-31 17:08 | 只看该作者
感觉应该是括号的问题  换一行试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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