独闷闷网

 找回密码
 立即注册
搜索
查看: 164244|回复: 207
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
#
发表于 2013-12-17 15:40:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2016-5-15 20:18 编辑

      大家好,我是吴坚鸿。
      坚鸿51学习板原理图: 坚鸿51学习板(第三版).pdf (905.66 KB, 下载次数: 7490)
































第三十二节:数码管中的倒计时程序。

第三十三节:能设置速度档位的数码管倒计时程序。

第三十四节:在数码管中实现iphone4S开机密码锁的程序。

第三十五节:带数码管显示的象棋比赛专用计时器。

第三十六节:带数码管显示的加法简易计算器。

第三十七节:数码管作为仪表盘显示跑马灯的方向,速度和运行状态。

第三十八节:判断数据尾来接收一串数据的串口通用程序框架。

第三十九节:判断数据头来接收一串数据的串口通用程序框架。

第四十节:常用的自定义串口通讯协议。

第四十一节:在串口接收中断里即时解析数据头的特殊程序框架。

第四十二节:通过串口用delay延时方式发送一串数据。

第四十三节:通过串口用计数延时方式发送一串数据。

第四十四节:从机的串口收发综合程序框架

第四十五节:主机的串口收发综合程序框架

第四十六节:利用AT24C02进行掉电后的数据保存。

第四十七节:操作AT24C02时,利用“一气呵成的定时器延时”改善数码管的闪烁现象。

第四十八节:利用DS1302做一个实时时钟  。

第四十九节:利用DS18B20做一个温控器  。

第五十节:利用ADC0832采集电压信号,用平均法和区间法进行软件滤波处理。

第五十一节:利用ADC0832采集电压信号,用连续N次一致性的方法进行滤波处理。

第五十二节:程序后续升级修改的利器,return语句鲜为人知的用法。

第五十三节:指针的第一大好处,让一个函数可以封装多个相当于return语句返回的参数。

第五十四节:指针的第二大好处,指针作为数组在函数中的输入接口。

第五十五节:指针的第三大好处,指针作为数组在函数中的输出接口。

第五十六节:指针的第四大好处,指针作为数组在函数中的输入输出接口。

第五十七节:为指针加上紧箍咒const,避免意外修改了只做输入接口的数据。

第五十八节:指针的第五大好处,指针在众多数组中的中转站作用。

第五十九节:串口程序第40,44,45节中存在一个bug,特此紧急公告。

第六十节:用关中断和互斥量来保护多线程共享的全局变量。

第六十一节:组合BCD码,非组合BCD码,以及数值三者之间的相互转换和关系。

第六十二节:大数据的加法运算。

第六十三节:大数据的减法运算。

第六十四节:大数据的乘法运算。

第六十五节:大数据的除法运算。

第六十六节:单片机外部中断的基础。

第六十七节:利用外部中断实现模拟串口数据的收发。

第六十八节:单片机C语言的多文件编程技巧。

第六十九节:使用static关键字可以减少全局变量的使用

第七十节:深入讲解液晶屏的构字过程。

第七十一节:液晶屏的字符,16点阵,24点阵和32点阵的显示程序。

第七十二节:在液晶屏中把字体顺时针旋转90度显示的算法程序。

第七十三节:在液晶屏中把字体镜像显示的算法程序。

第七十四节:在液晶屏中让字体可以跨区域无缝对接显示的算法程序。

第七十五节:在12864液晶屏中让字体以1个点阵为单位进行移动显示的算法程序。

第七十六节:如何把一个任意数值的变量显示在液晶屏上。

第七十七节:在1个窗口里通过移动光标来设置不同参数的液晶屏菜单程序。

第七十八节:在多个窗口里通过移动光标来设置不同参数的液晶屏菜单程序。

第七十九节:通过主菜单移动光标来进入子菜单窗口的液晶屏程序。

第八十节:调用液晶屏内部字库来显示汉字或字符的坐标体系和本质。

第八十一节:液晶屏显示串口发送过来的任意汉字和字符。

第八十二节:如何通过调用液晶屏内部字库把一个任意数值的变量显示出来。

第八十三节:矩阵键盘输入任意数字或小数点的液晶屏显示程序。

第八十四节:实时同步把键盘输入的BCD码数组转换成数值的液晶屏显示程序。

第八十五节:实时同步把加减按键输入的数值转换成BCD码数组的液晶屏显示程序。

第八十六节:数字键盘与液晶菜单的综合程序。

第八十七节:郑文显捐赠的工控项目源代码。

第八十八节:电子称连续不断从串口对外发送数据,单片机靠关键字快速截取有效数据串。

第八十九节:用单片机内部定时器做一个时钟。

第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。
乐于分享,勇于质疑!
206#
发表于 2016-2-26 17:06:52 | 只看该作者
jianhong_wu 发表于 2014-4-6 12:27
第三十九节:判断数据头来接收一串数据的串口通用程序框架。

开场白:

鸿哥,单片机在接收串口数据时丢失第一位字节,是就没收到还是收到的是错误的啊?您的程序中好像没判断第1位00这个无效填充字节啊?
乐于分享,勇于质疑!
205#
 楼主| 发表于 2015-11-28 01:24:12 | 只看该作者
本帖最后由 jianhong_wu 于 2015-11-28 14:32 编辑

第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。
         我今天在做数控三轴运动卡的项目时,正在考虑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年从头开始重写一次此连载,融入我最新的技术理解,在原来的基础上进一步提炼和补充)

乐于分享,勇于质疑!
204#
 楼主| 发表于 2015-11-27 22:55:55 | 只看该作者
yaoxihua37 发表于 2015-11-27 12:26
堂主,把74HC595驱动程序翻译成类似单片机IO口直接驱动的方式,从那一段程序看出来是直接驱动啦?感觉跟 ...

我本人以后不在此论坛里解答网友的问题,有问题请加我的私人QQ群,我会在群里解答各网友遇到的问题,QQ群号是:184876577
乐于分享,勇于质疑!
203#
发表于 2015-11-27 12:26:19 | 只看该作者
jianhong_wu 发表于 2014-1-29 13:21
第十八节:把74HC595驱动程序翻译成类似单片机IO口直接驱动的方式。

开场白:

堂主,把74HC595驱动程序翻译成类似单片机IO口直接驱动的方式,从那一段程序看出来是直接驱动啦?感觉跟上节程序没两样呢
乐于分享,勇于质疑!
202#
发表于 2015-10-29 11:19:26 | 只看该作者
jianhong_wu 发表于 2013-12-17 15:48
第五节:蜂鸣器的驱动程序。

开场白:

蜂鸣器的长叫 短叫程序,很受到启发!!!
乐于分享,勇于质疑!
201#
 楼主| 发表于 2015-4-15 15:18:57 | 只看该作者
清风明月 发表于 2015-4-15 11:52
EA=1; //允许中断
delay_timer(2); //一气呵成的定时器延时方式,在延时的时候还可以动态扫描数码管

...

可以。但是闪烁的现象会严重一点,相对没有delay_timer(2)的效果好。
乐于分享,勇于质疑!
200#
发表于 2015-4-15 11:52:19 | 只看该作者
jianhong_wu 发表于 2014-5-15 12:55
第四十七节:操作AT24C02时,利用“一气呵成的定时器延时”改善数码管的闪烁现象。

开场白:

EA=1; //允许中断
delay_timer(2); //一气呵成的定时器延时方式,在延时的时候还可以动态扫描数码管

鸿哥此处的delay_timer(2);应该可以用上一节的的delay_short(800); 代替吧??
乐于分享,勇于质疑!
199#
发表于 2015-4-2 21:17:24 | 只看该作者
谢谢分享,顶顶顶。。。。
乐于分享,勇于质疑!
198#
发表于 2015-3-4 21:46:59 | 只看该作者
期待新的技术贴~
乐于分享,勇于质疑!
197#
 楼主| 发表于 2015-3-4 18:09:11 | 只看该作者

感谢好评。
乐于分享,勇于质疑!
196#
发表于 2015-3-4 15:46:39 | 只看该作者
跟着鸿哥的脚步成长。
乐于分享,勇于质疑!
195#
发表于 2015-3-4 10:48:42 | 只看该作者
非常精彩。
乐于分享,勇于质疑!
回复

使用道具 举报

194#
发表于 2015-3-3 11:11:08 | 只看该作者
太好了,谢谢楼主的辛苦总结。
乐于分享,勇于质疑!
193#
 楼主| 发表于 2015-2-11 15:07:52 | 只看该作者
又一个暑假 发表于 2015-2-11 14:57
鸿哥后面会有PID控制算法的章节吗

我没有搞过PID的项目。这个帖子暂时不更新了。我2015年的重点准备放在新开的基础入门帖。
乐于分享,勇于质疑!
192#
发表于 2015-2-11 14:57:52 | 只看该作者
jianhong_wu 发表于 2015-1-14 22:52
最近大家都挺忙。

鸿哥后面会有PID控制算法的章节吗
乐于分享,勇于质疑!
191#
发表于 2015-2-2 11:37:40 | 只看该作者
鸿哥好久没更新了。。。
乐于分享,勇于质疑!
190#
发表于 2015-1-29 11:57:28 | 只看该作者
jianhong_wu 发表于 2015-1-29 10:46
猜测要大概200次定时中断的时间等于1秒钟。当然你也可以猜测大概300次定时中断的时间等于1秒钟,,这个都 ...

懂了,,谢谢鸿哥
乐于分享,勇于质疑!
189#
 楼主| 发表于 2015-1-29 10:46:56 | 只看该作者
fzwwj95 发表于 2015-1-28 22:59
在程序代码上先写入1秒钟大概需要200个定时中断

这个跟么意思?

猜测要大概200次定时中断的时间等于1秒钟。当然你也可以猜测大概300次定时中断的时间等于1秒钟,,这个都不重要,因为最后还要经过校验来修正这个次数的。
乐于分享,勇于质疑!
188#
发表于 2015-1-28 22:59:10 | 只看该作者
jianhong_wu 发表于 2013-12-17 15:48
第五节:蜂鸣器的驱动程序。

开场白:

在程序代码上先写入1秒钟大概需要200个定时中断

这个跟么意思?
乐于分享,勇于质疑!
187#
发表于 2015-1-28 15:58:13 | 只看该作者
好,我等学习了
乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-5-3 15:31 , Processed in 0.214985 second(s), 21 queries .

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