搜索
bottom↓
楼主: 吴坚鸿

从业将近十年!手把手教你单片机程序框架(连载)

  [复制链接]

出0入0汤圆

发表于 2015-7-14 17:26:14 | 显示全部楼层
都是实战.........

出0入0汤圆

发表于 2015-7-29 21:04:52 | 显示全部楼层
吴哥,你的帖子真心不错,继续等待更新,有个问题想请教下,第38节中判断数据尾的程序框架中,做了5个数据,其中前两个是数据位,后3个是数据尾,通过串口中断,将数据打入预先设置的数组缓存中,为什么这个数组要设置10个数据,我们需要接受的只有5个数据,这样做有什么好处吗,

出0入0汤圆

发表于 2015-8-19 22:29:18 | 显示全部楼层
火速留名

出0入0汤圆

发表于 2015-8-23 19:16:26 | 显示全部楼层
LZ真是无私奉献,现在这样的人很少了,很少高手会把自己所学拿出来与大家分享,都是各搞各的,

出0入0汤圆

发表于 2015-8-23 22:26:02 | 显示全部楼层
钦佩楼主的奉献精神!

出85入85汤圆

发表于 2015-9-15 23:15:21 | 显示全部楼层
谢谢楼主糊提灌顶

出0入0汤圆

发表于 2015-9-15 23:46:49 | 显示全部楼层
坚持了一年,真的不容易

出0入0汤圆

发表于 2015-9-19 21:51:38 | 显示全部楼层
支持一下!

出0入0汤圆

发表于 2015-11-8 08:52:26 | 显示全部楼层
mark,一下

出0入0汤圆

发表于 2015-11-8 13:31:04 | 显示全部楼层
非常好的学习资料,谢谢.

出0入0汤圆

发表于 2015-11-8 21:08:55 | 显示全部楼层
这么多变量,是不是自己也容易搞混

出0入0汤圆

发表于 2015-11-8 21:31:21 | 显示全部楼层
确实不错,谢谢楼主!

出0入0汤圆

发表于 2015-11-13 14:30:08 | 显示全部楼层
吴坚鸿 发表于 2014-3-10 11:27
第一节:吴坚鸿谈初学单片机的误区。

(1)很难记住繁杂的寄存器?寄存器不用死记硬背,我做了那么久单片 ...

我想说,没有指针单片机跑程序速度慢了,没有结构体程序无法做到优化,宏定义可以初始化很多东西,仅此个人意见。

出0入0汤圆

发表于 2015-11-13 14:33:21 | 显示全部楼层
吴坚鸿 发表于 2014-3-10 11:30
第四节:累计定时中断次数使LED灯闪烁。

开场白:

这个程序,说真的,写的不咋的,还谈框架

出0入0汤圆

 楼主| 发表于 2015-11-28 02:01:53 | 显示全部楼层
本帖最后由 吴坚鸿 于 2015-11-28 14:35 编辑

第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。
         我今天在做数控三轴运动卡的项目时,正在考虑ARM单片机和FPGA如何检测步进电机回原点的问题,灵感一来,想到了一种我很满意的行程开关识别思路。为了说明此思路的优越性,我会先列出前面两种常用的思路作对比。并且举一个最简单的工控项目来说明。
      此工控项目要求:上电后,一个普通电机控制一个滑块从左边往右边推,最右边有一个行程开关,滑块碰到行程开关后,电机停止,运动结束。
       转化成单片机编程思路 :用1个IO输出高电平时电机运动,输出低电平时电机停止。另外再用1个IO口作输入,检测行程开关的电平状态,如果发现是高电平说明电机还没碰上行程开关感应器,如果发现是低电平就说明碰上了感应器,此时就可以发出停止电机的命令。
        就是这么简单的过程,其实在识别开关感应器时暗藏玄机,现在一一解剖分析给大家:
        第一种思路:直接判断行程感应器的电平状态,一旦发现低电平,就认为电机已经碰到了行程开关,马上停止电机。
        优点:响应及时。
        缺点:太灵敏了,以至于抗干扰能力非常差,在工控环境里,当电机正在行进的过程中,如果受到电源的波动或者外来的毛刺信号干扰,行程开关的输入信号可能会读取到瞬间的低电平,导致单片机误判断,提前把电机停止了,电机还没碰到行程开关就草率停机。
        源码如下:
  1. #include "REG52.H"


  2. #define CONT_TIME_20MS   10   //大概10次中断相当于20毫秒

  3. void motor_run();      //电机往右边移动
  4. void motor_stop();     //电机停止
  5. void motor_pause();    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样

  6. void T0_time();  //定时中断函数


  7. sbit motor_dr=P3^5; //控制电机的启动和停止的输出  对应朱兆祺学习板的独立LED灯
  8. sbit right_sr=P0^2; //右边的行程开关检测输入  对应朱兆祺学习板的S9键
  9. sbit key_gnd_dr=P0^4; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

  10. unsigned char u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  11. unsigned char u8MotorFlagBackup=0;  //用来记录上一次的电机状态,用于判断电机的状态是否发生了改变。

  12. unsigned char u8TimeFlag=0; //计时器的开关
  13. unsigned int  u16TimeCnt=0; //计时器的计时变量

  14. unsigned char u8RunStep;  //运动控制的步骤变量

  15. void main()
  16. {
  17.    key_gnd_dr=0; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平
  18.    TMOD=0x01;  //设置定时器0为工作方式1

  19.    TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
  20.    TL0=0x2f;

  21.    EA=1;     //开总中断
  22.    ET0=1;    //允许定时中断
  23.    TR0=1;    //启动定时中断

  24.    u8RunStep=1;  //一上电,电机就开始从第1步开始启动
  25.    while(1)   
  26.    {
  27.        switch(u8RunStep)
  28.        {
  29.           case 1:   
  30.                motor_run();     //电机往右边移动
  31.                u8RunStep=2;  //切换到下一个步骤
  32.                break;

  33.            case 2:    //等待滑块移动到最右边,直到触发了最右边的行程开关感应器。
  34.                if(0==right_sr)  //右边的行程感应器被触发
  35.                {
  36.                                 motor_stop();     //电机停止
  37.                     u8RunStep=3;       //马上切换到电机停止的步骤
  38.                }
  39.                break;

  40.            case 3:    //电机处于停止的步骤,除非重新断电重启,否则就一直处于此步骤状态
  41.                 break;
  42.        }
  43.    }

  44. }



  45. void T0_time() interrupt 1   //定时中断,大概每2ms就中断一次
  46. {
  47.   TF0=0;  //清除中断标志
  48.   TR0=0; //关中断


  49.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
  50.   TL0=0x2f;
  51.   TR0=1;  //开中断
  52. }



  53. void motor_run()      //电机往右边移动
  54. {
  55.     motor_dr=1;
  56.     u8MotorFlag=1;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  57. }
  58. void motor_stop()     //电机停止
  59. {
  60.     motor_dr=0;
  61.     u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  62. }
  63. void motor_pause()    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样
  64. {
  65.     motor_dr=0;
  66.     u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  67. }



复制代码

        第二种思路:在判断行程感应器的电平状态时,加入了软件的抗干扰处理,一旦发现低电平,一个计时器开始计时,在计时的期间,如果发现出现高电平就马上把计时器清零,如果一直是低电平,并且期间没有出现高电平,就认为是稳定的低电平,此时判定是碰到了行程开关。
        优点:增加了抗干扰处理,几乎能百分百保证电机碰到了行程开关才停机,几乎不会误判了。
        缺点:在软件抗干扰环节增加了一小段延时,而这一小段的延时,会导致电机碰到行程开关后没有马上停止,滑块继续往右边运动了一段时间才停止,时间长了容易把右边的限位机械结构压坏挤坏,因为有应力存在。
        源码如下:
  1. #include "REG52.H"


  2. #define CONT_TIME_20MS   10   //大概10次中断相当于20毫秒

  3. void motor_run();      //电机往右边移动
  4. void motor_stop();     //电机停止
  5. void motor_pause();    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样

  6. void T0_time();  //定时中断函数


  7. sbit motor_dr=P3^5; //控制电机的启动和停止的输出  对应朱兆祺学习板的单个LED灯
  8. sbit right_sr=P0^2; //右边的行程开关检测输入   对应朱兆祺学习板的S9键
  9. sbit key_gnd_dr=P0^4; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

  10. unsigned char u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  11. unsigned char u8MotorFlagBackup=0;  //用来记录上一次的电机状态,用于判断电机的状态是否发生了改变。

  12. unsigned char u8TimeFlag=0; //计时器的开关
  13. unsigned int  u16TimeCnt=0; //计时器的计时变量

  14. unsigned char u8RunStep;  //运动控制的步骤变量

  15. void main()
  16. {
  17.    key_gnd_dr=0; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

  18.    TMOD=0x01;  //设置定时器0为工作方式1

  19.    TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
  20.    TL0=0x2f;

  21.    EA=1;     //开总中断
  22.    ET0=1;    //允许定时中断
  23.    TR0=1;    //启动定时中断

  24.    u8RunStep=1;  //一上电,电机就开始从第1步开始启动
  25.    while(1)   
  26.    {
  27.        switch(u8RunStep)
  28.        {
  29.           case 1:   
  30.                motor_run();     //电机往右边移动

  31.                u8TimeFlag=0; //计时器关
  32.                u16TimeCnt=0; //计时器的计时变量清零

  33.                u8RunStep=2;  //切换到下一个步骤
  34.                break;

  35.            case 2:    //等待滑块移动到最右边,直到触发了最右边的行程开关感应器。
  36.                if(0==right_sr)  //右边的行程感应器被触发
  37.                {
  38.                     u8TimeFlag=1; //计时器开
  39.                     if(u16TimeCnt>=CONT_TIME_20MS)  //连续20ms内都是低电平,则认为是低电平
  40.                     {
  41.                        u8TimeFlag=0; //计时器关
  42.                        u16TimeCnt=0; //计时器的计时变量及时清零

  43.                                    motor_stop();     //电机停止
  44.                        u8RunStep=3;       //马上切换到电机停止的步骤
  45.                     }
  46.                }
  47.                else  //如果是高电平
  48.                {
  49.                     u8TimeFlag=0; //计时器关
  50.                     u16TimeCnt=0; //计时器的计时变量及时清零
  51.                }
  52.                break;

  53.            case 3:    //电机处于停止的步骤,除非重新断电重启,否则就一直处于此步骤状态
  54.                 break;
  55.        }
  56.    }

  57. }



  58. void T0_time() interrupt 1   //定时中断,大概每2ms就中断一次
  59. {
  60.   TF0=0;  //清除中断标志
  61.   TR0=0; //关中断

  62.   if(1==u8TimeFlag)
  63.   {
  64.      u16TimeCnt++;
  65.   }


  66.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
  67.   TL0=0x2f;
  68.   TR0=1;  //开中断
  69. }



  70. void motor_run()      //电机往右边移动
  71. {
  72.     motor_dr=1;
  73.     u8MotorFlag=1;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  74. }
  75. void motor_stop()     //电机停止
  76. {
  77.     motor_dr=0;
  78.     u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  79. }
  80. void motor_pause()    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样
  81. {
  82.     motor_dr=0;
  83.     u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  84. }



复制代码


       第三种思路:本思路是结合了前面两种的优点,在判断行程感应器的电平状态时,当发现是低电平时(哪怕是干扰时出现的瞬间低电平),电机马上暂停(暂停和停止的概念不一样,虽然电机都是没有转),当发现是高电平时,电机继续运行,什么时候才认为碰到行程开关?当低电平像第二种思路那样连续持续低电平的时间超过某个值时,才认为碰到了行程开关。巧妙的是,在此判断低电平的小延时期间,电机是处于暂停的状态(没有转),所以不会过冲挤压右边的行程限位机构。
        优点:既能及时响应,又增加了行程开关检测的抗干扰处理,又不会让电机过冲挤压右边的行程开关。
        缺点:暂时还没想出来。
        源码如下:
  1. #include "REG52.H"


  2. #define CONT_TIME_20MS   10   //大概10次中断相当于20毫秒

  3. void motor_run();      //电机往右边移动
  4. void motor_stop();     //电机停止
  5. void motor_pause();    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样

  6. void T0_time();  //定时中断函数


  7. sbit motor_dr=P3^5; //控制电机的启动和停止的输出,对应朱兆祺学习板的单个LED灯
  8. sbit right_sr=P0^2; //右边的行程开关检测输入,对应朱兆祺学习板的S9键

  9. sbit key_gnd_dr=P0^4; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

  10. unsigned char u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动

  11. unsigned char u8RightSrFlagBackup=0;  //用来记录上一次的行程开关电平状态,用来判断行程开关是否发生过电平变化

  12. unsigned char u8TimeFlag=0; //计时器的开关
  13. unsigned int  u16TimeCnt=0; //计时器的计时变量

  14. unsigned char u8RunStep;  //运动控制的步骤变量

  15. void main()
  16. {
  17.    key_gnd_dr=0; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

  18.    TMOD=0x01;  //设置定时器0为工作方式1

  19.    TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
  20.    TL0=0x2f;

  21.    EA=1;     //开总中断
  22.    ET0=1;    //允许定时中断
  23.    TR0=1;    //启动定时中断

  24.    u8RunStep=1;  //一上电,电机就开始从第1步开始启动
  25.    while(1)   
  26.    {
  27.        switch(u8RunStep)
  28.        {
  29.           case 1:   
  30.                motor_run();     //电机往右边移动
  31.                u8RightSrFlagBackup=1;  //用来判断行程开关是否发生过电平变化

  32.                u8TimeFlag=0; //计时器关
  33.                u16TimeCnt=0; //计时器的计时变量清零

  34.                u8RunStep=2;  //切换到下一个步骤
  35.                break;

  36.            case 2:    //等待滑块移动到最右边,直到触发了最右边的行程开关感应器。
  37.                if(0==right_sr)  //右边的行程感应器被触发
  38.                {
  39.                                 if(u8RightSrFlagBackup!=0) //行程开关的电平发生过变化
  40.                                         {
  41.                                            u8RightSrFlagBackup=0; //及时更新,避免一直触发电机的命令操作
  42.                                            motor_pause();    //电机及时暂停
  43.                                         }

  44.                     u8TimeFlag=1; //计时器开
  45.                     if(u16TimeCnt>=CONT_TIME_20MS)  //连续20ms内都是低电平,则认为是低电平
  46.                     {
  47.                        u8TimeFlag=0; //计时器关
  48.                        u16TimeCnt=0; //计时器的计时变量及时清零

  49.                                    motor_stop();     //电机停止
  50.                        u8RunStep=3;       //马上切换到电机停止的步骤
  51.                     }
  52.                }
  53.                else  //如果是高电平
  54.                {

  55.                                 if(u8RightSrFlagBackup!=1) //行程开关的电平发生过变化
  56.                                         {
  57.                                            u8RightSrFlagBackup=1; //及时更新,避免一直触发电机的命令操作
  58.                        motor_run();      //电机继续往右边移动
  59.                                         }
  60.                     u8TimeFlag=0; //计时器关
  61.                     u16TimeCnt=0; //计时器的计时变量及时清零
  62.                }
  63.                break;

  64.            case 3:    //电机处于停止的步骤,除非重新断电重启,否则就一直处于此步骤状态
  65.                 break;
  66.        }
  67.    }

  68. }



  69. void T0_time() interrupt 1   //定时中断,大概每2ms就中断一次
  70. {
  71.   TF0=0;  //清除中断标志
  72.   TR0=0; //关中断

  73.   if(1==u8TimeFlag)
  74.   {
  75.      u16TimeCnt++;
  76.   }


  77.   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
  78.   TL0=0x2f;
  79.   TR0=1;  //开中断
  80. }



  81. void motor_run()      //电机往右边移动
  82. {
  83.     motor_dr=1;
  84.     u8MotorFlag=1;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  85. }
  86. void motor_stop()     //电机停止
  87. {
  88.     motor_dr=0;
  89.     u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  90. }
  91. void motor_pause()    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样
  92. {
  93.     motor_dr=0;
  94.     u8MotorFlag=0;  //电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
  95. }



复制代码

         最后再提醒一下:凡是有行程限位开关的地方,速度都不宜太快,要控制好速度,因为高速会由于比较大的惯性产生碰击现象。如果需要高速的场合,最好能在到达终点前多增加一个感应器,在到达终点前做一些减速操作。如果是步进电机,也可以利用实时坐标信息来识别快到行程开关终点时做一些减速处理。
       (本连载仅为初稿,我计划在2017年从头开始重写一次此连载,融入我最新的技术理解,在原来的基础上进一步提炼和补充)

出0入0汤圆

发表于 2015-11-28 16:57:23 | 显示全部楼层
吴坚鸿 发表于 2015-11-28 02:01
第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。
         我今天在做数 ...

学习中,支持一下!

出0入0汤圆

发表于 2015-12-1 22:42:53 | 显示全部楼层
膜拜下。

出0入0汤圆

发表于 2015-12-2 09:11:33 | 显示全部楼层
太棒了,支持一下

出0入0汤圆

发表于 2015-12-6 20:32:36 | 显示全部楼层
不错的资料

出0入0汤圆

发表于 2015-12-13 22:50:47 | 显示全部楼层
吴老师发帖了,得顶上来啊!

出0入0汤圆

发表于 2015-12-13 22:53:22 | 显示全部楼层
好东西阿。楼主无私贡献。虽然现在不做单片机开发了,还是要顶。

出0入0汤圆

发表于 2015-12-14 09:25:21 | 显示全部楼层
谢谢分享~~~~~~~~

出0入0汤圆

发表于 2015-12-15 21:06:22 | 显示全部楼层
吴坚鸿 发表于 2015-11-28 02:01
第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。
         我今天在做数 ...

注解非常详细,内容循序渐进很丰富,能坚持把自已的所学无私奉献,值得让人敬佩。

出0入0汤圆

 楼主| 发表于 2015-12-20 01:37:30 | 显示全部楼层
本帖最后由 吴坚鸿 于 2015-12-20 01:39 编辑
ddg_int 发表于 2015-12-13 22:53
好东西阿。楼主无私贡献。虽然现在不做单片机开发了,还是要顶。


我现在还一直在做单片机开发,最近在做stm32F407和FPGA的开发,在做数控机器人系统,运动卡这类的项目。

出0入0汤圆

发表于 2015-12-25 15:52:01 | 显示全部楼层
吴坚鸿 发表于 2015-12-20 01:37
我现在还一直在做单片机开发,最近在做stm32F407和FPGA的开发,在做数控机器人系统,运动卡这类的项目。 ...

楼主什么时候出书?  按键模块一直都在用楼主的了后来, 好用 哈哈

出0入0汤圆

发表于 2015-12-25 15:52:36 | 显示全部楼层
谢谢分享     

出0入4汤圆

发表于 2015-12-25 16:22:13 | 显示全部楼层
学习一下楼主的框架~!

出0入0汤圆

发表于 2015-12-25 22:01:38 | 显示全部楼层
按键模块确实好用,产品中已实应用,谢谢楼主.

出0入0汤圆

发表于 2016-1-17 20:58:19 | 显示全部楼层
niubility的分享,能把51玩的飞起来的男人非吴老师莫属了

出0入0汤圆

发表于 2016-1-17 21:03:12 | 显示全部楼层
老师傅的东西  不错  谢谢分享     我们这个国家就缺乏  在实践第一线 写出自己的经验与总结  这个对于后人来说  那是财富

出0入0汤圆

发表于 2016-1-17 21:04:56 | 显示全部楼层
一直在关注你哦

出0入0汤圆

发表于 2016-2-2 11:35:11 | 显示全部楼层
很详细,值得收藏的好贴

出0入0汤圆

发表于 2016-2-5 08:54:49 | 显示全部楼层
mark!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2016-2-17 20:35:09 | 显示全部楼层
mark,学习一下。

出0入0汤圆

发表于 2016-2-17 21:35:11 | 显示全部楼层
mark               

出0入0汤圆

发表于 2016-2-20 11:44:27 | 显示全部楼层
学习了,收藏!

出0入0汤圆

发表于 2016-2-20 16:19:41 | 显示全部楼层
太犀利了,佩服

出0入0汤圆

发表于 2016-2-24 09:05:31 | 显示全部楼层
原先说的今年出书,已经是猴年,难道要马月才出书?,等了半年了

出0入0汤圆

发表于 2016-3-15 12:49:04 | 显示全部楼层
学习了,谢谢老师

出0入0汤圆

发表于 2016-3-19 11:20:18 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2016-3-23 14:26:09 | 显示全部楼层
不错,学习下。

出0入0汤圆

发表于 2016-3-23 16:04:35 | 显示全部楼层
只恨看到太晚

出0入0汤圆

发表于 2016-3-24 15:33:44 | 显示全部楼层
多谢大师的帮助入门

出0入0汤圆

发表于 2016-5-1 22:04:25 | 显示全部楼层
支持 学到很多东西

出0入0汤圆

发表于 2016-6-4 10:48:16 | 显示全部楼层
谢谢楼主这么好的文章,静下心来学习

出0入0汤圆

发表于 2016-6-6 15:08:30 | 显示全部楼层
很好的资料,现在看正是适合

出0入0汤圆

发表于 2016-6-8 21:16:49 | 显示全部楼层
吴坚鸿 发表于 2015-12-20 01:37
我现在还一直在做单片机开发,最近在做stm32F407和FPGA的开发,在做数控机器人系统,运动卡这类的项目。 ...

国内的运动控制卡好像是固高的比较好,杰美康的次之。

出0入0汤圆

发表于 2016-6-16 09:28:56 | 显示全部楼层
mark                           

出0入0汤圆

发表于 2016-6-16 09:29:16 | 显示全部楼层
mark                     

出0入0汤圆

发表于 2016-6-21 11:54:43 | 显示全部楼层
赞一个----收藏了

出0入0汤圆

发表于 2016-6-21 17:28:13 | 显示全部楼层
楼主看来也是技术达人,热心分享,感谢感谢!

出0入4汤圆

发表于 2016-8-2 15:20:32 | 显示全部楼层
看了几个例子,有一些方法还是比较巧妙的

出0入0汤圆

发表于 2016-8-5 23:51:55 | 显示全部楼层
楼主好人,学习了

出0入0汤圆

发表于 2016-8-6 16:56:25 | 显示全部楼层
支持一下!很用心的教程啊!

出0入0汤圆

发表于 2016-8-10 08:37:10 | 显示全部楼层
谢谢分享,谢谢

出0入0汤圆

发表于 2016-8-11 14:07:58 | 显示全部楼层
Mark一下!

出0入0汤圆

发表于 2016-8-17 21:02:29 | 显示全部楼层
高手 值得学习

出0入0汤圆

发表于 2016-8-24 11:51:15 | 显示全部楼层
做个记号,  拜读!

出0入0汤圆

发表于 2016-8-25 19:29:45 | 显示全部楼层
真是很棒的教程

出0入0汤圆

发表于 2016-8-27 13:12:08 | 显示全部楼层
支持,对于新人还是有点深奥了。

出0入0汤圆

发表于 2016-8-27 16:16:15 | 显示全部楼层
楼主出书吧,这样的好东西应该得到回报,我们也看得方便些。

出0入0汤圆

发表于 2016-8-27 19:14:24 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2016-8-30 15:47:08 | 显示全部楼层
受教了,想要打赏,没有莫元……

出0入0汤圆

发表于 2016-9-1 21:09:21 | 显示全部楼层
其实已经等LZ的书等了1年多了

出0入0汤圆

发表于 2016-9-6 16:18:00 | 显示全部楼层
吴坚鸿 发表于 2014-3-10 20:29
第三十三节:能设置速度档位的数码管倒计时程序。

开场白:

最近从新来阿莫论坛,偶遇你的这篇文章,给我的帮助很大,我正在一节一节的看你的文章!受益匪浅!谢谢!

出0入0汤圆

发表于 2016-9-17 13:13:44 | 显示全部楼层
支持一个

出0入0汤圆

发表于 2016-11-11 21:11:43 | 显示全部楼层
吴坚鸿 发表于 2014-3-10 11:30
第四节:累计定时中断次数使LED灯闪烁。

开场白:

你好,吴老师,我照着第四节,抄写了一遍程序,但是proteus仿真功能不行哦,不知道哪里出错了。

出0入0汤圆

发表于 2016-12-5 17:23:19 | 显示全部楼层
一定要坚持一下,谢谢分享 佩服!

出0入0汤圆

发表于 2016-12-25 20:53:20 | 显示全部楼层
我怎么当时学会了,也理解了,可是过段时间就又会忘记了,还要重头理解,你们呢?

出0入0汤圆

发表于 2017-1-7 08:58:05 | 显示全部楼层
不错顶一下

出0入0汤圆

发表于 2017-2-6 11:49:09 | 显示全部楼层
多向你学习

出0入0汤圆

发表于 2017-3-28 19:35:53 | 显示全部楼层
写的很好,值得学习!

出0入0汤圆

发表于 2017-7-17 07:02:50 | 显示全部楼层
对初学者建立一个良好的编程思想的作用太大了

出0入0汤圆

发表于 2017-7-18 07:42:34 | 显示全部楼层
本帖最后由 sctwp 于 2017-7-18 11:27 编辑

删除的理由是自己理解错误

出0入0汤圆

发表于 2017-7-18 15:14:55 | 显示全部楼层
楼主擅于总结,也乐于分享,值的我们学习,我做单片机也做了十几年,看了前几篇,思路很像

出0入0汤圆

发表于 2017-10-9 15:15:26 | 显示全部楼层
好东西,谢谢楼主呕心沥血

出0入0汤圆

发表于 2017-10-11 20:54:40 | 显示全部楼层

写的很好,值得学习!

出0入0汤圆

发表于 2017-11-4 09:28:26 | 显示全部楼层
好资料,顶个,谢谢楼主

出0入0汤圆

发表于 2017-11-4 11:03:20 | 显示全部楼层
程序框架

出0入0汤圆

发表于 2017-12-23 23:46:14 | 显示全部楼层
留个位,有时间来座。

出0入0汤圆

发表于 2018-5-16 10:51:58 | 显示全部楼层
学习了第83节-85节的内容,很好的解决了问题,感谢楼主分享这么好的东西

出350入8汤圆

发表于 2018-5-16 11:46:50 | 显示全部楼层
支持一下!

出0入0汤圆

发表于 2018-5-17 13:19:03 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2018-5-21 14:48:10 | 显示全部楼层
不错!支持一下!

出0入0汤圆

发表于 2018-5-23 19:59:53 | 显示全部楼层
想问下一般字模生成软件都是生成16*16形式的字模数组,24*24形式或是32*32形式是怎么生成的?

出200入0汤圆

发表于 2018-5-23 20:59:59 来自手机 | 显示全部楼层
标记一下,有时间好好拜读一下

出0入0汤圆

发表于 2018-5-26 15:00:50 | 显示全部楼层
sidu320 发表于 2018-5-23 19:59
想问下一般字模生成软件都是生成16*16形式的字模数组,24*24形式或是32*32形式是怎么生成的? ...

已经找到方法了,用字模Ⅲ-增强版 修改字体就可以了达到不同点阵的字模了,软件从简单使用到摸索着使用,真的要感谢作者,提供了便利。

出50入0汤圆

发表于 2018-5-26 15:12:26 | 显示全部楼层
很久没有更新文章了啊。

出0入0汤圆

发表于 2018-5-27 14:42:01 | 显示全部楼层
好东西先收藏,谢谢楼主分享

出0入0汤圆

发表于 2018-8-20 09:42:19 | 显示全部楼层
好东西,从里面学到了不少知识,感谢楼主

出0入4汤圆

发表于 2018-8-23 12:14:43 | 显示全部楼层
可以来学习下了,很不错的

出0入8汤圆

发表于 2018-8-23 13:30:27 | 显示全部楼层
之前学单片机的时候买过楼主的书,好像书中没有提到过状态机轮询等相关概念,只有中断概念,后要看马潮老师的书才知道了状态机,看时间触发系统才明白了轮询是什么,从此眼界大开。

出0入0汤圆

发表于 2018-8-28 20:43:23 | 显示全部楼层
不得不说有些程序真的很好用,谢谢。

出0入0汤圆

发表于 2018-9-12 05:49:56 | 显示全部楼层
感謝你的付出,讓大家學習

出0入0汤圆

发表于 2018-9-18 14:56:33 | 显示全部楼层
支持一下,有时间看看,肯定能学到不少东西。

出0入0汤圆

发表于 2018-9-28 17:01:24 | 显示全部楼层
好东西,谢谢楼主的分享!!!!!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2018-9-29 17:02:44 | 显示全部楼层
很精彩的学习资料,谢谢楼主的分享

出0入0汤圆

发表于 2018-10-1 00:45:13 | 显示全部楼层
楼主好人,心得分享,值得称赞!

出0入0汤圆

发表于 2018-12-9 20:50:37 | 显示全部楼层
影响最深的是:年轻时也不愿意把自己积累的经验跟外人说。到了一定时候觉得还是要授之以人。谢谢。

出0入0汤圆

发表于 2019-1-4 17:31:00 | 显示全部楼层
有潜力成为下一个郭天祥
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 17:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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