中国空间站扩建,如东网页设计,凯里网站开发,公司网站建设需要咨询什么问题目录
一、实验的背景和意义
二、实验目的
三、实验步骤
四、实验仪器
五、实验任务及要求
1#xff0c;从led4开始右移
1#xff09;思路
①起始灯 #xff08;led4#xff09;
②右移
2#xff09;效果
3#xff09;代码 2#xff0c;从其他小灯并向右依次…目录
一、实验的背景和意义
二、实验目的
三、实验步骤
四、实验仪器
五、实验任务及要求
1从led4开始右移
1思路
①起始灯 led4
②右移
2效果
3代码 2从其他小灯并向右依次点亮其他小灯
1从led3开始右移
2从led5开始右移
3从led6开始右移
4从led7开始右移
5从led8开始右移
6从led9开始右移 2完成一个左移到头接着右移右移到头再接着左移的花样流水灯程序。 1效果
2代码 一、实验的背景和意义 通过流水灯实验进一步增进对51单片机电路的感性认识加深对理论方面的理解。了解软硬件的有关知识并掌握软硬件设计过程、方法及实现为以后设计和实现应用系统打下良好基础。另外通过简单课题的设计练习使我们了解必须提交的各项工程文件达到巩固、充实和综合运用所学知识解决实际问题的目的。 本实验采用STC89C52RC单片机为中心器件来实现P0并行口控制8只LED小灯进行流水灯显示实验。
二、实验目的 1、进一步掌握编程软件Keil uVision4和下载软件STC-ISP-v4.80等的使用方法 2、掌握51单片机并行口输出方式的编程 3、掌握延时程序的编写和应用。
三、实验步骤 同51单片机实验01-点亮LED小灯-CSDN博客相应操作。
四、实验仪器 计算机1台、KST-51开发板1套。 五、实验任务及要求 1从led4开始右移
学号末位和小灯对应关系同51单片机实验01-点亮LED小灯-CSDN博客。具体操作见本实验的后续要求。按照上述学号末尾对应的小灯作为开始依次向右点亮其他小灯并循环进行流水灯显示实验编写完整c语言代码。 相关资料请通过链接下载 链接https://pan.baidu.com/s/1QEDpuNhcYVB6lmxFNW2z4Q?pwd6666 提取码6666 --来自百度网盘超级会员V1的分享 1思路 因为我学号末尾时4因此这里先以led4作为讨论的对象其他的led灯皆可以此类推进行点亮。
①起始灯 led4
在实验01中因为我只需要点亮一个小灯因此需要用到P0口的只有一位但是如果我要实现流水灯的效果就需要使用到P0口的其他七位来依次点亮led灯即用到P0.0~P0.7分别对应led2~led9。
最右边的小灯led2的P0口需要输入0b1111 1110 就是将最后一个led灯输入为低电平。其它为高电平就会亮指定的led灯。
同理led3亮起的二进制为0b1111 1101led4为0b1111 1011led5为0b1111 0111.......
通过观察不难发现都是0的移动。如果想要实现小灯向右移动就需要0向左移其它位为1。这个时候就引入了位移左移和右移这个概念顾名思义位移需要在二进制中进行因为只有二进制数的每一个位都是显示出来的。当一个数开始向左移动时它的左边就会溢出舍弃右边就会产生空位且产生的空位会自动给零补全。
这个时候我将led40b1111 1011向左平移一位
就会得到 0b0111 0110和led3的0b1111 1011不相等。显然光通过位移是没法满足我的需求的这个时候就可以再加上取反~这一运算可以先将led40b1111 1011取反→变成0b 0000 0100→之后再右移一位→得到0b 0000 0010。该二进制和led3 的0b1111 1011就差了取反。再次取反就可得到led3。
【为什么会想到取反主要是因为当用到位移而二进制中只有一个0其他数为1时这个时候就可以对该二进制取反再位移能够很好的实现我想要的结果。】
因此我可以直接拿led40b1111 1011取反后的结果0b 0000 0100来进行右移最后再取反。
0b 0000 0100换算成十六进制为0x04之后再取反因此令P0~0x04。
就可以让led4灯作为起始灯亮起来。
②右移
实现右移就是让起始灯led4自己指定位置的灯的值0x01依次向右移1。我需要在main方法里面定义一个变量r_move来控制向右移动的位数当r_move为0时表示没有移位亮的是当前的起始灯led4r_move1时向右移动1位亮起led3以此类推。
2效果 从指定位置的led开始右移 3代码
#includereg52.h
sbit addr0P1^0; // 138译码器低位输入
sbit addr1P1^1; // 138译码器中位输入
sbit addr2P1^2;// 138译码器高位输入
sbit addr3P1^3; // 使能端es
sbit enledP1^4; // 使能端 e1和e2
void main(){unsigned int r_move0; // 右移变量unsigned int i0; // for循环的形参addr21; // 高电平addr11;addr00; // 低电平enled0;addr31; while(1){P0~(0x04r_move); // 从led4开始右移for(i0;i40000;i); //软件延时r_move; //右移的位数自增if(r_move3){ // 如果移到最右边了就右移位数重置位0r_move0;}}} 2从其他小灯并向右依次点亮其他小灯
以下是我的草稿 呈现效果都测试过都OK。如果不OK就评论区留言或者是私信我最近放假都在线。
1从led3开始右移
令P0 ~(0x02r_move); 因为led3加上右边的led2只需要进行两个位移所以需要修改下面代码 if(r_move2){ // 如果移到最右边了就右移位数重置位0r_move0;}
2从led5开始右移
只需要修改下面两处 3从led6开始右移 只需要修改下面两处 4从led7开始右移
只需要修改下面两处 5从led8开始右移
只需要修改下面两处 6从led9开始右移
只需要修改下面两处 2完成一个左移到头接着右移右移到头再接着左移的花样流水灯程序。 1效果 从左到右再从右到左的流水灯1 2代码
#includereg52.h
sbit addr0P1^0; // 138译码器低位输入
sbit addr1P1^1; // 138译码器中位输入
sbit addr2P1^2;// 138译码器高位输入
sbit addr3P1^3; // 使能端es
sbit enledP1^4; // 使能端 e1和e2
void main(){unsigned int r_move0; // 右移变量unsigned int i0; // for循环的形参addr21; // 高电平addr11;addr00; // 低电平enled0;addr31; while(1){if(r_move16){r_move0; //第一次从左到右再从右到左完成后让位移重置为0}else if(r_move8){P0~(0x80r_move); // 从led9开始右移for(i0;i30000;i); //软件延时}else if(r_move8 r_move16){ P0~(0x01(r_move-8)); // 如果移到最右边了就将P0重新赋值for(i0;i30000;i); //软件延时}r_move; //右移的位数自增}} 有问题请在评论区留言或者是私信我一天8h在线。