proteus仿真+keil——>制作流水灯

本文介绍了如何使用51单片机进行LED流水灯的制作,重点讲解了共阳极接法和限流电阻的作用,配合Keil编写的简单代码实现。通过Proteus仿真和实际操作,读者将学习到基础硬件设计与软件编程的实践应用。

1.proteus仿真:led接法为共阳极接法,图中的R2-9是限流电阻,如果没有这个电阻,回路中的电流理论上是无穷大,会把IO口烧坏,接上电阻,电流最大会被权限制在一定的范围内
在这里插入图片描述
2.keil

#include"reg51.h"

unsigned char leddat[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void delay(unsigned int n)
{
	unsigned int i,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
void led()
{
	int i=0;
	for(i=0;i<8;i++)
	{
		P2=~leddat[i];
		delay(100);
	}
}
void main()
{
	led();
}

效果图:
在这里插入图片描述
视频:

51单片机制作流水灯(proteus仿真+keil4)

<think> 嗯,用户需要的是关于Proteus仿真STM32驱动四位数码管并结合Keil5开发的具体方法。从历史引用看,用户之前接触过流水灯和六位数码管的仿真案例,这次聚焦在四位显示上,说明ta可能在做一个精简版显示项目。 注意到引用[2]提到数码管驱动需要74LS245增强驱动能力,且特别强调位选和段选不要共用同一GPIO,这个细节很关键。用户上次的问题明确要求四位数码管,比六位简单但原理相通,重点在动态扫描的实现。 用户应该已经具备CubeMX基础配置能力,所以回复要侧重数码管特有的硬件设计和代码逻辑。需要强调几个易错点:一是Proteus中必须加驱动芯片否则亮度异常;二是动态扫描的定时器中断配置(引用[2]用TIM3很合理);三是防止GPIO冲突的引脚分配技巧。 考虑到用户可能调试时遇到鬼影问题,在硬件部分特意说明限流电阻的必要性,代码部分给出消隐函数示例。相关延伸问题设计成阶梯式:从基础扫描原理到实际校准功能实现,这样无论用户当前处于哪个阶段都能找到参考方向。 最后在注意事项里埋了两个坑的预警:一是Proteus的电流驱动不足特性(实际硬件可能正常但仿真要加芯片),二是动态扫描频率过低导致的闪烁问题。用户如果按六位案例的代码直接改四位可能会忽略中断周期调整,这点必须强调。 </think>以下是基于Proteus仿真STM32驱动四位数码管并结合Keil5开发的完整流程及关键要点: --- ### **一、硬件设计(Proteus部分)** 1. **核心电路搭建** - 主控芯片:`STM32F103C6`(或同系列) - 数码管:添加**4位共阳数码管**(Common Anode) - 驱动芯片:**74HC245**(增强I/O驱动能力) - 限流电阻:段选引脚串联`220Ω`电阻 2. **接线方案** ```mermaid graph LR STM32_GPIO[STM32 GPIO] -->|段选信号| 74HC245[74HC245输入] 74HC245 -->|增强后输出| 数码管段选[数码管a-g+dp] STM32_GPIO -->|位选信号| 三极管[位选三极管基极] 三极管 -->|控制位供电| 数码管位选[数码管位选1-4] ``` - **段选**:STM32 GPIO → 74HC245 → 数码管段引脚 - **位选**:STM32 GPIO → PNP三极管(如8550)→ 数码管公共端 *注:位选需三极管扩流,避免GPIO电流不足[^2]* 3. **Proteus关键设置** - 数码管属性:设置为**Common Anode**(共阳) - 74HC245:`DIR`引脚接VCC(数据方向A→B) - 三极管基极限流电阻:`1kΩ` --- ### **二、软件设计(Keil+CubeMX)** #### **CubeMX配置** 1. **时钟树**:配置系统时钟为72MHz(外部晶振8MHz) 2. **GPIO设置**: - 段选信号:8个GPIO推挽输出(连接74HC245输入) - 位选信号:4个GPIO推挽输出(连接三极管基极) 3. **定时器配置**(例:TIM2): - 时钟源:`Internal Clock` - 预分频(Prescaler):`7200-1` → 计数频率10kHz - 计数周期(Counter Period):`100-1` → 中断周期1ms #### **代码实现(Keil)** ```c // 1. 数码管编码表(0-9字符) uint8_t seg_code[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, // 0-4 0x92, 0x82, 0xF8, 0x80, 0x90 // 5-9 }; // 2. 动态扫描函数(在定时器中断中调用) void SMG_Display(uint16_t num) { // num为待显示数字 static uint8_t pos = 0; // 当前扫描位 uint8_t digit[4] = {num/1000, num%1000/100, num%100/10, num%10}; HAL_GPIO_WritePin(GPIOA, ALL_POS_PINS, GPIO_PIN_SET); // 关闭所有位选 // 发送段码(通过74HC245) for(uint8_t i=0; i<8; i++) { HAL_GPIO_WritePin(GPIOB, seg_pins[i], (seg_code[digit[pos]] >> i) & 0x01); } // 开启当前位选 HAL_GPIO_WritePin(GPIOA, pos_pins[pos], GPIO_PIN_RESET); pos = (pos+1) % 4; // 循环扫描 } // 3. 定时器中断回调 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { SMG_Display(1234); // 显示示例数字 } } ``` --- ### **三、关键问题解决** 1. **消隐处理**: 在切换位选前关闭所有位选,避免切换时的鬼影: ```c #define ALL_POS_PINS (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3) HAL_GPIO_WritePin(GPIOA, ALL_POS_PINS, GPIO_PIN_SET); // 关键消隐步骤 ``` 2. **驱动能力不足**: - Proteus中未使用74HC245会导致显示过暗 - 实际硬件需确保GPIO电流≤25mA(STM32极限值) 3. **显示闪烁**: 定时器中断周期需≤5ms(人眼视觉暂留临界值) --- ### **四、完整流程验证** 1. CubeMX生成代码 → Keil添加显示逻辑 → 编译生成`.hex`文件 2. Proteus中: - 双击STM32 → `Program File`加载`.hex` - 设置晶振频率与代码一致(如8MHz) 3. 运行仿真观察效果: - **正常现象**:四位数码管稳定显示"1234" - **异常排查**: - 全灭 → 检查位选三极管极性 - 乱码 → 核对段码表接线顺序 - 闪烁 → 缩短定时器中断周期 --- ### **注意事项** 1. **GPIO冲突预防**:段选/位选信号分配至不同GPIO端口(如段选用GPIOB,位选用GPIOA)[^2] 2. **动态扫描原理**:每次仅点亮1位数码管,利用视觉暂留实现"同时"显示 3. **电流计算**:单段电流建议≤5mA(共阳端总电流≤40mA)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信奥钟老师

你的鼓励将是我的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值