应广单片机FPS122 驱动TM1652 LED屏

这篇具有很好参考价值的文章主要介绍了应广单片机FPS122 驱动TM1652 LED屏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:TM1652介绍

TM1652 是一款LED(发光二极管、数码管、点阵屏)驱动控制专用芯片,内部集成了数字通讯电路、 解码电路、数据锁存器、震荡器、LED驱动电路。通讯方式采用异步串口通信(UART)协议,因芯片只 接收单片机发来的数据,仅需要单片机的一个TX端口发送数据给芯片即可,实现单线通讯;在显示驱动 方面,芯片采用动态扫描方式,两种显示模式可选,8级段驱动电流可调,16级位占空比可调;
本芯片采用异步串口通信(UART)协议,工作原理是将传输数据的每个字符以串行方式一位接一位 的传输。下图给出了其工作模式:

tm1652串口程序,单片机,嵌入式硬件

TM1652 每一位的时间为:52us 。        //重点
其中每一位(bit)的意义如下:
▲起始位:为由高变低,低电平时间为一位的时间,表示传输字符的开始。
▲数据位:紧跟起始位之后,D0-D7,低位先发。
▲校验位:为一位的时间,如果 8 位数据位中 1 的个数为奇数,该位设为 0(置低电平),否则为 1(置
高电平)。
▲停止位:置高。时间为一位的时间,它是发送完一个字符数据的结束标志。
▲空闲位:置高。如果空闲位置高的时间大于 3ms,TM1652 就认为本次数据帧结束,本次数据从暂存器
打入相应寄存器开始控制芯片输出。如果一帧数据传输没有结束,那么建议设置空闲位时间范围在
0-0.5ms 以内。
TM1652 的一帧数据包括以下两种形式:
⑴ 显示地址命令+显示数据;
⑵ 显示控制命令+显示控制调节命令。
波特率:是衡量数据传输速率的指针。表示为每秒钟传送的二进制位数(bit 数)。例如资料传送速率 为 120 字符/秒,而每一个字符为 11 位,则其传送的波特率为 11×120=1320 bit/秒=1320
波特。TM1652 支持波特率范围为:17500bps~21200bps,这里我们建议用 19200bps 即每位的
时间为:1s(秒)/19200≈52us(微秒)。所以 TM1652 支持的每位的时间范围为: 47us~57us。
tm1652串口程序,单片机,嵌入式硬件

二:以下是FPS122 驱动程序 MINI C

#include	"extern.h"
UART_Clock	=>	8000000;			//UART时钟,选择1M、2M、4M、8M,其他值默认1M,若使用其他值请咨询FAE
FPPA_Duty		=>	_SYS(INC.FPPA_NUM);	// Single FPPA = 1, Mult FPPA = 2 or 4/8/...

Baud_Rate		=>	19200;				//波特率
UART_Out	BIT	PB.1;					//发送端口

/***********************************
 * 对应TM1652共阴数码管显示的数字 0~9
 * 0	0x77
 * 1	0x14
 * 2	0x6E
 * 3	0x3E
 * 4	0x1D
 * 5	0x3B
 * 6	0x7B
 * 7	0x16
 * 8	0x7F
 * 9	0x3F
 * NULL 0x00
***********************************/
BYTE Buffer_Tab[11] = {0x77, 0x14, 0x6E, 0x3E, 0x1D, 0x3B, 0x7B, 0x16, 0x7F, 0x3F};

UART_Delay		=>	( (UART_Clock / FPPA_Duty) + (Baud_Rate/2) ) / Baud_Rate;
//	+ (Baud_Rate/2) : to round up or down

Test_V0			=>	UART_Clock / 1000 * 995;
Test_V1			=>	UART_Delay * Baud_Rate * FPPA_Duty;
Test_V2			=>	UART_Clock / 1000 * 1005;

#if	(Test_V1 < Test_V0) || (Test_V1 > Test_V2)
	.echo	%Test_V0 <= %Test_V1 <= %Test_V2
	.error	Baud_Rate do not match to System Clock
#endif

BYTE	cnt_1_buff;

byte	SYS_CLKMD;
byte	CLKMD_BK;

void	Clock_Adjust(void)//时钟调整
{
	CLKMD_BK	=	0x34;//8M    

	CLKMD = CLKMD_BK;//将系统时钟修改为设定的UART时钟
	nop;//等待
}

//发送程序
void	UART_Send (void)
{
	BYTE	cnt;
	BYTE	cnt_1;    //发送数据 1的个数计数
	BYTE	UART_Data_Out;

	UART_Data_Out	=	A;

	//	Start Bit
	set0	UART_Out;				//	1
	// .Delay	UART_Delay - 10;


    cnt	=	8;						//	2 ~ 3
	cnt_1 = 0;
	.Delay	3;						//	4 ~ 6
	do
	{	//	Data Bit * 8
		.Delay	UART_Delay - 10;    //延时52us
		sr		UART_Data_Out;		//	7
		if (CF)
		{
			nop;					//	10
			cnt_1++;                //对发送的8位数据中1的位数进行计数 用来奇偶校验
			UART_Out	=	1;		//	1
		}
		else
		{
			UART_Out	=	0;		//	1
			.delay	2;				//	2 ~ 3
		}
	} while (--cnt);				//	4 ~ 6
	.Delay	UART_Delay - 5;        //延时52us

	
	cnt_1_buff = 0;
	cnt_1_buff = (cnt_1 & 0x01);    //奇偶校验 当cnt_1_buff & 上1时 为1 则为奇数 否者为偶数
	if(cnt_1_buff == 1)		//奇数    
	{
		set0	UART_Out;				//	0
	}
	else					//偶数
	{
		set1	UART_Out;				//	1
	}
	.Delay	UART_Delay - 2;        //延时52us

	//	Stop Bit
	set1	UART_Out;				//	1
	.Delay	2 * UART_Delay - 2;
}

void UART_HandShake (BYTE SendData)    //数据发送
{
	Clock_Adjust();		//将系统时钟修改为设定的UART时钟
	//发送多组byte
	A = SendData;
	UART_Send();
	.delay 416;        //延时52us
	CLKMD = SYS_CLKMD;	//数据发送结束后,切回原来的系统时钟
	nop;//等待
}

void UART_INIT(void)
{
	SYS_CLKMD = CLKMD;	//初始记录系统时钟,在UART通讯后方便切回系统时钟
	$ UART_Out High,Out;//设置UART的通讯脚(发送信号)
	.delay	100;		//等待

	UART_HandShake(0x08);
	UART_HandShake(0x7F);
	UART_HandShake(0x7F);
	UART_HandShake(0x7F);
	UART_HandShake(0x7F);
	UART_HandShake(0x41);
	.delay	1000000;		//等待 	1s 

	UART_HandShake(0x18);
	UART_HandShake(0xFE);	//4F
	.delay	1000000;		//等待 	1s
}

TM1652显示数字格式有两种方式这里只介绍 一种 这种比较常用 为:

Command1:选择显示地址命令(0x08)
Data1~Data n:发送显示数据(最多6bytes)
Time:数据线置高时间(最小时间为3ms)
CommandX:选择显示控制命令(0x18)
CommandY:发送显示控制调节命令(包括位占空比、段驱动电流以及显示模式设置)

    UART_HandShake(0x08);                显示地址命令        DATA0

    UART_HandShake(0x7F);                DATA1                显示第一个数字

    UART_HandShake(0x7F);                DATA2                显示第二个数字

    UART_HandShake(0x7F);                DATA3                显示第三个数字

    UART_HandShake(0x7F);                DATA4                显示第四个数字

    UART_HandShake(0x41);                DATA5        //这个数据控制图标显示  

/**********第DATA5******************

*0x01 第一个 小数点亮  

*0x40 第二个 小数点亮  

*0x04 电池图标

*0x08 斤图标

*0x10 lb图标

*0x20 kg图标

************************************/文章来源地址https://www.toymoban.com/news/detail-807969.html

三:完成以上工作TM1652就可以点亮了,亲测有效 !!!

到了这里,关于应广单片机FPS122 驱动TM1652 LED屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机LED显示屏驱动原理与实现

    STM32单片机驱动LED显示屏的原理与实现方法与Arduino类似,但涉及到的具体硬件资源和库函数可能会有所不同。下面是一个详细的介绍:   原理: STM32单片机驱动LED显示屏的原理是通过控制GPIO引脚的电平状态来控制LED的亮灭。通过设置引脚的输出电平为高电平(VCC)或低电平

    2024年02月10日
    浏览(47)
  • 应广单片机跑马灯实现--阻塞式编程模式

           我这边再写了一个跑马灯程序,使用阻塞式编程模式,看起来会更简单直观。对于初学者来说,阻塞式编程比较直观好理解。在一些任务单一或是任务不多的程序来说,还是不错的选择。但是建议还是采用任务式/查询式编程,这样使程序会有更好的扩展性能,减少推

    2024年02月09日
    浏览(50)
  • 基于STM32F103ZET6单片机驱动SM16306SJ控制8个LED灯的系统设计

    1.设计要求:使用stm32f103zet6精英开发板  采用SM16306SJ驱动8个LED灯。 2.原理图 3.代码 4.实物效果图 备注:1 硬件上有一个LED灯坏了,所以才亮了7个LED灯            2 一个SM16306SJ最多可以驱动16个LED灯            3 SM16306SJ跟MBI5020程序通用

    2024年04月17日
    浏览(49)
  • 单片机-LED介绍

    LED 即发光二极管。它具有单向导电性,通过 5mA 左右电流即可发光 电流 越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在 3 mA-20mA 之间,通常我们会在 LED 管脚上串联一个电阻,目的就是为了限制通过发光二极 管的电流不要太大,因此这些电阻又可以称为“

    2024年02月09日
    浏览(53)
  • 122、仿真-基于51单片机的电量监测电压电流和温度报警系统设计(Proteus仿真+程序+流程图+配套资料等)

    方案选择 单片机的选择 方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节的闪存程序存储器,也就是说代码量可以写到128k字

    2024年02月16日
    浏览(44)
  • 如何使用单片机点亮LED灯,并使用按键控制[51单片机]

    首先先看一下我的板子,如果我们板子不相同,可能操作也不太相同 我们就不讲底层原理了,直接看,我们可以看到板子上有 8个LED灯   那这个8个LED用什么来控制呢,我们先看底层的线路图,所有的LEDD都连接到了P2带后缀的接口上, 那么只需要操作这几个接口的高低电频,

    2024年02月05日
    浏览(42)
  • 【51单片机】LED 点阵

    参考:普中 51 单片机开发攻略 第13章 mian.c

    2024年01月22日
    浏览(41)
  • 51单片机点亮LED灯

    目录 前言 一、点亮一个LED 二、LED闪烁 三、LED流水灯 四、独立按键控制LED 独立按键控制LED亮灭 独立按键控制LED状态 独立按键控制LED以二进制形式显示 独立按键控制LED状态循环移位 总结           嵌入式学习的入门就是点亮LED灯,就好比学习编程语言敲 “Hello world”

    2024年02月06日
    浏览(40)
  • 51单片机LED点阵屏

    LED点阵屏是一种由许多小型LED灯组成的矩阵式显示屏。这些LED灯可以是单色、双色或全彩的,它们排列成行和列的网格,可以根据需要点亮来显示图像、文字或动画等内容。LED点阵屏广泛应用于户外广告牌、室内显示、交通信号灯、电子价格标签和其他需要显示信息的场合。

    2024年01月23日
    浏览(49)
  • 【51单片机】LED点阵屏

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Waiting For Love】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔74HC595图片 🍔74HC595原理 🍔”上升沿“是什么意思 🎆LED点阵屏显示图形  🎈现象  🎈代码(三部分) main.c  Del

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包