找回密码
 注册
关于网站域名变更的通知
查看: 252|回复: 3
打印 上一主题 下一主题

51单片机——数码管实验程序(动态、静态显示)注释很详细

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-5-23 09:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基于AT89C52单片机的数码管类实验# X5 l# e4 y$ H& H1 B9 z5 c
电路原理图如下# N- t6 m: c) C8 y. V/ T' Y& N* p
( b& O  Y8 S% I0 E  A9 ]; V

3 ^' N% x! }+ q1 h1 J单片机源程序如下:6 h2 ]9 S- G" @. N' o' b; B6 U- Q
  • /***************************************************************************
  • 标题:        数码管的显示
  • 效果:        显示00-99,动态显示+变化显示
  • ******************************************************************************/
  • //头文件:
  • #include "reg51.h"
  • //变量定义:
  • unsigned char table[]=
  •                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  •                                         //表:共阳数码管 0-9
  • //引脚定义:
  • sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  • sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  • sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  • sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)
  • //函数声明:
  • void display(unsigned char da);//定义显示函数,参数为显示内容,只显示两位数
  • void delay(void);
  • //主函数,C语言的入口函数:
  • void main(void)
  • {
  •         unsigned char i=0;                //作为查表的索引号
  •         unsigned char ldata;        //变量用作0~99计数
  •         unsigned int j;                        //此变量作为计数跳变刷新时间
  •         while(1)
  •         {
  •                 j=5000;
  •                 while(j--){
  •                         display(ldata);        //刷新5000次,约1秒,注:在C语言里是没有周期可计算的哦~~~
  •                 }
  •                 if(ldata<99)
  •                         ldata++;                //刷新完成约1秒,变量做加计数
  •                 else
  •                         ldata=0;
  •         }
  • }
  • //显示函数,参数为显示内容,只显示两位数
  • void display(unsigned char da)
  • {
  •         SMG_q=0;                        //选择十位数码管
  •         P0=table[da/10];        //获取十位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
  •         delay();                        //延时
  •         P0=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
  •         SMG_q=1;                        //关闭十位数码管
  •         SMG_b=0;                        //选择个位数码管
  •         P0=table[da%10];        //获取个位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
  •         delay();                        //延时
  •         P0=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
  •         SMG_b=1;                        //关闭个位数码管
  • }
  • //延时子函数,短暂延时
  • void delay(void){
  •         unsigned char i=10;
  •         while(i--);
  • }
  • 3 P$ [( c+ ?4 I% o9 `! T' ?
' F+ ^& x% H" B
复制代码/ {6 }  Y, _8 w& U
  • /***************************************************************************
  • 标题:        数码管的显示
  • 效果:        显示1234,从这个例子可以学习多位数码管的动态显示技术
  • ******************************************************************************/
  • //头文件:
  • #include "reg51.h"
  • //变量定义:
  • unsigned char table[]=
  •                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  •                                         //表:共阳数码管 0-9
  • //引脚定义:
  • sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  • sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  • sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  • sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)
  • //函数声明:
  • void delay(void); //延时子函时
  • //主函数,C语言的入口函数:
  • void main(void)
  • {
  •         unsigned char i=0;        //作为查表的索引号
  •         while(1)                        //不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,
  •         {        //数码管显示 1234,可自行修改
  •                 SMG_q=0;                //选择千位数码管
  •                 P0=table[1];        //查找"1"定义好的数码管段值与P0口输出,显示相应的1
  •                 delay();                //加入短暂延时
  •                 P0=0XFF;                //清除数码管显示,因是共阳型,所以不是0
  •                 SMG_q=1;                //关闭千位数码管
  •                 SMG_b=0;                //选择百位数码管
  •                 P0=table[2];        //查找"2"定义好的数码管段值与P0口输出,显示相应的2
  •                 delay();                //加入短暂延时
  •                 P0=0XFF;                //清除数码管显示,因是共阳型,所以不是0
  •                 SMG_b=1;                //关闭百位数码管
  •                 SMG_s=0;                //选择十位数码管
  •                 P0=table[3];        //查找"2"定义好的数码管段值与P0口输出,显示相应的2
  •                 delay();                //加入短暂延时
  •                 P0=0XFF;                //清除数码管显示,因是共阳型,所以不是0
  •                 SMG_s=1;                //关闭十位数码管
  •                 SMG_g=0;                //选择个位数码管
  •                 P0=table[4];        //查找"2"定义好的数码管段值与P0口输出,显示相应的2
  •                 delay();                //加入短暂延时
  •                 P0=0XFF;                //清除数码管显示,因是共阳型,所以不是0
  •                 SMG_g=1;                //关闭个位数码管
  •         }
  • }
  • //延时子函数,短暂延时
  • void delay(void){
  •         unsigned char i=10;
  •         while(i--);
  • }

  • " n/ |. y- i+ _7 o( S1 m) i' {

# Q' V. n- G! `5 _* N复制代码+ c# B  g& B( E! E+ u5 V8 @
  • /***************************************************************************
  • 标题:        数码管的显示
  • 效果:        静态显示一位数码管,显示0-9
  • ******************************************************************************/
  • //头文件:
  • #include "reg51.h"
  • //变量定义:
  • unsigned char table[]=
  •                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  •                                         //表:共阳数码管 0-9
  • //引脚定义:
  • sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  • sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  • sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  • sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)
  • //函数声明:
  • void delay(unsigned int d_time); //延时子函时,
  • //主函数,C语言的入口函数:
  • void main(void)
  • {
  •         unsigned char i;                //定义循环变量
  •         while(1)
  •         {
  •                 SMG_q=0;                        //选择千位数码管,这是静态显示,P0口输出显示,不需要刷新,也可选择百位、十位或个位;
  •                                                         //也可两位或全部同时输出显示
  •                 for(i=0;i<10;i++)        //循环显示0-9
  •                 {
  •                         P0=table;        //查表输出数码管段值给P0口,显示相应的0-9
  •                         delay(500);                //延时
  •                 }
  •         }
  • }
  • //延时子函数,参数范围 0-65536
  • void delay(unsigned int tmp)
  • {
  •         unsigned char j;
  •         while(tmp--){
  •                 j=255;
  •                 while(j--);
  •         }
  • }
  • * ]; O* W0 e" J) N3 J; m
& k# H6 V; }+ ~- w& n) c; q6 h
复制代码
# M! b% x; ^! M0 Z2 h0 u
  • /***************************************************************************
  • 标题:        数码管的显示
  • 效果:        静态显示一位数码管,显示一个"5"
  • ******************************************************************************/
  • //头文件:
  • #include "reg51.h"
  • //引脚定义:
  • sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  • sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  • sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  • sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)
  • //主函数,C语言的入口函数:
  • void main(void)
  • {
  •         SMG_q=0;                //打开千位数码管,这是静态显示,P0口输出显示,不需要刷新,也可选择百位、十位或个位;
  •                                         //也可两位或全部同时输出显示
  •         P0=0x92;                //输出数码管段值给P0口,显示相应的5,
  •                                         //0-9的段值分别是(共阳):0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
  •         while(1);                //程序停止
  • }

  • ' n, I$ b6 m2 x! |3 I: b0 Z! C3 a6 C
: J; b1 Q8 t' B3 c+ [# n9 l
复制代码" I2 j* V7 J8 Z/ D9 L
  • /***************************************************************************
  • 标题:        数码管的显示
  • 效果:        显示1234,缓冲显示
  • ******************************************************************************/
  • //头文件:
  • #include "reg51.h"
  • //变量定义:
  • code unsigned char table[]=
  •                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  •                                         //表:共阳数码管 0-9
  • unsigned char l_disbuff[4]={1,2,3,4,};//显示缓冲
  • unsigned char l_posit=0;        //显示位置
  • //引脚定义:
  • sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  • sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  • sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  • sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)
  • //函数声明:
  • void delay(unsigned int timer); //延时子函时
  • void display();                //显示
  • //主函数,C语言的入口函数:
  • void main(void)
  • {
  •         unsigned int i=10000,j=1000;
  •         while(1)                        //不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,
  •         {
  •                 display();                //调用显示缓冲内容
  •                 delay(10);
  •         }
  • }
  • //延时子函数,短暂延时
  • void delay(unsigned int timer){
  •         while(timer--);
  • }
  • //显示函数,参数为显示内容
  • void display()
  • {
  •         P0=0XFF;                        //
  •         switch(l_posit){
  •         case 0:                //选择千位数码管,关闭其它位
  •                 SMG_q=0;
  •                 SMG_b=1;
  •                 SMG_s=1;
  •                 SMG_g=1;
  •                 P0=table[l_disbuff[0]];        //输出显示内容
  •                 break;
  •         case 1:                //选择百位数码管,关闭其它位
  •                 SMG_q=1;
  •                 SMG_b=0;
  •                 SMG_s=1;
  •                 SMG_g=1;
  •                 P0=table[l_disbuff[1]];
  •                 break;
  •         case 2:                //选择十位数码管,关闭其它位
  •                 SMG_q=1;
  •                 SMG_b=1;
  •                 SMG_s=0;
  •                 SMG_g=1;
  •                 P0=table[l_disbuff[2]];
  •                 break;
  •         case 3:                //选择个位数码管,关闭其它位
  •                 SMG_q=1;
  •                 SMG_b=1;
  •                 SMG_s=1;
  •                 SMG_g=0;
  •                 P0=table[l_disbuff[3]];
  •                 break;
  •         }
  •         l_posit++;                //每调用一次将轮流显示一位
  •         if(l_posit>3)
  •                 l_posit=0;
  • }1 M. k/ T! ]( R
以上Keil代码下载:! g2 V7 B3 N5 _( K/ g

4 m/ X- F" v7 c& B4 T) ~4 G
3 _6 I3 V" D( D/ x8 t3 A  K! _1 V2 H) T0 V! T& A4 V
1 _1 T) T' T4 n

003- 数码管实验.rar

54.65 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

推荐
发表于 2022-5-23 11:04 | 只看该作者
主要应用在什么方向?5 G1 V' a" Q# ^- {# N% `

点评

自学练习。很多项目都需要数码管显示呢!  详情 回复 发表于 2022-5-23 14:57

该用户从未签到

3#
发表于 2022-5-23 14:29 | 只看该作者
学习,练习。O(∩_∩)O哈哈~

该用户从未签到

4#
发表于 2022-5-23 14:57 | 只看该作者
hdubsgyd 发表于 2022-5-23 11:042 d+ `& _- t9 u- x7 G  M8 D. A- k
主要应用在什么方向?
2 A. w  h% ^  {3 |. _
自学练习。很多项目都需要数码管显示呢!
8 ?/ k4 O0 L( O+ U+ K( @, l7 U% ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 04:46 , Processed in 0.125000 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表