单片机点灯程序参考
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);
}
}