51单片机--动态数码管

1.如果我们想要数码管显示数字1,2,3该怎么做呢?

那我们直接写三个数字在形参里面不就可以了吗

 2.但是应该数码管是扫描式显示,所以会造成显示时每个数码管显示乱码的问题,那我们怎么解决呢?

我们加上断码消影就可以了

 

3.最终的代码呈现

#include <REGX52.H>

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//延时子函数
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出
	Delay(1);				//显示一段时间
	P0=0x00;				//段码清0,消影
}

//这样做就可以让数码管同时亮几个LED灯了
void main()
{
	while(1)
	{
		Nixie(1,1);		//在数码管的第1位置显示1

		Nixie(2,2);		//在数码管的第2位置显示2

		Nixie(3,3);		//在数码管的第3位置显示3

	}
}

4.最终呈现出来就是这个样子

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
交通灯设计 一.设计目的:00 1.进一步熟悉和掌握单片机的结构和工作原理。熟练掌握C语言的编程方法,将理论联 系到实践中,提高我们的思维能力。 2.用AT89C51的P1口作为输出口,控制12个发光二极管的点亮和熄灭,模拟交通灯管理 。 3.学习74LS245芯片驱动七数码管的显示的方法,使用数码管显示器定时及倒计时的 方法。 二.设计要求与主要内容: 设计要求:交通信号灯模拟控制系统设计利用单片机的定时器定时,令十字路口的红 绿灯交替点亮和熄灭,并且用LED数码管显示时间。用AT89C51的P1口作为输出口,控 制12个发光二极管的点亮和熄灭,模拟交通灯管理。在一个交通十字路口有一条主干 道(东西方向),一条从干道(南北方向),,四个路口安装红,黄,蓝,灯各一盏 。 1.设计一个十字路口的交通灯控制电路,要求南北方向(主干道)车道和东西方向( 从干道)车道两条交叉道路上的车辆交替运行。 2.在绿灯转为红灯时,要求黄灯先亮,才能变换运行车道。 3.东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用数码 管显示器进行显示(采用倒计时的方法)。 主要内容:假设一个十字路口为东西南北走向。初始状态为状态1,南北方向绿灯通车 ,东西方向红灯。经过过一时间(25S)转换状态2,南北方向绿灯转亮黄灯,延时 5S,东西方向仍然红灯。再转换到状态3,东西方向绿灯通车,南北方向红灯。过一 时间(25S)转换到状态4,东西方向绿灯转亮黄灯,延时5S,南北方向仍然红灯。最 后循环至南北绿灯,东西红灯。在这些状态下,有时钟倒数计时。 设计步骤: 1.利用Proteus 7 仿真软件按下列要求绘制仿真电路图 用12个发光二极管分别表示东、西、南、北四个方向的红、黄、绿灯; 用P1口输出控制模拟交通灯的状态使响应的发光二极管点亮或熄灭; 用P0口分别接74LS245芯片的A口,74LS245的B口分别接七数码管的八位引脚,P2 .0、P2.1七数码管的共阳极引脚; 2.利用Keil uVision3编写程序代码,编译生成.hex文件,将.hex文件导入仿真电路里的AT89C51芯 片中完成代码捆绑,在Proeus 7中运行观察结果。 三.设计程序原理: AT89C51的P1口接发光二极管,通过P1口输出控制发光二极管的亮、灭,进而模拟 显示出十字路口交通灯的各种状态,利用P0口和P1口作为字的片选信号输出。74LS 245芯片的A、B口串行输出时间位送到七数码管,从而驱动数码管显示各个状态倒计 时时间。 (1)仿真电路图如下图: (1-1) (2)程序流程图如下: (1-2) 四.程序代码: #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit P2_0=P2^0; //位定义 sbit P2_1=P2^1; uchar n=0,temp=0; uchar code segcode0[]={0x5b,0x06,0x3f,0x5b,0x06,0x3f,0x5b,0x06,0x3f}; uchar code segcode1[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f}; //部分位码表 void delay(x) //延时函数 { while(x--); } void time() interrupt 1 //定时倒计时函数 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; n++; temp=temp%61; if(n==20) { temp++; n=0; } if(temp<25) P1=0x21; if((temp>=25)&&(temp<28)) P1=0x22; if((temp>=28)&&(temp<30)) P1=0x24; if((temp>=30)&&(temp<55)) P1=0x0c; if((temp>=55)&&(temp<58)) P1=0x14; if((temp>=58)&&(temp<60)) P1=0x24; } main() //主函数 { uint i=0; TMOD=0x01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; TR0=1; while(1) { P2_0=0; P2_1=1; P0=segcode0[temp/10]; delay(3000); P2_0=1; P2_1=0; P0=segcode1[temp%10]; delay(3000); P2_1=1; } } 五.实验结果: 结
您可以使用51单片机的定时器和中断来控制动态数码管的显示。具体步骤如下: 1. 设置定时器的计数值和计数方式,以控制动态数码管的刷新频率。 2. 在定时器中断服务程序中,按照时间顺序依次输出每个数字的选信号和位选信号,来实现动态显示。 3. 在主函数中,将要显示的数字转换为相应的选信号,并按位存储到数组中。 下面是一个简单的示例代码,可以实现0-999999的动态数码管显示: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar digit[6]; // 存储要显示的6位数字的选信号 uchar index = 0; // 当前显示的数字的位数 // 定时器0中断服务程序 void timer0_isr() interrupt 1 { uchar i; // 输出当前位的选信号 P2 = digit[index]; // 输出当前位的位选信号 switch (index) { case 0: P0 = 0xfe; break; // 第1位,打开第1个数码管 case 1: P0 = 0xfd; break; // 第2位,打开第2个数码管 case 2: P0 = 0xfb; break; // 第3位,打开第3个数码管 case 3: P0 = 0xf7; break; // 第4位,打开第4个数码管 case 4: P0 = 0xef; break; // 第5位,打开第5个数码管 case 5: P0 = 0xdf; break; // 第6位,打开第6个数码管 } // 切换到下一位 index++; if (index > 5) { index = 0; } // 延时一定时间,以控制刷新频率 for (i = 0; i < 20; i++); } // 主函数 void main() { uint num = 123456; // 要显示的数字 // 将要显示的数字转换为相应的选信号,并按位存储到数组中 digit[0] = 0xc0 + num % 10; num /= 10; digit[1] = 0xc0 + num % 10; num /= 10; digit[2] = 0xc0 + num % 10; num /= 10; digit[3] = 0xc0 + num % 10; num /= 10; digit[4] = 0xc0 + num % 10; num /= 10; digit[5] = 0xc0 + num % 10; num /= 10; // 初始化定时器0,设置计数值和计数方式 TMOD = 0x01; // 定时器0,模式1,16位计数器 TH0 = 0xfc; // 计数值,定时500us TL0 = 0x66; TR0 = 1; // 启动定时器0 ET0 = 1; // 允许定时器0中断 // 主循环 while (1); } ``` 这个示例代码可以实现0-999999的动态数码管显示,您可以根据自己的实际需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值