(二)重拾单片机 第一天 LED灯

时间:2024-04-23 18:27:39

(二)重拾单片机 第一天 LED灯

(二)重拾单片机 第一天 LED灯

由图知道 低电平 亮,高电平 灭

控制第一个 LED1 亮灭程序代码,如下

#include<reg52.h>
#define uchar8 unsigned char
#define uint16 unsigned int
sbit LED1=P1^;
/*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/********* *******************/
void DelayMS(uint16 val)
{
uint16 i,j;
for(i=;i<val;i++)
for(j=;j<;j++); } void main()
{ while()
{
LED1=;
DelayMS();
LED1=;
DelayMS(); } }

__________________________________________________________________________________________________________________________

流水灯程序代码:

#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=;i<val;i++)
for(j=;j<;j++); } void main()
{ int i; while()
{
LED=0xff ; // 这里端口全被设置为 1111 1111 ,相当于 全灭 for(i=;i<;i++)
{ LED=LED<<; // 选择了左移循环
DelayMS(); } } }

(二)重拾单片机 第一天 LED灯

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=;i<val;i++)
for(j=;j<;j++); } void main()
{ LED =0xfe; while()
{
LED=_crol_(LED,);
DelayMS(); } }

只有一个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=;i<val;i++)
for(j=;j<;j++); } void main()
{ int i; while()
{ for(i=;i<;i++)
{ LED=tab[i];
DelayMs(); } } }

方案二: 移位运算符的实现

#include<reg52.h>
#define uchar8 unsigned char
#define uint16 unsigned int
#define LED P1 /*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/************************* *******************/
void DelayMs(uint16 val)
{
uint16 i,j;
for( i=;i<val;i++)
for(j=;j<;j++); } void main()
{ int i;
uchar8 temp; while()
{ temp=0x01; // 0000 0001
for(i=;i<;i++)
{
LED= ~temp;
DelayMs();
temp=temp<<; } temp=0x80; // 1000 0000
for(i=;i<;i++)
{
LED= ~temp;
DelayMs();
temp=temp>>; } } }

方案三:运用循环左右移函数来实现

#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=;i<val;i++)
for(j=;j<;j++); } void main()
{ int i;
uchar8 temp; while()
{ temp=0xfe; // 1111 1110
for(i=;i<;i++) // 注意这里i<7 ,不再是 i<8
{
LED= temp;
DelayMs();
temp=_crol_(temp,); // 执行左移函数,将 temp 中的函数循环左移一位 } for(i=;i<;i++)
{
LED= temp;
DelayMs();
temp=_cror_(temp,); // 右移函数 } } }