初学单片机之子函数含参调用,及利用C51库函数的循环移位函数实现流水灯的设计
时间:10-02
整理:3721RD
点击:
以下参考自郭天祥的单片机教程
程序如下:
程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int //这里unsigned int所表示的范围是0-65535
- #define uchar unsigned char //这里unsigned char所表示的范围是0-255
- uint i,j;
- uchar aa;
- void main()
- {
- aa=0xfe;
- while(1)
- {
- P1=aa;
- for(i=1000;i>0;i--);
- for(j=110;j>0;j--);
- aa=_crol_(aa,1);
- }
- }
- #include <reg52.h> //声明一些寄存器的地址
- #include <intrins.h> //包含头文件
- #define uint unsigned int //宏定义
- #define uchar unsigned char //宏定义
- uint i,j; //i,j的范围是0-65535
- uchar aa; //aa的范围是0-255
- void delay_1s(); // 声明延时函数
- void main()
- {
- aa=0xfe; //0xfe=11111110B,0x是十六进制的前缀
- while(1)
- {
- P1=aa;
- delay_1s(); //调用延时函数
- aa=_crol_(aa,1);
- }
- }
- void delay_1s() //延时函数,延时时间为1s
- {
- for(i=1000;i>0;i--);
- for(j=110;j>0;j--);
- }
- 上面的这个程序中
- while(1)
- {
- P1=aa;
- delay_1s();
- aa=_crol_(aa,1);
- }
- 实现的是循环移位功能,也就是流水灯的核心程序。首先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语言编程用不到,呵呵,学习下也无妨^-^
总算把前两章学完了,主要是讲一些控制二极管点亮的知识。
这个也不错
呵呵,见笑了
顶一下呵呵
看看
学习了!
移位那个直接用移位运算吧,乘法对于单片机来说运算会比较慢