51单片机:发光二极管与动态数码管控制

裸机:脱离操作系统通过代码直接操控硬件本身


课上使用单片机型号:HC6800-MS


51单片机的四个寄存器:P0,P1,P2,P3

GNC接地:负极,VCC接电源:正极

LED模块:

左正极,要实现灯亮需要存在电压差,1代表高电位,0代表低电位,例:P20网络编号呈现低电平,D1灯亮,若P20呈现高电平,D1灯灭。

P2:控制LED模块

P2.0到P2.7对应的LED模块的P20到P27网络编号,8个LED灯对应的从低位到高位的八位二进制编码,例如在该单片机下的全亮编码:000000000,全灭编码:111111111,在编辑代码时要将8位二进制编码转为16进制编码,例如全灭:0xFF

使用编码软件:

创建工程定义好工程文件名后选择器件部分:

工程创建完毕:

创建文件

修改文件名:

命名为.c后缀文件

编辑代码:

注意包头文件:reg52.h

需要手动将文件导入项目文件:

右键选择:

生成hex后缀文件:

勾选output栏的Create HEX File部分:

编译:第二个图标

编写好代码后将代码下载到板子上:

连接成功:

根据单片机型号选择正确的芯片型号:


下载编程:

开关机单片机

成功编程:

在打开一次程序文件后不需要再次打开

编辑代码部分:







指定位清零:(指定灯亮)

指定位置1(指定位灯灭)

高四位置1,低四位清零

利用异或:同号为零异号为真实现状态翻转:

灯闪,但是频率太高了,若要肉眼观察到闪烁需要加入延迟:

delay函数最高给到2的16次方

注意编写代码时所有变量要放在花括号后一行:

相关代码:

.c文件

c 复制代码
#include"led.h"
#include<reg52.h>
#include"digiter.h"
#include"delay.h"

int main(void)
{
	
    while(1)
    {
		int i;
	//	P2=0xFF;	  //不用定义P2,P2代表的就是八个灯
		for(i=0;i<8;++i)
		{
			led_on(~(1<<i));
			delay(10000);
		}
		for(i=6;i>0;i--)
		{
			led_on(~(1<<i));
			delay(10000);
		}

       
    }
    return 0;
}
c 复制代码
#include"led.h"
#include<reg52.h>

void led_all_on(void)
{
	P2=0;
}
void led_off(void)
{
	P2=0xFF;
}
void led_on(unsigned char n)
{
	P2=n;
}

.h文件:

c 复制代码
#ifndef _LED_H_
#define _LED_H_
extern void delay(unsigned int n);
extern void led_all_on(void);
extern void led_off(void);
extern void led_on(unsigned char n);



#endif

动态数码管部分:


若P1部分低电平,三极管导通,若P1部分低电平,则三极管截止,若想让LEDs1亮,需要P10为高电平,三极管此时导通,LEDS1与地线相连,呈现低电平,存在高低电势差则LEDS1灯亮,若想让灯灭,则让P1部分呈低电平

总共四个数码管,让P1的八位二进制数低四位置0,高四位置1,此时为11110000,

位选:选择点亮第n个数码管
c 复制代码
void bit_select(int n)	 //选择点亮的动态数码管
{
	P1&=~(0x0F<<0);
	P1|=(1<<n);
}
==位选:==显示单个数码管的数字
将要点亮的a~dp的部分置1,0为灭
c 复制代码
void segment_select(int n)	 //选择数码管显示的数字
{
	unsigned char t[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
	P0=t[n];
	delay(300);
	P0=0;
	delay(100);
}

单个数码管在灯亮后为避免频闪需要将P0清零,并且灯亮的延迟要长于灯灭的延迟

显示0~9999的数字
c 复制代码
void shownumber(int n) //0~9999
{
	int t=0;
	if(n==0)
	{
		bit_select(0);
		segment_select(0);
	}
	else if(n>9999)
	{
		return;
	}
	
	while(n)
	{
		bit_select(t++);
		segment_select(n%10);
		n/=10;
	
	}
}
相关推荐
LCG米2 小时前
STM32串口接收卡死根因排查:ORE溢出标志陷阱、错误标志清除顺序与中断恢复实测
stm32·单片机·嵌入式硬件·串口·嵌入式
创界工坊工作室3 小时前
38-基于单片机的老人健康监测系统
单片机·嵌入式硬件·51单片机·proteus
三佛科技-134163842125 小时前
20W~200W副边反馈SSR隔离方案HN1562+碳化硅MOS(含光耦817,431)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
恒锐丰科技林技术员7 小时前
EG2103 高压 MOS/IGBT 驱动芯片解析:半桥驱动的高性价比之选
经验分享·嵌入式硬件·硬件工程
_Ningye9 小时前
STM32 — 11.5 硬件SPI读写W25Q64
stm32·单片机·嵌入式硬件
inrichtt9 小时前
第九课时:STM32 SPI实战:按键消抖与FLASH断电保护
stm32·单片机·嵌入式硬件
优信电子10 小时前
STM32 驱动 SHT35 温湿度传感器:从 I²C 通信到 CRC 校验的完整实战
单片机·嵌入式
尼喃11 小时前
两节两串锂电池保护板原理图+充电电路二合一电路图
嵌入式硬件
深圳市恒锐丰科技杨生11 小时前
SS6208L 12V 集成 MOS 半桥功率芯片|LeadPower 率能半导体
嵌入式硬件·硬件工程
女神下凡12 小时前
芯参谋(61):PMSM永磁同步电机驱动电路设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范