32G12K128实验-LED数码管动态显示实验
本帖最后由 惦饭宝 于 2024-10-9 07:03 编辑实验二 LED数码管动态显示实验🕵️♀️
一、实验要求 利用STC32G12K128实验箱,制作一个数码管动态显示系统。参考实验箱原理图,控制实验箱8只数码管,分别滚动显示单个数字0~7。 程序运行后,单片机控制左边第一个数码管显示0,其它数码管不显示;演示之后,控制左边第2只数码管显示1,其它不显示;.......直至第8只数码管显示7,其它不显示;反复循环上述过程。二、实验目的 掌握单片机控制LED共阳极数码管的动态显示。三、实验拓展 1)应用已掌握的单片机GPIO的控制原理,设计一款电磁炉的电子控制系统,系统控制要求包括: 按下开机键,电磁炉会产生蜂鸣提示开机成功;用按键选择不同的加热模式,待选的模式会点亮对应的led灯作为提示,按下确认键会选中该模式,并蜂鸣提示选择成功; 等待1s钟,电磁炉根据选定模式对应的加热温度开始加热,并通过数码管显示加热的温度; 通过按键“+”和“-”调节加热温度;再次按下开机键,电磁炉蜂鸣提示并关机。 2)设计一款电饭煲的电子控制系统,系统控制要求类似电磁炉控制,细化控制要求略有不同,可以增加不同模式的定时控制和延时控制。 3)思考除上述家电外,还有哪些日常家用电器可以用已掌握的单片机控制技术来实现,并在这些家用电器控制系统里增加网络功能,比如wifi入网或者zigbee入网等,将家用电器都接入物联网。四、实验报告撰写 (包括数码管动态显示系统的原理图;实验程序;调试过程以及实验心得体会和实验拓展部分的思考),要求实验报告提交手写纸质版。
五、相关内容实验原理图:
软件安装教程[冲哥]:👉点我👈//=======================================================================================================================================================================================//实验报告👧一、实验要求利用STC32G12K128实验箱,制作一个数码管动态显示系统。参考实验箱原理图,控制实验箱8只数码管,分别滚动显示单个数字0~7。程序运行后,单片机控制左边第一个数码管显示0,其它数码管不显示;演示之后,控制左边第2只数码管显示1,其它不显示;直至第8只数码管显示7,其它不显示;反复循环上述过程。二、实验目的 掌握单片机控制LED共阳极数码管的动态显示。三、实验原理
//=========================================//
3.1数码管原理图
//=========================================// 3.2 按键原理图 https://www.stcaimcu.com/data/attachment/forum/202409/15/192611kp111k274kkku41k.jpg
//=========================================//
3.3延时函数原理
//延时函数delay_ms 延时n毫秒
//6000为经验值,使得i = MAIN_Fosc / 6000 = 4000 ,即这一个循环里面i就循环了4000次,大致为1ms的时间。 #define MAIN_Fosc24000000UL //晶振频率 void delay_ms(u16 ms) //unsigned int { u16 i; do { i = MAIN_Fosc/6000; while(--i); }while(--ms); } //=========================================// 3.4 按键消抖原理
因为按键是机械开关所以当机械触点断开、闭合时,由于机械触点的弹性作用,
一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动(电压上下波动)。
对于一个开关来说,整个按键周期中有效的时间大约在50-200ms,即大约10ms的抖动之后就是正常的低电平。
https://www.stcaimcu.com/data/attachment/forum/202409/15/152519pbnblp9aan6iz9ii.jpg
//=========================================//
3.5 LED灯原理图 https://www.stcaimcu.com/data/attachment/forum/202409/15/192306zpgoc56olu1381hx.jpg//=========================================//
3.6 蜂鸣器原理图
//=========================================//
四、实验程序 4.1 基础实验:数码管滚动显示0-7 CODE: 思路:将各个数码管设置成一个数组,通过变量i调用。 u8 i = 0; u8 SEG_Tab = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 }; //数码管显示的0-9数字 u8 COM_Tab = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe }; //0-7的位码数组
for ( i = 0; i < 8; i++) // 控制8个数码管逐个显示数字 { P7 = COM_Tab; // 选择当前数码管 P6 = SEG_Tab; // 显示相应的数字 delay_ms(1000); // 每个数码管显示1秒 }
其他代码略..
实验效果:
CODE:(改写自冲哥课堂案例)//=====================================================================================================// 4.2 拓展实验:设计电磁炉电子控制系统 CODE:
思路:该系统使用了蜂鸣器,LED灯,按键,数码管等模块,需要先将各个模块完善,再综合应用。 //=========================================//
//蜂鸣器模块 #define BEEP P54 //定义蜂鸣器引脚,根据原理图可知蜂鸣器通过P54来开关。
函数名称: BEEP_RUN 功能: 蜂鸣器的运行函数。每10ms执行一次,根据变量 Time_Beep 的值决定是否打开或关闭蜂鸣器。如果 Time_Beep 大于0,蜂鸣器保持响并且 Time_Beep 递减,直至为0时关闭蜂鸣器。 备注: 需要每10ms执行一次。
函数名称: BEEP_ON 功能: 设置蜂鸣器响的持续时间,以10ms为单位。根据输入的 time 参数设置 Time_Beep 的值,控制蜂鸣器持续运行的时间。
函数名称: BEEP_OFF 功能: 立即关闭蜂鸣器。将 Time_Beep 设为0,停止蜂鸣器的运行。
模块代码://=========================================//
//LED灯模块
P40 = 0; //由原理图,使用LED灯需要将P40口设置为0使三极管导通//=========================================// //按键模块 综合分析:电磁炉电子控制子系统需要5个按键为:开机、模式选择、确认、温度'+'、温度'-' 故需要定义5个按键,SW32-SW36使用矩阵按键扫描(矩阵按键代码见附录)
函数名称: KEY_Deal
功能: 读取按键状态。循环检查8个按键端口的状态,并将按下时间存储在 Count 数组中,按下的状态赋值给 LastState。如果按键按下,计数器递增;如果松开,计数器清零。每10ms执行一次。
函数名称: KEY_ReadState
功能: 读取指定按键的状态。根据按下时间的长短返回不同的状态,包括未按下、消抖、单击、长按等。通过判断 Count 数组的值返回相应的按键状态。
函数名称: MateixKEY_delay
功能: 矩阵按键读取专用的延时函数。提供短暂延时,用于矩阵按键读取过程中确保按键状态稳定。
函数名称: MateixKEY_Read
功能: 读取矩阵按键按下的状态。通过行列扫描的方法,结合延时操作,检测出当前按下的按键并返回其键码。如果没有按键按下,则返回0。
模块代码://=========================================// //数码管模块 综合分析: 函数名称:Update_Temperature_Display 功能:通过对设定好的temperature进行数学运算,将温度值分解为数码管显示的各个位数,并且从右边开始填充数码管。
函数名称:Clear_Temperature_Display()
功能:调用一个for循环来清空数码管显示。
函数名称: SEG_LED_Show
功能: 循环刷新8位数码管和8个LED。此函数每1ms调用一次,在前8ms刷新数码管显示,第9ms刷新LED状态,第10ms留空不进行刷新。 通过 num 变量循环控制数码管和LED的刷新顺序,使用预定义的段码数组 SEG_Tab 和位码数组 COM_Tab 来控制显示内容。
数码管刷新: 前8ms内,选择不同的数码管位(SEG_COM)并通过 SEG_Tab 显示相应的数字。
LED刷新: 在第9ms时,打开LED电源并刷新LED的状态。
空闲: 在第10ms时,关闭所有数码管和段码信号。
模块代码: //=========================================// //定时器0模块 综合分析:由于单片机内部需要不断扫描矩阵按键读取到的数值,会占用数码管的显示,所以需要将数码管显示放置到定时器0中。
EA = 1; //需要让CPU开放中断,打开总中断。
函数名称: Timer0_Init
功能: 初始化定时器0,使其在1毫秒内产生一个中断,时钟频率为24.000MHz。设置定时器的模式为12T模式,并配置定时初始值,使定时器开始计时,并且使能中断。
模块代码:
//=========================================//
程序总体代码: 4位8段管动态扫描时,某位不显示的段会微亮显示其他位的内容,即鬼影现象,如何解决呢 springvirus 发表于 2024-10-12 15:36
4位8段管动态扫描时,某位不显示的段会微亮显示其他位的内容,即鬼影现象,如何解决呢 ...
软件逻辑没问题的话要不试试把数码管扫描的频率降低些,并适当增加每一位的点亮时间? 把这个移植到stc8h应该很简单 惦饭宝 发表于 2024-10-13 09:05
软件逻辑没问题的话要不试试把数码管扫描的频率降低些,并适当增加每一位的点亮时间? ...
现在是1ms溢出后切换位选择,2ms会有闪烁感
页:
[1]