(二)重拾单片机 第一天 LED灯
由图知道 低电平 亮,高电平 灭
控制第一个 LED1 亮灭程序代码,如下
#include<reg52.h> #define uchar8 unsigned char #define uint16 unsigned int sbit LED1=P1^0; /*****************************/ // 函数名称: DelayMS( ) // 函数功能: 延时 // 入口函数: 延时毫秒 // 出口函数: 无 /********* *******************/ void DelayMS(uint16 val) { uint16 i,j; for(i=0;i<val;i++) for(j=0;j<113;j++); } void main() { while(1) { LED1=0; DelayMS(1000); LED1=1; DelayMS(1000); } }
__________________________________________________________________________________________________________________________
流水灯程序代码:
#include<reg52.h> #include<intrins.h> #define uchar8 unsigned char #define uint16 unsigned int #define LED P1 /*****************************/ // 函数名称: DelayMS( ) // 函数功能: 延时 // 入口函数: 延时毫秒 // 出口函数: 无 /********* *******************/ void DelayMS(uint16 val) { uint16 i,j; for( i=0;i<val;i++) for(j=0;j<113;j++); } void main() { int i; while(1) { LED=0xff ; // 这里端口全被设置为 1111 1111 ,相当于 全灭 for(i=0;i<8;i++) { LED=LED<<1; // 选择了左移循环 DelayMS(1000); } } }
1、2亮
1、2、3亮
1、2、3、4亮
。。。。。。
1、2、3。。。。。8 全部亮
________________________________________________________________________________________________________________
跑马灯程序代码:
#include<reg52.h> #include<intrins.h> #define uchar8 unsigned char #define uint16 unsigned int #define LED P1 /*****************************/ // 函数名称: DelayMS( ) // 函数功能: 延时 // 入口函数: 延时毫秒 // 出口函数: 无 /********* *******************/ void DelayMS(uint16 val) { uint16 i,j; for( i=0;i<val;i++) for(j=0;j<113;j++); } void main() { LED =0xfe; while(1) { LED=_crol_(LED,1); DelayMS(1000); } }
只有一个LED灯 亮。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
程序目标: 实现LED跑马灯 先从左向右移动,后从右向左移动,循环往复
方案一: 数组的字节操作
#include<reg52.h> #define uchar8 unsigned char #define uint16 unsigned int #define LED P1 uchar8 code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe} ; /*****************************/ // 函数名称: DelayMS( ) // 函数功能: 延时 // 入口函数: 延时毫秒 // 出口函数: 无 /************************* *******************/ void DelayMs(uint16 val) { uint16 i,j; for( i=0;i<val;i++) for(j=0;j<113;j++); } void main() { int i; while(1) { for(i=0;i<16;i++) { LED=tab[i]; DelayMs(1000); } } }
方案二: 移位运算符的实现
#include<reg52.h> #define uchar8 unsigned char #define uint16 unsigned int #define LED P1 /*****************************/ // 函数名称: DelayMS( ) // 函数功能: 延时 // 入口函数: 延时毫秒 // 出口函数: 无 /************************* *******************/ void DelayMs(uint16 val) { uint16 i,j; for( i=0;i<val;i++) for(j=0;j<113;j++); } void main() { int i; uchar8 temp; while(1) { temp=0x01; // 0000 0001 for(i=0;i<8;i++) { LED= ~temp; DelayMs(1000); temp=temp<<1; } temp=0x80; // 1000 0000 for(i=0;i<8;i++) { LED= ~temp; DelayMs(1000); temp=temp>>1; } } }
方案三:运用循环左右移函数来实现
#include<reg52.h> #include<intrins.h> #define uchar8 unsigned char #define uint16 unsigned int #define LED P1 /*****************************/ // 函数名称: DelayMS( ) // 函数功能: 延时 // 入口函数: 延时毫秒 // 出口函数: 无 /************************* *******************/ void DelayMs(uint16 val) { uint16 i,j; for( i=0;i<val;i++) for(j=0;j<113;j++); } void main() { int i; uchar8 temp; while(1) { temp=0xfe; // 1111 1110 for(i=0;i<7;i++) // 注意这里i<7 ,不再是 i<8 { LED= temp; DelayMs(1000); temp=_crol_(temp,1); // 执行左移函数,将 temp 中的函数循环左移一位 } for(i=0;i<7;i++) { LED= temp; DelayMs(1000); temp=_cror_(temp,1); // 右移函数 } } }