找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7490|回复: 11
收起左侧

51单片机4K ROM不够用怎么优化程序?请教大神们

  [复制链接]
ID:36900 发表于 2018-9-18 22:27 | 显示全部楼层 |阅读模式
在技能大赛题目中,要求完成各项任务,而要用51系列的单片机,可自己写了一个12864就用了2056B,请问整个任务完成下来的程序肯定超过4KROM,这能行吗?

单片机程序源码:
  1. #include<reg52.h>
  2. #include<text1.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. void delay(uint x)
  6. {
  7.         unsigned char i;
  8.         while(x--)
  9.         {
  10.                 for(i=123;i>0;i--);
  11.         }
  12. }
  13. void initial()
  14. {
  15.         P3=0xff;
  16.         P1=0xff;  //手爪上升
  17.         delay(300);
  18.         if(INT9==0)   //如果手爪有东西,那向左运动,放松手爪后回1工位
  19.         {
  20.                 OUT1=0;
  21.                 while(INT3!=0){;;}
  22.                 OUT1=1;
  23.                 OUT4=0;
  24.                 delay(200);
  25.                 OUT4=1;
  26.         }
  27.         if(INT6==0)
  28.         {
  29.                 OUT4=0;
  30.                 delay(300);
  31.                 OUT4=1;
  32.         }
  33.         if(INT_1!=0)
  34.         {
  35.                 OUT2=0;  //当电机不在1工位的时候,电机向右运动
  36.                 while(INT1!=0){;;}
  37.                 OUT2=1;  //当电机到达1工位的时候,电机停下
  38.         }
  39. }
  40. void dongzhuo1(void)
  41. {
  42.         uint j=0;
  43.         OUT4=0;  //手爪放松
  44.         delay(300);
  45.         OUT4=1;  //手爪放松电磁阀关闭
  46.         OUT5=0;  //手爪下降
  47.         while(INT5==1){;;}  //手爪到位检测
  48.         OUT3=0;  //手爪夹紧
  49.         delay(200);
  50.         OUT3=1;
  51.         while(1)
  52.         {
  53.                 delay(100);
  54.                 if(INT6==0)
  55.                         {break;}
  56.                 else
  57.                         {
  58.                                 OUT4=0;
  59.                                 delay(300);
  60.                                 OUT4=1;
  61.                                 break;
  62.                         }
  63.         }
  64.         OUT5=1;   //手爪上升
  65.         delay(500);
  66.         while(INT4==1){;;}  //手爪复位检测
  67. }
  68. void dongzhuo2(void)
  69. {
  70.         OUT1=0;
  71.         while(INT3!=0){;;}
  72.         OUT1=1;
  73.         delay(1000);
  74.         if(INT3==0)   //再次判断有没有真的到达3工位
  75.         {
  76.                 OUT4=0;
  77.                 delay(200);
  78.                 OUT4=1;
  79.                 }
  80.                 else
  81.                 {
  82.                         OUT1=0;
  83.                         while(INT3!=0){;;}
  84.                         OUT1=1;
  85.                         delay(300);
  86.                         OUT4=0;
  87.                         delay(1000);
  88.                         OUT4=1;
  89.                 }
  90. }
  91. void main()
  92. {
  93.         delay(300);
  94.         initial();
  95.         while(1)
  96.         {
  97.                 if(INT7==0)          //如果1工位有球
  98.                 {
  99.                         if(INT_1!=0)          //如果电机不在1工位,电机向右
  100.                         {
  101.                                 OUT2=0;
  102.                                 while(INT_1!=0){;;}
  103.                                 OUT2=1;           //当电机到达1工位时,电机停下
  104.                         }
  105.                         if(INT7==0)           //再次判断1工位有没有球,有球,手爪下降抓球
  106.                         {
  107.                                 dongzhuo1();
  108.                                         if(INT9==0)
  109.                                         {
  110.                                                 dongzhuo2();
  111.                                         }
  112.                                         else
  113.                                         {
  114.                                                 OUT4=0;
  115.                                                 delay(500);
  116.                                                 OUT4=1;
  117.                                         }
  118.                         }
  119.                 }
  120.                 if((INT8==1)&&(INT7==1))   //1,2工位都没球
  121.                 {
  122.                         initial();
  123.                 }
  124.         }
  125. }
复制代码


回复

使用道具 举报

ID:290170 发表于 2018-9-19 08:40 | 显示全部楼层
只能用4K的单片机还是什么 51单片机也包括很多 STC89也有8K的 stc12的用法和STC89完全一样 只是多了一些功能,最大去到64K,而已不够内存的时候可以外接储存芯片,这样下来256K都不是问题了

评分

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

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2018-9-19 10:00 | 显示全部楼层
就这几句代码能占4K?你根据什么计算的?hex文件的大小不直接代表所占存储器空间。

评分

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

查看全部评分

回复

使用道具 举报

ID:388197 发表于 2018-9-19 10:34 | 显示全部楼层
51系列的不单只有89C51啊,跟车一样,一个系列分高配低配,单片机也一样,同一个系列有不同配置的,高配置的中断多,定时器多,串口多,RAM ROM大,高配的还有些使用起来非常方便的增强功能比如片上ADC,捕获模块,增强型PWM等等,当然价格也更高,这些查阅手册可以查到,具体使用哪种应该按照实际需求来选型.

评分

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

查看全部评分

回复

使用道具 举报

ID:387733 发表于 2018-9-19 12:01 | 显示全部楼层
有些类似的功能段尽量合并,做成子程序。在编译的时候选择最少代码的优化。 微信图片_20180919115907.png

评分

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

查看全部评分

回复

使用道具 举报

ID:362076 发表于 2018-9-19 17:05 | 显示全部楼层
解决办法:
1.换同系列更大容量的单片机;
2.优化字库存储方式,使用简化字库,汉字的话使用以下帖子中的方式存储和调用
http://www.51hei.com/bbs/dpj-134226-1.html
3.如果工程允许,使用英文字符代替汉字会极大减少字库的体积
4.外扩存储器或者FLASH或者用带字库的显示屏
5.使用Keil的代码优化功能,并增加程序耦合和复用

评分

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

查看全部评分

回复

使用道具 举报

ID:368746 发表于 2018-9-20 12:14 | 显示全部楼层
将优化等级升高,再编译一下应该会少一些
回复

使用道具 举报

ID:400333 发表于 2018-9-20 14:20 来自手机 | 显示全部楼层
hex文件1k不到。鉴定完毕!
回复

使用道具 举报

ID:36900 发表于 2018-12-31 19:23 | 显示全部楼层
在YL-236仿真程序中,有一个wuliaoDriver.hex文件,这是怎么搞出来的呀?急求解答
回复

使用道具 举报

ID:523982 发表于 2022-12-5 22:52 | 显示全部楼层
huanleng 发表于 2018-12-31 19:23
在YL-236仿真程序中,有一个wuliaoDriver.hex文件,这是怎么搞出来的呀?急求解答

明显是自己写的头文件
回复

使用道具 举报

ID:77589 发表于 2022-12-6 11:17 | 显示全部楼层
实在不行的话,用汇编
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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