51单片机8位数码管显示学号变化

51单片机晶体管显示学号变化

学号使用 202107051234 作为演示

流水显示

效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重新一轮

在这里插入图片描述
代码如下
下面展示一些 流水显示的代码

#include<reg52.h>
#include<intrins.h>
void delay(unsigned int n)//延时函数
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}
void main()
{		
int i=0,t=0,j,r,a=0,shu=0;
	
while(1){
        
                r = t+a;             //r为显示的哪个
				if(r>=13){r=r-13;}   //加空白共13位
	    		P2 = dofly_WeiMa[i]; //显示
		        P0 = dofly_DuanMa[r];
				delay(3);
				i++;
				t++;
		    	if(t==8){t=0;}  //同时只能显示8个
				if(i==8){i=0;}
			
			  if(shu==300){a = a+1;if(a==13){a=0;}shu=0;}
			  shu++;
        }
}
循环显示

效果
在这里插入图片描述
在这里插入图片描述

然后开始下一轮循环

代码如下
下面展示一些 循环显示的代码

#include<reg52.h>
#include<intrins.h>
void delay(unsigned int n)//延时函数
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}
void main()
{		
int i_2=0,shu_2=0,r_2,a_2=0;
	
while(1){
        
			    r_2 = i_2+a_2;
			  	P2 = dofly_WeiMa[i_2];
		        P0 = dofly_DuanMa[r_2];
				delay(3);

				i_2++;
				shu_2++;
				if(i_2==8){i_2=0;}
				if(shu_2==500){a_2=8;}      //大约显示1s后转换
				else if(shu_2==1000){a_2 = 0;shu_2 = 0;}

        }
}
顺序显示

效果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
依次循环

代码如下
下面展示一些 顺序显示的代码

#include<reg52.h>
#include<intrins.h>
void delay(unsigned int n)//延时函数
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}
void main()
{		
int i_3 = 0;
	
while(1){
        
			  	P2 = dofly_WeiMa[0];
		        P0 = dofly_DuanMa[i_3];
				delay(300)  ;
			  	i_3++;
				if(i_3==13){i_3=0;}

        }
}

protues用仿真实现

仿真图如下
左边很多器件没有体现是因为此仿真图有部分与本次无关的期间没有显示
左边很多器件没有体现是因为与次实验无关

//整体代码

#include<reg52.h>
#include<intrins.h>

typedef unsigned char uchar;
typedef unsigned int uint;
unsigned char code dofly_DuanMa[]={0x5b,0x3f,0x5b,0x06,0x3f,0x07,0x3f,0x6d,0x06,0x5b,0x4f,0x66,0x00,0x00,0x00,0x00};	   // 显示段码值202107041234

unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};					//分别对应相应的数码管点亮,即位码
sbit key1 = P3^2;  
sbit key2 = P3^3; 
sbit key3 = P3^7; 

void delay(unsigned int n)
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}
uint x = 3;	//判断显示方式
void main()
{
int i=0,t=0,j,r,a=0,shu=0;
int i_2=0,shu_2=0,r_2,a_2=0;
int i_3 = 0;


	    IE = 0X85;	
		IT0 = 1;
		IT1 = 1;

while(1){	
			if(key3==0){x=3;}      //若顺序显示按下,则按照顺序显示

			if(x==0){			   //流水显示
              
			    r = t+a;
				if(r>=13){r=r-13;}
	    		P2 = dofly_WeiMa[i];
		        P0 = dofly_DuanMa[r];
				delay(3);
				i++;
				t++;
		    	if(t==8){t=0;}
				if(i==8){i=0;}
			
			  if(shu==300){a = a+1;if(a==13){a=0;}shu=0;}
			  shu++;

			  i_2=0;shu_2=0;a_2=0;   //若进入循环显示则重新显示
			  }


			  else if(x==1)			 //循环显示
			  {
			    r_2 = i_2+a_2;
			  	P2 = dofly_WeiMa[i_2];
		        P0 = dofly_DuanMa[r_2];
				delay(3);

				i_2++;
				shu_2++;
				if(i_2==8){i_2=0;}
				if(shu_2==500){a_2=8;}
				else if(shu_2==1000){a_2 = 0;shu_2 = 0;}

				i=0;t=0;a=0;shu=0;
			  
			  }
			  

			  else{
			  
			  	P2 = dofly_WeiMa[0];
		        P0 = dofly_DuanMa[i_3];
				delay(300)  ;
			  	i_3++;
				if(i_3==13){i_3=0;}
			  
			  	i_2=0;shu_2=0;a_2=0;
				i=0;t=0;a=0;shu=0;
			  }



		 }
}

void EX0_INT(void) interrupt 0	//中断 流水显示
{
x=0;	  
}
void EX1_INT(void) interrupt 2  //中断 循环显示
{
 x=1;
}
	  
	  

  • 28
    点赞
  • 201
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
假设学号为"20210001",可以通过以下步骤实现: 1. 定义8个引脚分别连接到8位数码管的8个引脚,以及一个引脚连接到数码管的位选引脚。 2. 在51单片机上编写程序,将学号的每一位数字转换为对应的数码管段码,存储到一个数组中。 3. 循环遍历该数组,每次将一个数码管段码输出到相应的数码管引脚上,并同时将当前数码管的位选引脚输出高电平,使该数码管被选中亮起。 4. 程序每次循环后,将位选引脚向下移动一位,以便选择下一个数码管。 以下是一个简单的示例代码: ``` #include <reg51.h> // 51单片机头文件 // 数码管段码定义 unsigned char code segCode[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F // 9 }; // 数码管引脚定义 sbit D1 = P0^0; sbit D2 = P0^1; sbit D3 = P0^2; sbit D4 = P0^3; sbit D5 = P0^4; sbit D6 = P0^5; sbit D7 = P0^6; sbit D8 = P0^7; sbit WE = P1^0; void main() { unsigned char code stuNo[] = "20210001"; // 学号 unsigned char i = 0; // 循环计数器 while (1) { // 输出当前数码管的段码 switch (i) { case 0: D1 = segCode[stuNo[i] - '0']; break; case 1: D2 = segCode[stuNo[i] - '0']; break; case 2: D3 = segCode[stuNo[i] - '0']; break; case 3: D4 = segCode[stuNo[i] - '0']; break; case 4: D5 = segCode[stuNo[i] - '0']; break; case 5: D6 = segCode[stuNo[i] - '0']; break; case 6: D7 = segCode[stuNo[i] - '0']; break; case 7: D8 = segCode[stuNo[i] - '0']; break; } // 输出位选引脚高电平,选择当前数码管 switch (i) { case 0: WE = 0xFE; break; case 1: WE = 0xFD; break; case 2: WE = 0xFB; break; case 3: WE = 0xF7; break; case 4: WE = 0xEF; break; case 5: WE = 0xDF; break; case 6: WE = 0xBF; break; case 7: WE = 0x7F; break; } // 延时一段时间,保证数码管刷新 for (int j = 0; j < 100; j++); // 将位选引脚向下移动一位 WE = 0xFF; // 指向下一个数码管 i++; if (i >= 8) i = 0; } } ``` 注意,此代码仅为示例,实际应用中还需要根据具体硬件调整引脚定义和位选引脚输出顺序等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值