当前位置: 首页 > news >正文

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 1110P2=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位显示2Nixie(2,2);		//在数码管的第2位显示2Nixie(3,2);		//在数码管的第3位显示2Nixie(4,1);   //在数码管的第4位显示1Nixie(5,0);		//在数码管的第5位显示0Nixie(6,2);		//在数码管的第6位显示2Nixie(7,1);		//在数码管的第7位显示1Nixie(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;elsetube=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

http://www.lryc.cn/news/294703.html

相关文章:

  • 1-4 动手学深度学习v2-线性回归的简洁实现-笔记
  • SQL如何实现数据表行转列、列转行?
  • 【React】redux状态管理、react-redux状态管理高级封装模块化
  • HAProxy 和负载均衡概念简介
  • 【go】ent操作之CRUD与联表查询
  • 服务器性能监控管理方法及工具
  • AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA和CAN协议2.0B的总线控制器研究与设计
  • 14.1 Ajax与JSON应用(❤❤)
  • ffmpeg命令生成器
  • JavaScript基础速成
  • openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志
  • 在vs code的terminal,debug执行python main.py --train True
  • docker 简单项目
  • 计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 四、机器学习基础概念介绍
  • Excel设置单元格下拉框(poi)
  • api接口是什么意思,api接口该如何防护呢?
  • PMP资料怎么学?PMP备考经验分享
  • partition by list(msn_id)子句的含义
  • 【C++】I/O多路转接详解(二)
  • PySpark(三)RDD持久化、共享变量、Spark内核制度,Spark Shuffle
  • 详解MYSQL中的平均值组大小
  • 【爬虫专区】批量下载PDF (无反爬)
  • PostgreSQL解决序列(自增id)自动增长冲突
  • 1.0 Zookeeper 分布式配置服务教程
  • (Flutter 常用插件整理
  • vue2.0+使用md-edit编辑器
  • Java设计模式大全:23种常见的设计模式详解(二)
  • 【算法与数据结构】718、1143、1035、392、115、LeetCode最长重复子数组+最长公共子序列+不相交的线+判断子序列+不同的子序列
  • OCR文本纠错思路