本帖最后由 51armfpga 于 2014-6-22 21:48 编辑
5. 实验二(流水灯)
原理图与实验一样,实现的效果是流水,程序源码如下:#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 /*----------------------------------------------- 延时子程序 ------------------------------------------------*/ void delay(unsigned int cnt) { while(--cnt); } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { P1=0xFE; //给初始化值 换算成二进制是1111 1110 while(1) { delay(30000); //延时程序 P1<<=1; //左移一位 该语句等效于 P1=P1<<1 P1|=0x01; //最后一位补1,该语句等效于P1=P1|0x01 符号"|"表示"或" if(P1==0x7f) //检测是否移到最左端?"=="表示检测符号2端的值是否相等 { delay(30000); P1=0xFE; //重新赋值 } } } 6. 实验三(花样灯)花样灯一般有两种方法实现: 1、程序循环执行。 2、查表法。这里我们两种都使用一下。
程序源码如下所示: #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include <reg52.h> /******************************************************************/ /* 花样表格 */ /******************************************************************/ unsignedchar codeseg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加 /******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay(unsigned int cnt)//简易延时 { while(--cnt); } /******************************************************************/ /* 主函数 */ /******************************************************************/ main() { unsignedchar i; while(1) { P1=0xFE; //第一个LED亮,然后右移 for(i=0;i<8;i++) { delay(10000); P1<<=1; } P1=0x7F; //第七个LED亮,然后左移 for(i=0;i<8;i++) { delay(10000); P1>>=1; } P1=0xFE; //第一个LED亮,右移,移过之后小灯灭 for(i=0;i<8;i++) { delay(10000); P1<<=1; P1|=0x01; } P1=0x7F; //第七个LED亮,左移,移过之后小灯灭 for(i=0;i<8;i++) { delay(10000); P1>>=1; P1|=0x80; } /*下面通过查表方法获得花样参数*/ for(i=0;i<16;i++)//查表可以简单的显示各种花样实用性更强 { delay(20000); P1=seg; } } } 7. 课后作业 根据前面三个实验,利用两个红灯,两个黄灯,两个绿灯,实现十字路**通灯的切换过程与显示效果。 |