51单片机004:用定时器以间隔500MS在3位数码管上依次显示0、1、2、3……C、D、E、F,重复。
题目:用定时器以间隔500MS在3位数码管上依次显示0、1、2、3……C、D、E、F,重复。
思路:
1、要用到定时器,进行定时器初始化,配置相关寄存器,并编写中断服务函数
2、“在3位数码管上依次显示……”,属于数码管的动态显示知识,要用到位选和段选
涉及原理图:
代码:
#include "reg52.h" //定义数码管位选信号控制脚 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; static unsigned int i;//定义静态变量i //共阴极数码管显示0~F的段码数据 unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void time0_init(void) { TMOD|=0X01; //选择为定时器0模式,工作方式1 TH0=(65535-50000)/256; //50ms定时10次 TL0=(65535-50000)%256; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 } void smg_display(unsigned char location,num) { P0=0x00; switch(location) { case 8:LSC=0;LSB=0;LSA=0;break; case 7:LSC=0;LSB=0;LSA=1;break; case 6:LSC=0;LSB=1;LSA=0;break; case 5:LSC=0;LSB=1;LSA=1;break; case 4:LSC=1;LSB=0;LSA=0;break; case 3:LSC=1;LSB=0;LSA=1;break; case 2:LSC=1;LSB=1;LSA=0;break; case 1:LSC=1;LSB=1;LSA=1;break; } P0=gsmg_code[num]; } void main() { time0_init();//定时器0中断配置 while(1) { } } void time0() interrupt 1 //定时器0中断函数 { static unsigned int location=1,num=0,count; TH0=(65535-50000)/256; //50ms定时10次 TL0=(65535-50000)%256; count++; if(count == 10) { count = 0; smg_display(location,num); location++; num++; if(location>3) { location=1; } if(num>15) { num=0; } } }
其中,smg_display函数是和小蜜蜂老师学的,小蜜蜂老师yyds!location代表要亮的数码管的位置,num代表该数码管要显示的数字,一步到位,不需要每次进行位选和段选,简单快捷。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具