jdzjk06 发表于 2011-6-27 16:54:21

51的程序做了快两年了,但程序质量一直不理想,怎么才能提高自己的编程水平啊???希望高手指

如题!!!
修改内容: 增加了一个GPS数据处理程序,供新手参考,望高手指点程序质量好坏!!!

billowtust 发表于 2011-6-27 17:01:44

看别人的程序,比如看看uc os,或者uboot,或者linux

jdzjk06 发表于 2011-6-27 17:34:32

现在写的程序一般都是顺序结构,刚刚了解了状态机,现在还用不好。 想知道一些编程时像状态机这样的方法和技巧;

823032003 发表于 2011-6-27 17:39:36

回复【2楼】jdzjk06
现在写的程序一般都是顺序结构,刚刚了解了状态机,现在还用不好。 想知道一些编程时像状态机这样的方法和技巧;
-----------------------------------------------------------------------

2年 才 了解 状态机,有点晚哦

jdzjk06 发表于 2011-6-27 17:48:13

回复【3楼】823032003 尼美根
-----------------------------------------------------------------------

是啊 一直都属于闭门造车,公司很小,什么都是自学!!所以有点迷茫……

smartmeter 发表于 2011-6-27 17:55:00

编程这个东西,主要是一个编程的思想,别给你讲几句,抵你自已搞半年。

avr-qq 发表于 2011-6-27 17:55:03

多做项目就能快速提高

nome 发表于 2011-6-27 17:58:14

我也两年了 状态机都不懂

cyr_hongfeng 发表于 2011-6-27 18:01:45

盲目也不行,我之前也是急,C语言,操作系统,英语,STM32杂七杂八一起学,弄的大半年过去感觉还是没什么进步

kenny17 发表于 2011-6-27 18:08:10

先看多点别人写的好程序吧,所谓熟读唐诗三百首,不会作诗也会吟

mitchell 发表于 2011-6-27 18:10:05

一方面,深入单片机内部,熟悉微机原理,了解C语言的编译和汇编程序。这样非常有助于写出很高效的代码,以及解决一些c语言容易出现的“““莫名其妙”””的问题。
二方面,系统学习算法。
三方面,读读操作系统源码或者其他高质量的代码,如1楼所说的。

只要上面三方面可以做到,保证编程水平突飞猛涨。

258963519 发表于 2011-6-27 19:21:18

告诉一个方法,懒点,但是不要躲,总是闲麻烦,然后想办法让其简单即是,好的编程方法最终都是最省事的。

airfex 发表于 2011-6-27 20:57:56

回复【10楼】mitchell
一方面,深入单片机内部,熟悉微机原理,了解c语言的编译和汇编程序。这样非常有助于写出很高效的代码,以及解决一些c语言容易出现的“““莫名其妙”””的问题。
二方面,系统学习算法。
三方面,读读操作系统源码或者其他高质量的代码,如1楼所说的。
只要上面三方面可以做到,保证编程水平突飞猛涨。
-----------------------------------------------------------------------

学习一下

xinfa190 发表于 2011-6-27 21:22:13

回复【10楼】mitchell   
一方面,深入单片机内部,熟悉微机原理,了解c语言的编译和汇编程序。这样非常有助于写出很高效的代码,以及解决一些c语言容易出现的“““莫名其妙”””的问题。
二方面,系统学习算法。
三方面,读读操作系统源码或者其他高质量的代码,如1楼所说的。
只要上面三方面可以做到,保证编程水平突飞猛涨。
-----------------------------------------------------------------------

再学习一下

19001579 发表于 2011-6-27 22:14:36

51单片机最好是用状态机,其它的算法结构对于小空间来说不好使

jdzjk06 发表于 2011-6-27 22:31:55

确实啊,别人指点一下胜过自己搞半年,关键是没人指导,呵呵!!也没有太多的项目,目前快一年了就一直围绕一个项目不断的完善完善再完善,但读起自己的程序来感觉还是不那么理想,不精练、不高效! 上面大家提的意见都很好,很感谢大家!!回头整理个自己写的GPS数据分拣的程序,给新手做个参考,顺便也让高手评价评价,看看质量怎么样!!

cyr_hongfeng 发表于 2011-6-27 22:51:13

二方面,系统学习算法。
如果能指点一下看什么书就好了

Cliff 发表于 2011-6-27 23:19:11

回复【15楼】jdzjk06
确实啊,别人指点一下胜过自己搞半年,关键是没人指导,呵呵!!也没有太多的项目,目前快一年了就一直围绕一个项目不断的完善完善再完善,但读起自己的程序来感觉还是不那么理想,不精练、不高效! 上面大家提的意见都很好,很感谢大家!!回头整理个自己写的gps数据分拣的程序,给新手做个参考,顺便也让高手评价评价,看看质量怎么样!!
-----------------------------------------------------------------------

我估计你的问题在于规划不够。应该是过分注重开发效率(速度)而忽视了设计。
就像写作,没有一个好的提纲。写到哪里算哪里,然后试下来,有问题再修修补补,结果程序结构越来越差。

如果你无法改变你的工作环境,我说句可能让你丧气的话:你很难改变。

如果有可能,我建议你可以进入大公司,感受一下研发的过程应该是怎样的。

jdzjk06 发表于 2011-6-28 08:27:44

回复【17楼】Cliff
-----------------------------------------------------------------------

非常支持您的观点!!!可是现在的水平有限,大公司不好进啊!

jdzjk06 发表于 2011-6-28 08:31:18

上一个采集卫星定位信息,并把采集到的原始字符数据转换成压缩BCD格式,由于程序结构不好,是从整个项目程序中复制过来的一小段,可能会有个别全局变量在该段程序中未注明:

/*
采集到的原始定位数据:$GPRMC,170034.00,A,3928.04929,N,11800.89192,E,0.023,,300411,,,A*72end

*/


uchar   *GpsC={GPS.HMS,GPS.State,GPS.N,GPS.E,GPS.Speed,GPS.Course,GPS.YMD};
externstruct GPSDATAC{
uchar *HMS;                          //定位模块中采集到的时间时分秒
uchar *State;                        //定位状态 A V X
uchar *N;                                  //纬度
uchar *E;                                        //经度
uchar *Speed;                          //速度
uchar *Course;                  //航向
uchar *YMD;                //日期年月日
}GpsPointer;
externstruct GPSDATA{
uchar HMS;
uchar State;
uchar N;
uchar E;
uchar Speed;
uchar Course;
uchar YMD;
}GPS;

/*
***********************************************************************
函数名称: 航向处理
函数功能: 将从GPS模块采集到的航向字符串转换成BCD码
入口参数: 要转换的字符串 ,转换结果存放的地址
出口参数: 转换后的BCD字节数
***********************************************************************
*/
ucharGpsCourseProcess(uchar *courseAscii,uchar *courseBCD)
{
uchar i,j;
uintZsBin=0,ZsBcd=0;
ucharXsBin=0,XsBcd=0;
uchar BiytNumber=0;
   for(i=0;i<5;i++){
      if(courseAscii==','){ return 0;        }       ///////courseBCD=0x00;        return 0;
                if(courseAscii=='.'){
                   for(j=0;j<i;j++){
                             ZsBin=ZsBin*10;
                                ZsBin+=(courseAscii-'0');
                     }
                   if(courseAscii!=','&&courseAscii!=','){
                            XsBcd=((courseAscii-'0')<<4)|(courseAscii-'0');
                      }else{
                          XsBcd=0x00;
                          }
                   if(ZsBin>99){
                     BinToBcd(ZsBin,&ZsBcd);
                           courseBCD=0x06;                                   //航向字段字节数
                           courseBCD=0x02;                                   //0x02表示BCD数据格式,数据为正数,小数点后有两位有效数字
                           courseBCD=0x04;                  //航向的寄存器号
                           courseBCD=ZsBcd>>8;
                           courseBCD=ZsBcd&0xff;
                           courseBCD=XsBcd;
                           BiytNumber=6;
                           break;
                           }else{
                           BinToBcd(ZsBin,&ZsBcd);
                           courseBCD=0x05;                                  //航向字段字节数
                           courseBCD=0x02;                                  //0x02表示BCD数据格式,数据为正数,小数点后有两位有效数字
                           courseBCD=0x04;               //航向的寄存器号
                           courseBCD=ZsBcd&0xff;
                           courseBCD=XsBcd;
                           BiytNumber=5;
                           break;
                           }
                  }
       }       
return BiytNumber;
}

/*
***********************************************************************
函数名称: 速度处理
函数功能: 将GPS模块采集到的速度字符串转换为BCD码格式,并且原来的单位是
         海里/小时,转换为千米/小时,
入口参数: 要转换的字符串
出口参数: 无
***********************************************************************
*/
uchar GpsSpeedProcess(uchar *speedAscii,uchar *speedBCD)
{
uchar i,j;
uchar BiytNumber=0;                                                           //转换后的BCD码位数
uint speedZsBin=0,speedZsBcd=0,speedXsBcd=0;
uchar speedXsBin=0;
for(i=0;i<4;i++)
   {
           if(speedAscii==',') {return 0;}          /// speedBCD=0x00;        return 0;
       if(speedAscii=='.'){
                    for(j=0;j<i;j++){
                             speedZsBin=speedZsBin*10;
                           speedZsBin+=(speedAscii-'0');
                      }
                  speedZsBin=speedZsBin*1.852;                              //海里转换为公里整数部分       
                  if(speedAscii!=','&&speedAscii!=','){
                             speedXsBin=(speedAscii-'0')*10+(speedAscii-'0');
                     }else{
                           speedXsBin=0x00;
                       }
                  speedXsBin=speedXsBin*1.852;
                  if(speedXsBin>99){
                         speedZsBin+=1;
                     }          
                  BinToBcd(speedXsBin,&speedXsBcd);
                  if(speedZsBin>99){
                           BinToBcd(speedZsBin,&speedZsBcd);
                           speedBCD=0x06;                           //速度字段的字节数
                           speedBCD=0x02;                           //0x02表示BCD数据格式,数据为正数,小数点后有两位有效数字
                           speedBCD=0x03;               //速度的寄存器号0x03
                           speedBCD=speedZsBcd>>8;
                           speedBCD=speedZsBcd&0xff;
                           speedBCD=speedXsBcd&0xff;
                           BiytNumber=6;
                           break;
                        }else{
                           BinToBcd(speedZsBin,&speedZsBcd);
                           speedBCD=0x05;                          //速度字段的字节数
                           speedBCD=0x02;                          //0x02表示BCD数据格式,数据为正数,小数点后有两位有效数字
                           speedBCD=0x03;                //速度的寄存器号0x03
                           speedBCD=speedZsBcd&0xff;
                           speedBCD=speedXsBcd&0xff;
                           BiytNumber=5;
                           break;
                        }
             }
   }
return BiytNumber;
}

/*
***********************************************************************
函数名称: 日期、时间处理函数
函数功能: 处理采集到的GPS模块的时间和日期,处理后的日期时间以
         年高位、年低位、月、日、时、分、秒顺序排列,格式为压缩
                   BCD格式;
入口参数: 要处理的时间,要处理的日期,时间处理结果存放地址,
         日期处理结果存放地址        ,uchar *ResultBcdHMS,uchar *ResultBcdYMD
出口参数:
************************************************************************
*/
void GpsDataTimeProcess(uchar *timeHMS,uchar *dayYMD,uchar *ResultBcdHMS,uchar *ResultBcdYMD)
{
uchar TimeBinHMS;             //TimeBinHMS---时;TimeBinHMS---分;TimeBinHMS---秒
uintDayBinYMD;                               //DayBinYMD---年; DayBinYMD---月; DayBinYMD--日
uintYear=0;
receive_count_com1=0;
if(timeHMS==','||dayYMD==',')
   {
        //ResultBcdHMS=0x00;
        //ResultBcdYMD=0x00;
        return;
   }
   else
   {
/*--------------------------日期、时间字符串转BIN--------------*/
   TimeBinHMS=(timeHMS-'0')*10+(timeHMS-'0');
   TimeBinHMS=(timeHMS-'0')*10+(timeHMS-'0');
   TimeBinHMS=(timeHMS-'0')*10+(timeHMS-'0');
   DayBinYMD=(dayYMD-'0')*10+(dayYMD-'0')+2000;
   DayBinYMD=(dayYMD-'0')*10+(dayYMD-'0');
   DayBinYMD=(dayYMD-'0')*10+(dayYMD-'0');
/*-------------------------------------END--------------------*/
   TimeBinHMS+=8;
/*----------------------------------------调整日期---------------------------------------------*/
   if(TimeBinHMS>=24){         //如果大于等于24小时,侧需要调整日期   
          TimeBinHMS-=24;
          DayBinYMD++;
          switch(DayBinYMD)
          {
               case 1: case 3:
               case 5: case 7:
               case 8: case 10:
                                 if(DayBinYMD>31)
                                   {
                                           DayBinYMD=1;
                                        DayBinYMD++;
                                   }
                         break;
               case 4: case 6:
               case 9: case 11:
                         if(DayBinYMD>30)
                                   {
                                           DayBinYMD=1;
                                        DayBinYMD++;
                                   }
                         break;
               case 12: if(DayBinYMD>31)
                                   {
                                           DayBinYMD=1;
                                        DayBinYMD=1;
                                        DayBinYMD++;
                                   }
                                  break;
               case 2:if((DayBinYMD%400==0)||((DayBinYMD%4==0)&&(DayBinYMD%100!=0))){                 //闰年
                            if(DayBinYMD>29){
                                           DayBinYMD=1;
                                           DayBinYMD=3;
                                          }
                                   }else{                                                                                     //平年
                                          if(DayBinYMD>28){
                                           DayBinYMD=1;
                                           DayBinYMD=3;
                                          }
                                   }
                        break;
               default: break;
                }
   }
/*---------------------------------------------------END----------------------------------------*/
/*-------------------------------时间转换--------------------------------*/       
       ResultBcdHMS=0x06;
       ResultBcdHMS=0x00;
       ResultBcdHMS=0x06;             //时间的寄存器号
       ResultBcdHMS=((TimeBinHMS/10)<<4)|(TimeBinHMS%10);
       ResultBcdHMS=((TimeBinHMS/10)<<4)|(TimeBinHMS%10);
       ResultBcdHMS=((TimeBinHMS/10)<<4)|(TimeBinHMS%10);
/*----------------------------------END----------------------------------*/
/*--------------------------------日期转换-------------------------------*/       
       ResultBcdYMD=0x07;
       ResultBcdYMD=0x00;
       ResultBcdYMD=0x07;             //日期的寄存器号
       BinToBcd(DayBinYMD,&Year);
       ResultBcdYMD=Year>>8;
       ResultBcdYMD=Year&0xff;
       ResultBcdYMD=(((uchar)DayBinYMD/10)<<4)|(DayBinYMD%10);
       ResultBcdYMD=(((uchar)DayBinYMD/10)<<4)|(DayBinYMD%10);
/*----------------------------------END----------------------------------*/
}
}
/*
*****************************************************************
函数名称: GPS数据分拣
函数功能: 分拣采集到的GPS数据,把不同段数据首地址送给各自的指针
入口参数: 要分拣的GPS原始数据
出口参数: 无
*****************************************************************
*/
void GpsDataFenjian(uchar *GpsD)
{
uchar i,Dhao=0;
for(i=0;i<150;i++){
   if(GpsD==','){
          Dhao++;
                switch(Dhao)
              {
                   case 1:GpsPointer.HMS=&GpsD;      
                            break;
                   case 2:GpsPointer.State=&GpsD;
                            break;
                   case 3:GpsPointer.N=&GpsD;
                            break;
                   case 5:GpsPointer.E=&GpsD;
                            break;
                   case 7:GpsPointer.Speed=&GpsD;
                            break;
                   case 8:GpsPointer.Course=&GpsD;
                            break;
                   case 9:GpsPointer.YMD=&GpsD;
                            break;
                   default: break;
                  }
          }
       if(Dhao==10) break;
   }
GPS.State=0x04;               
GPS.State=0x00;
GPS.State=0x05;
switch(GpsPointer.State)
      {
           case 65:GPS.State=0x65;
                   //此处添加点亮GPS定位状态指示灯语句,定位有效
                               break;
           case 86:GPS.State=0x86;
                   //此处添加熄灭GPS定位状态指示灯语句,定位无效
                               break;
           default:GPS.State=0x88;
                   break;          
          }
//returnGPS.State;
}

/*
**************************************************************************
函数名称: 经纬度字符转BCD
函数功能: 将从GPS模块中提取的字符串形式的经纬度信息转换成BCD码格式
入口参数: 要转换的经纬度字符串,转换结果存放地址(存放形式: 度分 格式),寄存器号
出口参数: 转换后的BCD码的字节数
**************************************************************************
*/
uchar GpsNE_AscToBcd(uchar *p,uchar *q,uchar re)
{
uchar i,j,n;
uchar BiytNumb=0;               //返回转换后的BCD码字节个数
uintNEH=0;                              //存放整数部分
uintNEL=0;                      //存放小数部分
uintXsBcd16=0;
uintZsBcd16=0;
/*-------------将字符串转换为BIN----------*/
   if(p==',')
   {       
        //q=0;
          return 0;
       }
   for(i=0;i<15;i++)
   if(p=='.'){                                          //寻找小数点
           for(j=i-2;j<i+4;j++){
             if(p=='.') continue;
               NEL=NEL*10;                                  ///分的转换
             NEL+=(p-'0');
             }
           NEL=NEL/6;
           for(j=0;j<i-2;j++){
             NEH=NEH*10;
               NEH+=(p-'0');
               }
          break;
       }
/*------------------END-------------------*/
   n=NEH;
/*-----------------------转换分----------*/
   BinToBcd(NEL,&XsBcd16);                                  //转换分
/*------------------------END------------*/
/*-------------------转换度---------------*/
   BinToBcd(NEH,&ZsBcd16);                            //转换度
   if(n>99){
   q=0x07;
       q=0x04;
       q=re;
       q=ZsBcd16>>8;                                  //保存度的高字节
   q=ZsBcd16&0xff;                                               //保存度的低字节
       q=XsBcd16>>8;                                     //保存分的高字节
   q=XsBcd16&0xff;                            //保存分的低字节
   BiytNumb=7;
    }else{
   q=0x06;
       q=0x04;
       q=re;
       q=ZsBcd16&0xff;                              //保存度,单字节
       q=XsBcd16>>8;                                     //保存分的高字节
   q=XsBcd16&0xff;                            //保存分的低字节
   BiytNumb=6;
    }
/*---------------------END---------------*/
   returnBiytNumb;
}
/*
************************************************************************
函数名称: 二进制转BCD码函数
函数功能: 将16位二进制数据转换为压缩BCD码格式
入口参数: 要转换的16位的二进制数据和转换结果的地址
出口参数: 转换后的两字节压缩BCD码
说    明: 本函数专门为GPS的经纬度设计,故要转换的二进制数据有
         范围大小的限制,因为转换结果为两字节BCD码,故转换结
                   果最大为9999,所以要转换的二进制数据不大于0x270F
************************************************************************
*/       
uchar BinToBcd(uint Bin16,uint *Bcd16)
{
uchar BcdNumb=0;
uchar i;
for(i=0;i<16;i++){                               
      if((*Bcd16&0X0F)>=5)                  //大于等于5加3
          {
                  *Bcd16=(((*Bcd16&0x0F)+3)&0x0f)|(*Bcd16&0xfff0);
                }
          if(((*Bcd16&0Xf0)>>4)>=5)                //大于等于5加3
          {
                  *Bcd16=(((((*Bcd16&0Xf0)>>4)+3)&0x0f)<<4)|(*Bcd16&0xff0f);
                }       
       if(((*Bcd16&0X0F00)>>8)>=5)                     //大于等于5加3
          {
              *Bcd16=(((((*Bcd16&0x0F00)>>8)+3)&0x0f)<<8)|(*Bcd16&0xf0ff);
                }
          if(((*Bcd16&0Xf000)>>12)>=5)               //大于等于5加3
          {
                  *Bcd16=(((((*Bcd16&0Xf000)>>12)+3)&0x0f)<<12)|(*Bcd16&0x0fff);
                }       
          *Bcd16=(*Bcd16<<1)|(bit)(Bin16&0x8000);
          Bin16=Bin16<<1;
      }          
return BcdNumb;
}

comway 发表于 2011-6-28 10:24:32

要以战养战,实践中学习,只要程序功能对,不死机,质量就不错

qingqng 发表于 2011-6-28 11:35:39

看起来挺难受.多用用结构体

jssz_hf 发表于 2011-6-28 11:51:29

混混

bingshuihuo888 发表于 2011-6-28 13:41:15

看起来挺难受.多用用结构体   说的对
但是不会使用也没办法啊

jdzjk06 发表于 2011-6-28 14:59:49

热烈欢迎高手批评指教!!!

menglongfc 发表于 2011-6-28 15:04:00

一年,不知状态机

mitchell 发表于 2011-6-28 15:23:16

回复【19楼】jdzjk06
-----------------------------------------------------------------------

中间有个函数看着很不舒服,修改了一下,功能应该和原来的一样。
其他就没有仔细看了,有些函数代码过长,不够简洁。你去看看linux的原码,大多数函数都是很简短的几行。


原来的代码为:
void GpsDataFenjian(uchar *GpsD)
{
        uchar i,Dhao=0;
        for(i=0;i<150;i++){
                if(GpsD==','){
                        Dhao++;
                        switch(Dhao)
                        {
                        case 1:GpsPointer.HMS=&GpsD;      
                                break;
                        case 2:GpsPointer.State=&GpsD;
                                break;
                        case 3:GpsPointer.N=&GpsD;
                                break;
                        case 5:GpsPointer.E=&GpsD;
                                break;
                        case 7:GpsPointer.Speed=&GpsD;
                                break;
                        case 8:GpsPointer.Course=&GpsD;
                                break;
                        case 9:GpsPointer.YMD=&GpsD;
                                break;
                        default: break;
                        }
                }
                if(Dhao==10) break;
        }
        GPS.State=0x04;
        GPS.State=0x00;
        GPS.State=0x05;
        switch(GpsPointer.State)
        {
        case 65:GPS.State=0x65;
                //此处添加点亮GPS定位状态指示灯语句,定位有效
                break;
        case 86:GPS.State=0x86;
                //此处添加熄灭GPS定位状态指示灯语句,定位无效
                break;
        default:GPS.State=0x88;
                break;   
        }
        //returnGPS.State;
}

修改为:

void GpsDataFenjian(uchar *GpsD)
{
        uchar i = 150, Dhao = 0;

        while(i--){
                if(*GpsD++ == ','){
                        switch(++Dhao){
                        case 1:GpsPointer.HMS = GpsD;      
                                break;
                        case 2:GpsPointer.State = GpsD;
                                break;
                        case 3:GpsPointer.N = GpsD;
                                break;
                        case 5:GpsPointer.E = GpsD;
                                break;
                        case 7:GpsPointer.Speed = GpsD;
                                break;
                        case 8:GpsPointer.Course = GpsD;
                                break;
                        case 9:GpsPointer.YMD = GpsD;
                                break;
                        case 10:
                                GPS.State = 0x04;
                                GPS.State = 0x00;
                                GPS.State = 0x05;
                                //此处添加点亮GPS定位状态指示灯语句,定位有效
                                //此处添加熄灭GPS定位状态指示灯语句,定位无效
                                GPS.State = (GpsPointer.State == 65) ? 0x65 : \
                                        (GpsPointer.State == 86) ? 0x65 : 0x88;
                                break;
                        }
                }
        }
}

jdzjk06 发表于 2011-6-28 20:35:04

回复【26楼】mitchell
-----------------------------------------------------------------------

受益了!! 不知道该怎么提高这方面的能力呢,推荐一些方法或书籍吧!!!

sunliezhi 发表于 2011-6-28 21:10:22

我来补一个数据接收功能,(作者不知道是谁了)

void gps_test(void)

{

    char cInputChar;

    char nStrBuf;

        intset_baud,i = 0;

        uart_change_baud(UART1,9600);

        while(1)

        {

                cInputChar = uart_tran();                       

                        if (cInputChar == '$')

                        {

                                if(i != 0)

                                {

                                        if(!strncmp(nStrBuf,"$GPRMC ", 6))                // Format: $GPRMC,DATA,...,DATA

                                        {

                                                nStrBuf = cInputChar;

                                                gps_info(MSG_GPRMC,&nStrBuf);

                                        }

                                }

                                i = 0;

                        }

                        nStrBuf = cInputChar;

                        i++;

        }

}

mitchell 发表于 2011-6-28 21:30:40

回复【27楼】jdzjk06
回复【26楼】mitchell
-----------------------------------------------------------------------
受益了!! 不知道该怎么提高这方面的能力呢,推荐一些方法或书籍吧!!!
-----------------------------------------------------------------------

看代码吧:lwIP,很不错,代码类型同lz的应用非常类似。另外,系统库,类似(stdio.h, stdlib.h, string.h, ...)这些库里的各个函数的实现源码看一看,收货也不小。再者,操作系统如果不想深入学习,就看看设备驱动程序。
书籍我也想不起来,根据侧重点去搜吧。

stdio 发表于 2011-6-28 21:33:47

单从软件来说,直接去尝试写编译器的一部分,一年之后,就会有登高望远之感。

dzmcs 发表于 2011-6-28 21:50:43

回复【30楼】stdio
单从软件来说,直接去尝试写编译器的一部分,一年之后,就会有登高望远之感。
-----------------------------------------------------------------------

写过吗?很早有想法,写了一部分汇编器的实现,最后发现没啥意义。
编译器,工程量浩大。解释器还有点意义。

mitchell 发表于 2011-6-28 22:48:13

回复【30楼】stdio
单从软件来说,直接去尝试写编译器的一部分,一年之后,就会有登高望远之感。
-----------------------------------------------------------------------

这个已经提到了,“一方面。。。了解C语言的编译和汇编程序”,当然,只是境界不一样了

460082998 发表于 2011-6-28 23:47:06

看了大家的回复,真是受益匪浅

xlsbz 发表于 2011-6-29 08:22:35

回复【19楼】jdzjk06
-----------------------------------------------------------------------

说不好谁写的好你可能写的已经很好了!

乱说几句可能混乱

第一 关键是 C语言

externstruct GPSDATAC{
uchar *HMS;   //定位模块中采集到的时间时分秒
uchar *State;         //定位状态 A V X
uchar *N;   //纬度
uchar *E; //经度
uchar *Speed;   //速度
uchar *Course;       //航向
uchar *YMD;                //日期年月日
}GpsPointer;

这个结构体本质就是个变量类型用extern??

uchar用 typedef unsigned char INT8U 或 uint8_t

if(courseAscii!=','&&courseAscii!=','){
改为if((courseAscii!=',')&&(courseAscii!=',')){


break 不能随意用

uchar i,j;
改为uchar i = 0;
    uchar j = 0;

感觉你写的已经很好了

推荐 misra2004   代码大全

自己到google关键字

canghai 发表于 2011-6-29 23:30:47

小白,学习

jdzjk06 发表于 2011-6-30 10:35:30

很感谢楼上的指教!!!我会继续努力……呵呵!

Helloeveryon 发表于 2011-7-1 10:48:20

回复【14楼】19001579
-------------------------------------------------------------------
兄台,你说用状态机的思想编程可有什么书可以学习的,或者资料

peaker_hear 发表于 2011-7-8 23:20:35

看了UCOS的操作系统的书很受益,可以借鉴很多东西到程序中

jyjmaster 发表于 2011-10-28 21:02:54

mark..

rphoho 发表于 2011-10-28 21:44:58

什么叫状态机

wintelboy 发表于 2011-10-28 22:30:00

本人深有同感,英语一般,这方面资料还都是英文的,想进步好难啊

lhxxznr1 发表于 2011-10-29 21:42:47

什么叫 单片机 的状态机。。。。 是不是中断里处理标志位,主函数是个大循环,标志位有变,就处理,否则查下一个标志位,以此类推循环

captain2012 发表于 2011-10-30 15:48:24

mark

ren_xiaoyu 发表于 2011-10-30 16:53:45

学习了 受益匪浅

dmxfeng 发表于 2011-10-30 19:22:17

记号

hb2006223 发表于 2011-10-30 20:04:27

还不了解状态机,学习了。

wxfje 发表于 2011-10-30 20:14:53

受教了。。。

analogmaster 发表于 2011-10-30 20:19:57

能解决问题,不在乎程序用多少高深的描述。

Excellence 发表于 2011-10-30 20:23:21

楼主写的不算差,起码变量和函数定义方面很规范。

但函数里if else和SWITCH CASE纠缠的太厉害,能否把功能好好划分一下,都弄成独立的函数。


另:C中定义变量,H中声明变量。
把和硬件有关的都定义一个公共头文件中,用英文单词替代,
这样换其他不同的芯片,也只是修改头文件中的和硬件有关的,其他不用动。

多写多看其他人写的代码。比如UCOS ,LINUX,MFC等等。

zaodongdeyun 发表于 2011-10-30 23:24:07

小白在此观摩~~

thinpov 发表于 2011-11-1 15:46:00

从你们的言论中我找到了我的缺点,从你们的言论中我找到了我的将来,从你们的言论中我找到了归宿,衷心的谢谢各位的分享!

jdzjk06 发表于 2011-11-4 15:06:12

...

jasonM2011 发表于 2011-11-4 15:22:34

对于编程能力,应该还可以,最近想学51单片机,可惜硬件是我的硬伤啊。编程倒是还行,毕竟用C/C++做开发有3年了。求LZ指导我51硬件方面的知识,我可以和LZ交流下编程知识。。呵呵。不知道咋样?
QQ:308378975

jasonM2011 发表于 2011-11-4 15:27:55

所谓的状态机,实际上应该是在面向对象的语言里用的一种设计模式,当然在C语言里也可以用,这样是程序的逻辑更清晰,大概的思路就是改变状态的同时,也改变程序的行为。在C语言里面,你可以简单的用结构体数组来实现状态机。类似这样:

typedef void (*pfnFunc)();

typedef struct state
{
   char state;
   pfnFunc proc;
}STATE_T;

然后用状态和对应的状态的行为(也就是函数)来初始化数组,然后。在处理的时候,就是使用状态来决定行为,代码会非常简洁,就不会有大段大段的if else 或者switch case的语句啦。。。。。呵呵。当然我说的是最简单的实现,自己可以慢慢完善他。。。。。LZ多交流。

eedesign 发表于 2011-11-4 16:21:01

确实是,我也是在闭门造车,内省中

hf5542 发表于 2011-11-4 16:26:12

学习学习!!!

guzidikk 发表于 2011-11-4 21:58:11

回复【楼主位】jdzjk06
-----------------------------------------------------------------------

一方面,深入单片机内部,熟悉微机原理,了解c语言的编译和汇编程序。这样非常有助于写出很高效的代码,以及解决一些c语言容易出现的“““莫名其妙”””的问题。
二方面,系统学习算法。
三方面,读读操作系统源码或者其他高质量的代码

楼主,我需要个程序帮我编编的

是基于PT100热电阻的51单片机温度检测报警系统的

jiangxingwu 发表于 2011-11-4 22:21:53

我经常遇到这样的问题
知道流程怎么去走
但是用C语言写不出来算法

mybigapple 发表于 2011-11-5 22:30:17

学习了,谢谢了

chenskss 发表于 2011-12-29 13:59:16

想学习,但不知道从哪里入手呀

xuyapple 发表于 2012-2-22 22:08:51

标记一下~

wtiechen1969 发表于 2012-2-23 17:37:29

mark

lxdsmall 发表于 2012-2-23 19:43:05

我是一般二本学校大二学生,学51时间半年,看到你们的留言,感触很深,也看到差距之大。毕业后不想考研希望各位指导学什么就业比较好。求教?

guoran12 发表于 2012-2-23 20:24:00

单片机的内核和C语言的基础对于初学者来说比较关键的。有条件的话自己去电子市场购买一些小型元器件和单面板自己搭电路开发一些小型设备。要理论和和实践结合进步才快。

B214215850 发表于 2012-2-24 14:45:59

了解,学习

r166 发表于 2012-2-24 15:02:44

mark

y574924080 发表于 2012-2-25 15:39:06

我学单片机学的也是

感觉一头雾水的啊
页: [1]
查看完整版本: 51的程序做了快两年了,但程序质量一直不理想,怎么才能提高自己的编程水平啊???希望高手指