zgkiyn

    1. 预售10台双极性五位半交直流电压源 2/461 信息发布 2019-03-12
      预售双极性五位半交直流电压源
    2. 预售10台双极性五位半交直流电压源 2/461 信息发布 2019-03-11
      预售双极性五位半交直流电压源
    3. 诚找合作:有大批量高要求设备开发和生产需求的合作单位
    4. 诚找合作:有大批量高要求设备开发和生产需求的合作单位
    5. 诚找合作:有大批量高要求设备开发和生产需求的合作单位
    6. 诚找合作:有大批量高要求设备开发和生产需求的合作单位
    7. 诚找合作:有大批量高要求设备开发和生产需求的合作单位
    8. 诚找合作:有大批量高要求设备开发和生产需求的合作单位
    9. 诚找合作:有大批量高要求设备开发和生产需求的合作单位
    10. 第六十九节:使用static关键字可以减少全局变量的使用。 开场白: 本来这一节打算开始讲液晶屏的,但是昨天经过网友“任军”的点拨,我发现了一个惊天秘密,原来static关键字是这么好的东西我却错过了那么多年。以前就有一些网友抱怨,鸿哥的程序好是好,就是全局变量满天飞,当时我觉得我也没招呀,C语言就全局变量和局部变量,单单靠局部变量肯定不行,局部变量每次进入函数内部数值都会被初始化改变,所以我在很多场合也只能靠全局变量了。但是自从昨天知道了static关键字的秘密后,我恍然大悟,很多场合只要在局部变量前面加上static关键字,就可以大大减少全局变量的使用了。 这一节要教会大家一个知识点:   大家都知道,普通的局部变量在每次程序执行到函数内部的时候,数值都会被重新初始化,数值会发生变化,不能保持之前的数值。但是在局部变量加上static关键字后,系统在刚上电的时候就已经把带static的局部变量赋初始值了,从此程序每次进入函数内部,都不会初始化带static关键字的局部变量,它会保持最近一次被程序执行更改的数值不变,像全局变量一样。跟全局变量唯一的差别是,带static关键字的局部变量的作用域仅仅在函数内部,而普通全局变量的作用域是整个工程。 本程序例程是直接在第八节程序上修改,大大减少了全局变量的使用。具体内容,请看源代码讲解。 (1)硬件平台:      基于朱兆祺51单片机学习板。用矩阵键盘中的S1和S5号键作为独立按键,记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。 (2)实现功能:跟前面第八节的功能一模一样,有两个独立按键,每按一个独立按键,蜂鸣器发出“滴”的一声后就停。     (3)源代码讲解如下:
    11. #include "REG52.H" #define const_voice_short  40   //蜂鸣器短叫的持续时间 #define const_rc_size  10  //接收串口中断数据的缓冲区数组大小 #define const_receive_time  5  //如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小 void initial_myself(void);    void initial_peripheral(void); void delay_long(unsigned int uiDelaylong); void T0_time(void);  //定时中断函数 void usart_receive(void); //串口接收中断函数 void usart_service(void);  //串口服务程序,在main函数里 sbit beep_dr=P2^7; //蜂鸣器的驱动IO口 unsigned int  uiSendCnt=0;     //用来识别串口是否接收完一串数据的计时器 unsigned char ucSendLock=1;    //串口服务程序的自锁变量,每次接收完一串数据只处理一次 unsigned int  uiRcregTotal=0;  //代表当前缓冲区已经接收了多少个数据 unsigned char ucRcregBuf[const_rc_size]; //接收串口中断数据的缓冲区数组 unsigned int  uiRcMoveIndex=0;  //用来解析数据协议的中间变量 unsigned int  uiVoiceCnt=0;  //蜂鸣器鸣叫的持续时间计数器 void main()   {    initial_myself();      delay_long(100);       initial_peripheral();    while(1)      {        usart_service();  //串口服务程序    } } void usart_service(void)  //串口服务程序,在main函数里 {          /* 注释一: * 识别一串数据是否已经全部接收完了的原理: * 在规定的时间里,如果没有接收到任何一个字节数据,那么就认为一串数据被接收完了,然后就进入数据协议 * 解析和处理的阶段。这个功能的实现要配合定时中断,串口中断的程序一起阅读,要理解他们之间的关系。 */      if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来      {             ucSendLock=0;    //处理一次就锁起来,不用每次都进来,除非有新接收的数据                     //下面的代码进入数据协议解析和数据处理的阶段                     uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动 /* 注释二: * 判断数据头,进入循环解析数据协议必须满足两个条件: * 第一:最大接收缓冲数据必须大于一串数据的长度(这里是5。包括2个有效数据,3个数据头) * 第二:游标uiRcMoveIndex必须小于等于最大接收缓冲数据减去一串数据的长度(这里是5。包括2个有效数据,3个数据头) */             while(uiRcregTotal>=5&&uiRcMoveIndex
    12. 带负载测试视频 http://v.qq.com/page/k/8/7/k0148yodi87.html
    13. 编程精度最新测试 http://v.qq.com/page/a/y/r/a0148hrqcyr.html
    14. 不管怎么样还是多感谢楼主无私的奉献,谢谢了

最近访客

< 1/1 >

统计信息

已有16人来访过

  • 芯积分:5
  • 好友:--
  • 主题:4
  • 回复:15

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言