51单片机实验课二

实验任务一:

用C语言设计实现8个led灯左右移动显示效果。具体要求如下:

左移时,8个灯中的奇数位灯依次点亮;

右移时,8个灯中的偶数灯依次点亮;

如此循环往

复制代码
#include <REGX52.H>
void Delay(unsigned int xms)		//可自定义延时时间段的延时函数
{
	unsigned char i, j;
	while(xms)
	{
		xms--;
		i = 12;
		j = 169;
	do
	{
		while (--j);
	} while (--i);
	}
}
void main()
{
	unsigned char i,j;
	
	while (1)         //主循环
  {
		//LED灯为低电平点亮
		P2=0xFD;
	    //1111 1101(灯7亮)
		for(i=0;i<4;i++)   
	  //加入 for循环,表明for循环大括号中的程序循环执行4次
		{
			Delay(100);				
			P2<<=2;
			//1111 0100  
			//1101 1100  
			//0111 1100   
			P2=P2|0x03;//0000 0011
			//1111 0111(灯5亮)  
			//1101 1111(灯3亮)  
			//0111 1111(灯1亮)

		} 
		P2=0xBF;
		    //1011 1111(灯2亮)
		for(i=0;i<4;i++)
		{
			Delay(100);				
			P2=P2>>2;
			//0010 1111  
			//0011 1011
			//0011 1110
		    P2=P2|0xC0;
			//1110 1111(灯4亮)
			//1111 1011(灯6亮)
			//1111 1110(灯8亮)
		}
			P2=0xFE;           //重新赋初始值
  }
}

实验任务二:

动态扫描显示---Digital-tube-stable-display

用8个数码管从左到右稳定显示自己的学号的后8位

复制代码
#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;				//段码清零,消影
}

void main()
{
	while(1)
	{
		Nixie(1,2);		//在数码管的第1位显示2
		Nixie(2,2);		//在数码管的第2位显示2
		Nixie(3,2);		//在数码管的第3位显示2
		Nixie(4,1);   //在数码管的第4位显示1
		Nixie(5,0);		//在数码管的第5位显示0
		Nixie(6,2);		//在数码管的第6位显示2
		Nixie(7,1);		//在数码管的第7位显示1
		Nixie(8,4);		//在数码管的第8位显示4
	}
}

实验任务三:

Digital-tube-scrolling-display

将自己的学号每隔一定时间向右或向左滚动循环显示出来

复制代码
#include <REGX52.H>
sbit LED0=P2^4;
sbit LED1=P2^3;
sbit LED2=P2^2;
#define tube P0
#define N 500
unsigned char code zima[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//存储数码管段选码
unsigned char number[10]={2,0,2,2,2,1,0,2,1,4};//存储学号信息
void delay(int i)		//延时函数
{
	while(i--);
}

void main()
{
	unsigned int i,j,k,m,n,time;		//定义变量
	while(1)
	{
		for(m=0;m<17;m++)			//滚动显示过程等效为17位
		{
			time=100;						
			while(time--)
			{
				n=7;
				for(i=0;i<2;i++)			
				{
					LED0=i;					//控制位选
					for(j=0;j<2;j++)			
					{
						LED1=j;					//控制位选
						for(k=0;k<2;k++)			
						{
							LED2=k;					//控制位选
							if((n+m-7>9)||(n+m-7<0))			//控制段选
								tube=0x00;
							else
								tube=zima[number[n+m-7]];
							n--;
							delay(100);		//延时
							tube=0x00;	//消隐
						}
					}
				}
			}
		}
	}
}

main 函数中使用了嵌套的循环来完成滚动显示学号的功能。

  • 外层循环 m 从 0 循环到 16,表示滚动显示的过程等效于 17 位。

  • 内层循环 time 从 100 循环减至 0,用于控制延时。

  • 在内层循环中,使用 n 来记录当前的位数,并在每次循环中减 1,用于控制位选。因为涉及到3个位选,所以有 2 * 2 * 2 = 8 种组合,所以需要三个嵌套循环。

  • 在每次位选循环中,判断 n+m-7 是否大于 9 或小于 0,如果是,则设置段选为 0x00,否则设置 tube 为对应的学号段选码。

  • 每次段选完之后,使用 delay 函数进行延时并清空 tube

相关推荐
guygg8818 小时前
基于霍尔传感器的BLDC控制源码
单片机·嵌入式硬件
长安第一美人21 小时前
工业级实时监控系统开发:PHP+ZMQ+JS 前后端分离架构全解析
前端·嵌入式硬件·架构·交互·rk3588·zmq后端
田甲1 天前
STM32开发环境迁移实践:从 CubeMX 生成 CMake 工程到 VS Code 编译与调试
stm32·单片机·嵌入式硬件
hoiii1871 天前
在 STM32F1上读取 BMX055 三轴加速度
stm32·单片机·嵌入式硬件
嵌入式小站1 天前
STM32 零基础可移植教程 04:按键输入,为什么按下去读到的是 0 或 1
chrome·stm32·嵌入式硬件
三佛科技-187366133971 天前
BP8522D贴片SOP7,5V150mA高集成度无VCC电容降压型恒压芯片解析
单片机·嵌入式硬件
csg11071 天前
MSP430F149驱动T8650北斗模块实现短报文通信实战
单片机·嵌入式硬件·物联网·自动化
hoiii1871 天前
基于STM32的音频播放系统,实现SD卡读取音频文件PWM输出播放
stm32·嵌入式硬件·音视频
Deitymoon1 天前
STM32——软件IIC显示字符
stm32·单片机·嵌入式硬件
百万老师1 天前
自然语言编程时代,如何零基础学习掌握嵌入式编程
c语言·单片机·嵌入式硬件·学习·ai全流程闭环开发