单片机点灯程序参考 - 初学者

1. 硬件电路

在这里插入图片描述

2. 点亮led

2.1 字节操作方式

/*
*文件名称:main.c
*摘    要:点亮led灯
*
*当前版本:V 1.0
*编 写 者:夏天的经典
*完成时间:2023-01-28
*/

#include <reg51.h>

void main(void)
{
	while(1)
	{
		P1 = 0xfe;
	}
}

2.2 位操作方式

/*
*文件名称:main.c
*摘    要:点亮led灯
*
*当前版本:V 1.0
*编 写 者:夏天的经典
*完成时间:2023-01-28
*/

#include <reg51.h>

sbit led = P1^0;

void main(void)
{
	while(1)
	{
		led = 0;
	}
}

3. 闪烁led

3.1 无参延时函数实现延时

/*
*文件名称:main.c
*摘    要:无参延时函数实现led闪烁
*
*当前版本:V 1.0
*编 写 者:夏天的经典
*完成时间:2023-01-28
*/

#include <reg51.h>
#include <intrins.h>

sbit led = P1^0;

//函数声明
void Delay500ms();

void main()
{
    while(1)
    {
        led = 0;
        Delay500ms();
        led = 1;
        Delay500ms();
    }
}

//延时函数
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

延时函数可以用软件生成(例如STC-ISP)。也可以用while(i- -);实现不需要比较精确的延时。

3.2 有参函数实现延时

/*
*文件名称: main.c
*摘    要:带参延时函数实现led闪烁
*
*当前版本:V 1.0
*编 写 者:夏天的经典
*完成时间:2023-01-28
*/

#include <reg51.h>

sbit led = P1^0;

//函数声明
void DelayXms(unsigned int xms);

void main()
{
    while(1)
    {
        led = 0;
        DelayXms(500);
        led = 1;
        DelayXms(500);
    }
}

//带参延时函数
void DelayXms(unsigned int xms)   //@12MHz
{
    unsigned int i, j;
    for(i=xms;i>0;i--)
    {
        for(j=124;j>0;j--)
        {}
    }
}

4. 流水灯

4.1 简单赋值语句实现

/*
*文件名称: main.c
*摘    要: 简单顺序语句实现流水灯
*
*当前版本: V 1.0
*编 写 者: 夏天的经典
*完成时间: 2023-01-28
*/

#include <reg51.h>
#define NUM 500

//函数声明
void DelayXms(unsigned int xms);

void main(void)
{
	while(1)
	{
		P1 = 0xfe;
		DelayXms(NUM);
		P1 = 0xfd;
		DelayXms(NUM);
		P1 = 0xfb;
		DelayXms(NUM);
		P1 = 0xf7;
		DelayXms(NUM);
		P1 = 0xef;
		DelayXms(NUM);
		P1 = 0xdf;
		DelayXms(NUM);
		P1 = 0xbf;
		DelayXms(NUM);
		P1 = 0x7f;
		DelayXms(NUM);
	}
}

//延时函数
void DelayXms(unsigned int xms)
{
	unsigned int i, j;
	for(i = xms;i>0;i--)
		for(j = 124;j>0;j--);
}

4.2 数组实现

/*
*文件名称: main.c
*摘    要: 数组实现流水灯
*
*当前版本: V 1.0
*编 写 者: 夏天的经典
*完成时间: 2023-01-28
*/

#include <reg51.h>
#define NUM 500

unsigned char code LEDBUF[]={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};

//函数声明
void DelayXms(unsigned int xms);

void main(void)
{
	unsigned char cnt;
	while(1)
	{
		for(cnt = 0;cnt<8;cnt++)
		{
			P1 = LEDBUF[cnt];
			DelayXms(NUM);
		}
	}
}

void DelayXms(unsigned int xms)
{
	unsigned int i, j;
	for(i = xms;i>0;i--)
		for(j = 124;j>0;j--);
}

4.3 C51库函数实现

/*
*文件名称: main.c
*摘    要: C51库函数实现流水灯
*
*当前版本: V 1.0
*编 写 者: 夏天的经典
*完成时间: 2023-01-28
*/

#include <reg51.h>
#include <intrins.h>
#include "delay.h"

//宏定义
#define NUM 500

unsigned char code LEDBUF[]={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};

void main(void)
{
	unsigned char temp = 0xfe;
	while(1)
	{
		P1 = temp;
		temp = _crol_(temp,1);   //左移
		DelayXms(NUM);
	}
}

/*
*文件名称: delay.c
*摘    要: 非精确延时功能的实现
*
*当前版本: V 1.0
*编 写 者: 夏天的经典
*完成时间: 2023-01-28
*/

#include "delay.h"

/**************************************************************************
*函数名称:DelayXms
*函数参数:unsigned int
*返 回 值:void
*函数功能;任意时间的延时
**************************************************************************/
void DelayXms(unsigned int xms)   //@12MHz
{
    unsigned int i, j;
    for(i=xms;i>0;i--)
        for(j=124;j>0;j--);
}

/*
*文件名称: delay.h
*摘    要: 延时函数声明
*
*当前版本: V 1.0
*编 写 者: 夏天的经典
*完成时间: 2023-01-28
*/

#ifndef __DELAY_H__
#define __DELAY_H__

void DelayXms(unsigned int xms);

#endif

4.4 位运算符实现

/*
*文件名称: main.c
*摘    要: 位运算符实现流水灯
*
*当前版本: V 1.0
*编 写 者: 夏天的经典
*完成时间: 2023-01-28
*/

#include <reg51.h>
#include "delay.h"

/**************************************************************************
*函数名称:main
*函数参数:void
*返 回 值:void
*函数功能;主函数
**************************************************************************/
void main(void)
{
    unsigned char temp = 0xfe;
    while(1)
    {
        P1 = temp;
        temp = temp<<1;
        DelayXms(1000);
    }
}

delay函数参考上面的。

移位运算符与按位取反运算符结合版:

/*
*文件名称: main.c
*摘    要: 位运算符实现流水灯
*
*当前版本: V 1.0
*编 写 者: 夏天的经典
*完成时间: 2023-01-28
*/

#include <reg51.h>
#include "delay.h"

//宏定义
#define NUM 500

/**************************************************************************
*函数名称:main
*函数参数:void
*返 回 值:void
*函数功能;主函数
**************************************************************************/
void main(void)
{
    unsigned char temp = 0x01;   //0000 0001
    unsigned char i=0;
    while(1)
    {
        P1 = ~(temp<<i++);
        if(8==i)
            i=0;
        DelayXms(NUM);
    }
}

posted @ 2023-01-28 23:45  努力搬砖呀  阅读(50)  评论(0编辑  收藏  举报  来源