首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

51单片机程序优化内容请问

2012-05-27 
51单片机程序优化内容请教各位好:我是个硬件工程师,做了3年多的硬件,现在想学习一些嵌入式方面的内容,所以

51单片机程序优化内容请教
各位好:

我是个硬件工程师,做了3年多的硬件,现在想学习一些嵌入式方面的内容,所以最近想把大学里面51的内容先重新复习一下,以便后期更好的学习ARM的嵌入式内容。经过几天的复习后,最近也写了几个51的程序。

其中有个程序,是闹钟程序,大概150行的样子,显示函数和按键设置函数还没有添加,但是编译出来生成的HEX文件就已经达到将近8K左右。不知能否优化。(之前在坛子上看到人家几千行的代码编译出来也就8K,几万行的代码编译出来也就20K,我对我的程序冗余很怀疑啊)先上程序代码。程序还有几个功能没有完成,我硬件出身,也是刚接触C51不久,可能会有很多错误,请各位大侠轻拍。最好能提供一下优化的办法,本程序使用了rtx51tny的RTOS,开发环境是:keil C51 uV4.


/**************************************************************************************************************
  This is a CLOCK RTOS's programm with rtx51tny.----By Ztudou at 2012/05/24
**************************************************************************************************************/
#include <reg52.h>
#include <rtx51tny.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int
#define INI 0
#define TIME 1
#define DATE 2
#define CLOCK 3
#define DISPLAY 4
#define SETTING 5
#define MUSIC 6


struct time

  uchar hour;
  uchar min;
  uchar sec;
 };/*定义时间数据结构*/


 struct date
 {
  uchar month;
  uchar day;
 };/*定义日期数据结构*/

 struct time now_time={12,0,0},clock={8,0,0};
 struct date now_date={1,1};

 uchar LED_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
 /*共阳极8段数码管编码*/

bit clockon_flag=0; /*闹钟开关标志位*/
sbit speaker=P3^0; /*闹铃喇叭*/

void inital(void)_task_ INI
{
 P2=0xFF;
 P1=0xFF;
 P0=0xFF;
 P3=0xFF;
 os_create_task(TIME);
 os_create_task(DISPLAY);
 os_create_task(SETTING);
 os_delete_task(INI);
}/*程序初始化*/

void timeon(void)_task_ TIME
{
 while(1)
 {
  os_wait(K_TMO,100,0);/*等待1秒*/
  if(++now_time.sec==60)
  {
  now_time.sec=0;
  now_time.min++;
  if(now_time.min==60)
  {
  now_time.min=0;
now_time.hour++;
if(now_time.hour==24)
{
now_time.hour=0;
  os_create_task(DATE);
}
  }
  }
  if((now_time.hour==clock.hour&&now_time.min==clock.min&&now_time.sec==clock.sec)&clockon_flag) /*闹钟时间与闹钟开关判断*/
  {
  os_create_task(CLOCK); /*开启闹中任务*/
  os_create_task(MUSIC); /*开启闹铃任务*/
  }
 }
}/*时间处理任务*/

void dateon(void)_task_ DATE
{
 while(1)
 {
  now_date.day++;
  if((now_date.month==1||now_date.month==3||now_date.month==5||now_date.month==7||
  now_date.month==8||now_date.month==10||now_date.month==12)&&now_date.day==32)
  {
  now_date.day=1;
  now_date.month++;
  if(now_date.month==13)
  {
  now_date.month=1;
  }
  }
  else if((now_date.month==4||now_date.month==6||now_date.month==9||now_date.month==11)&&now_date.day==31)
  {
  now_date.day=1;
  now_date.month++;
  }
  else if(now_date.month==2&&now_date.day==29)
  {
  now_date.day=1;
  now_date.month++;
  }
  else
  {
  printf(" date is ERROR\n");
  }
  os_delete_task(DATE);
 }
}/*日期处理任务*/

void CLOCKOFF(void)_task_ CLOCK
{
 while(1)
 {
  os_wait(K_SIG|K_TMO,6000,0); /*闹铃1分钟或者有外部中断输入关闭闹铃*/
  os_delete_task(MUSIC);
  os_delete_task(CLOCK);
 }
}/*闹钟处理任务*/

void MUSICON(void)_task_ MUSIC
{
 while(1)
 {
  speaker=!speaker;


  os_wait(K_TMO,50,0);
 }
}/*闹铃处理任务*/

void displayon(void)_task_ DISPLAY
{
 while(1)
 {
 }
}/*数码管显示任务*/

void set(void)_task_ SETTING
{
 while(1)
 {
 }
}/*闹钟设置任务*/
 

[解决办法]
printf(" date is ERROR\n");
屏蔽掉工程中所有的这个函数,你编译一下,在看看大小
[解决办法]
printf是库函数,这个函数功能很强大,单片机里面几乎不用这个函数的。

自己写一个串口发送的代码吧

热点排行