本文主要是介绍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
。
这篇关于51单片机实验课二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!