51单片机按键控制数码管0~9_STC15单片机实战项目 项目需求

以经典的51内核单片机设计一款产品,功能如下:

1、采用宏晶的STC15L2K32S2-LQFP32,2k SRAM,32k ROM;

   目的:选用STC15系列1T的经典51内核单片机,资源丰富。

2、设计1个运行指示灯,工作时,间隔1s闪烁;

   目的:学习定时器,GPIO控制。

3、设计2个按键,1个位于中断管脚,1个位于普通管脚;

 目的:学习按键中断检测与按键状态机检测。

4、设计1个PWM控制的呼吸灯,中断按键控制,重新上电,可以恢复原始状态;

目的:学习PWM,单片机内部EEPROM。

5、设计NTC传感器(B值3950K),采集环境温度,显示在数码管上(LED专用驱动芯片TM1620);

   目的:学习ADC,数码管/段码屏驱动,串行协议。

6、设计1路RS-485接口,连接电脑端的上位机(C#,提供源码),用于显示温度,控制呼吸灯;

   目的:学习RS-485,MODBUS协议,上位机(可选学习)

7、设计WIFI功能(ESP-12S),采用tcp协议传输,将温度发送至手机aap端(有现成的TCP  APP);

   目的:学习AT指令,WIFI模块,TCP联网。

   说明:掌握了WIFI模块的AT指令,其它无线模块,应用方法大同小异

8、电源输入支持5至32V(MP2451),具有反接保护,浪涌等保护;

 目的:学习降压DCDC电源;

9、低功耗设计,按键按下2s进入低功耗(关机),再按下2s唤醒(开机),循环往复,低功耗时,整机待机电流尽量的低,理想1.1uA

   目的:学习低功耗设计;

说明:低功耗设计,牵涉电源设计,外设设计,软件设计等。

10、预留1路IIC接口,用于扩展OLED屏,数字温湿度传感器等,

信号顺序为3.3V,GND,SCL,SDA。

   目的:扩展IIC接口;

整个项目就是一个典型的基于单片机的物联网采集与控制系统。涵盖了单片机常用的功能,包含GPIO,外部中断,定时器,UART,PWM,RS-485,ADC,单片机内部EEPROM,数码管/段码屏驱动,降压电源,低功耗设计,WIFI无线,AT指令,状态机编程,面向对象编程,串行协议,MODBUS协议。

项目流程:

1、需求文档           

2、方案评估           

3、原理图设计         

4、PCB设计             

5、打板、焊接样机    

6、硬件调试      

7、软件调试     

8、整机测试

9、生产文档

学习板获取方法:

方法1:自己设计PCB,自行打板焊接;

方法2:用群主设计的PCB,自行打板焊接; 

方法3:向群主购买(硬件打板调通后才有卖);

学习方法:

  按项目流程设计,刘杰会陆续的撰写教学文档,分享设计资料,教学文档通过微信公众号(yjjy168168168)与CSDN(https://blog.csdn.net/weixin_39902512)发布,设计资料

共享在360云盘,链接放在教学文档供下载,同时上传至qq群,方便下载。

  与其它教学不同的是:从整个项目流程入手,根据需求,有目的性的系统学习,再局部深入。

下一个项目:

以STM32为主控设计一款产品,功能待定,敬请期待。

单片机产品实战项目教学,开源项目,开发工具,技术资料以及更多原创技术文章,请关注微信公众号。

d9201b7b89cf9877db189e201378211b.png

扫描二维码

获取更多精彩

硬件家园

90d838aa1f2e871915cdc37c83d74b58.png d87eec5005a63c9ff93fabae7897ee8d.png

5fbd02066ecbcd620b7e02270aaa9ecf.png

讲师:刘杰,软硬件工程师,10多年单片机产品开发经验。长期进行单片机实战项目教学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于51单片机按键控制数码管加一减一的代码: ``` #include <reg52.h> // 包含STC15F2K60S2单片机的寄存器定义 #include <intrins.h> // 包含_nop_()等函数的头文件 // 数码管共阴极引脚连接单片机P2口 sbit LED_COM1 = P2^2; sbit LED_COM2 = P2^3; sbit LED_COM3 = P2^4; sbit LED_COM4 = P2^5; // 数码管段选引脚连接单片机P0口 sbit LED_A = P0^0; sbit LED_B = P0^1; sbit LED_C = P0^2; sbit LED_D = P0^3; sbit LED_E = P0^4; sbit LED_F = P0^5; sbit LED_G = P0^6; sbit LED_DP = P0^7; // 按键引脚连接单片机P3口 sbit KEY_ADD = P3^0; sbit KEY_SUB = P3^1; // 数码管显示的数字,初始值为0 unsigned char led_code = 0; // 数码管显示函数 void LED_Display(unsigned char num) { // 数码管编码表,0~9对应的编码 unsigned char LED_TABLE[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; // 数码管共阴极,高电平不亮,低电平亮 LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; // 判断显示的是哪一位数码管,并点亮 switch(num / 1000) { case 0: LED_COM1 = 0; break; case 1: LED_COM2 = 0; break; case 2: LED_COM3 = 0; break; case 3: LED_COM4 = 0; break; } LED_DP = 0; // 小数点不亮 P0 = LED_TABLE[num / 1000]; // 显示千位数字 _nop_(); // 延时一段时间,让人眼可以看到 LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; switch(num % 1000 / 100) { case 0: LED_COM1 = 0; break; case 1: LED_COM2 = 0; break; case 2: LED_COM3 = 0; break; case 3: LED_COM4 = 0; break; } LED_DP = 0; // 小数点不亮 P0 = LED_TABLE[num % 1000 / 100]; // 显示百位数字 _nop_(); LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; switch(num % 100 / 10) { case 0: LED_COM1 = 0; break; case 1: LED_COM2 = 0; break; case 2: LED_COM3 = 0; break; case 3: LED_COM4 = 0; break; } LED_DP = 0; // 小数点不亮 P0 = LED_TABLE[num % 100 / 10]; // 显示十位数字 _nop_(); LED_COM1 = 1; LED_COM2 = 1; LED_COM3 = 1; LED_COM4 = 1; switch(num % 10) { case 0: LED_COM1 = 0; break; case 1: LED_COM2 = 0; break; case 2: LED_COM3 = 0; break; case 3: LED_COM4 = 0; break; } LED_DP = 0; // 小数点不亮 P0 = LED_TABLE[num % 10]; // 显示个位数字 _nop_(); } // 延时函数 void Delay(unsigned int t) { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++); } void main() { // 初始显示数码管0 LED_Display(led_code); while(1) { // 检测加一按键是否按下,如果按下则led_code加一 if(KEY_ADD == 0) { Delay(20); // 延时一段时间,确保按键稳定按下 if(KEY_ADD == 0) { led_code++; if(led_code > 9999) led_code = 0; LED_Display(led_code); // 显示加一后的数码管值 } while(!KEY_ADD); // 等待加一按键释放 } // 检测减一按键是否按下,如果按下则led_code减一 if(KEY_SUB == 0) { Delay(20); // 延时一段时间,确保按键稳定按下 if(KEY_SUB == 0) { led_code--; if(led_code < 0) led_code = 9999; LED_Display(led_code); // 显示减一后的数码管值 } while(!KEY_SUB); // 等待减一按键释放 } } } ``` 代码中使用了外部按键控制数码管的加一减一操作,数码管由四个共阴极的数码管组成,使用P2口控制共阴极引脚,使用P0口控制段选引脚。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值