微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 初学单片机之子函数含参调用,及利用C51库函数的循环移位函数实现流水灯的设计

初学单片机之子函数含参调用,及利用C51库函数的循环移位函数实现流水灯的设计

时间:10-02 整理:3721RD 点击:
以下参考自郭天祥的单片机教程
程序如下:

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int //这里unsigned int所表示的范围是0-65535
  4. #define uchar unsigned char //这里unsigned char所表示的范围是0-255
  5. uint i,j;
  6. uchar aa;
  7. void main()
  8. {
  9. aa=0xfe;
  10. while(1)
  11. {
  12. P1=aa;
  13. for(i=1000;i>0;i--);
  14. for(j=110;j>0;j--);
  15. aa=_crol_(aa,1);
  16. }
  17. }

复制代码

上面这个程序中的延时子函数改成函数调用的形式如下:

  1. #include <reg52.h> //声明一些寄存器的地址
  2. #include <intrins.h> //包含头文件
  3. #define uint unsigned int //宏定义
  4. #define uchar unsigned char //宏定义
  5. uint i,j; //i,j的范围是0-65535
  6. uchar aa; //aa的范围是0-255
  7. void delay_1s(); // 声明延时函数
  8. void main()
  9. {
  10. aa=0xfe; //0xfe=11111110B,0x是十六进制的前缀
  11. while(1)
  12. {
  13. P1=aa;
  14. delay_1s(); //调用延时函数
  15. aa=_crol_(aa,1);
  16. }
  17. }
  18. void delay_1s() //延时函数,延时时间为1s
  19. {
  20. for(i=1000;i>0;i--);
  21. for(j=110;j>0;j--);
  22. }
  23. 上面的这个程序中
  24. while(1)
  25. {
  26. P1=aa;
  27. delay_1s();
  28. aa=_crol_(aa,1);
  29. }


  30. 实现的是循环移位功能,也就是流水灯的核心程序。首先P1输出口的电平初始化设置为P1=aa=0xfe=11111110,第零位设置为零那么实现的就是第一个发光二极管被点亮,然后是调用延时函数延时1s后,程序执行aa=_crol_(aa,1),在这里_crol_()函数的功能是循环左移位,aa=_crol_(aa,1)就是把aa循环左移一位后的值赋给aa这样P1=aa=11111101,此时第二个发光二极管被点亮,同时第一个背熄灭了,第二个发光二极管点亮的时间是1s,之后是第三个发光二极管被点亮,同时第二个熄灭,就这样一直循环下去,形成了流水灯的效果。

复制代码

书上还讲了一下PSW寄存器,呵呵,这就是汇编的知识了,幸好以前学过一点8086的一些知识,理解起来也比较容易,psw寄存器是一个标志寄存器,是一个8位的寄存器,作用是用来存放运算结果的状态,好像汇编中也有一个这样的寄存器,不过忘了。



CY是进位标志位,这个跟8086 CF应该是一样的,就是如果两个数运算又借位或进位的话CF位=1,反之则等于0,

AC 是辅助进位标志位,这个跟8086 AF应该是一样的,如果两个数运算,低三位向高四位有进位的话AF=1,反之则等于0

OV 是溢出标志位这个跟8086 OF应该是一样的,两个数运算如果运算结果超出了,寄存器能表示的范围,那就是溢出了,这时OF=1。

P 是奇偶标志位这个跟8086 PF应该是一样的,当运算结果中1的个数是奇数个时 PF=1

RS1 ,RS0是人为设置的位,用来选择哪些寄存器是当前工作的(呵呵,还没学到^-^)

F0 控制程序的流向.这个应该类似于汇编中的cld指令控制向哪个方向吧(嘿嘿,个人理解)

这些东西书上说c语言编程用不到,呵呵,学习下也无妨^-^

总算把前两章学完了,主要是讲一些控制二极管点亮的知识。



这个也不错

呵呵,见笑了

顶一下呵呵

看看

学习了!

移位那个直接用移位运算吧,乘法对于单片机来说运算会比较慢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top