51单片机跑马灯

本文介绍了一个使用51单片机实现P2口上的移位显示程序。通过两个循环实现了从左到右和从右到左的移位效果,并详细展示了如何利用循环和位操作实现移位功能。
 1 #include <reg51.h>
 2 
 3 void delay(unsigned int i);
 4 void SHR(unsigned char beginchar,unsigned char count,unsigned char stepcount,bit opretor,unsigned int delaytime);
 5 
 6 void main()
 7 {                
 8     unsigned int i;
 9     P2=0xff;
10 
11     while(1)
12     {  
13         for(i=0;i<8;i++)
14         {
15             SHR(0x7f,8-i,1,1,300);
16         }
17         for(i=0;i<8;i++)
18         {
19             SHR(0x80,8-i,1,0,300);
20         }
21     }
22 }
23 
24 void delay(unsigned int i)
25 {
26     unsigned char j;
27     for(i;i>0;i--)
28         for(j=255;j>0;j--);
29 }
30 void SHR(unsigned char beginchar,unsigned char count,unsigned char stepcount,bit opretor,unsigned int delaytime)
31 {        
32     unsigned char tempchar=0;    
33     unsigned char tempP2=0;
34     unsigned char endchar=beginchar;
35     tempchar=endchar<<(8-count);
36     endchar>>=count;
37     endchar=tempchar|endchar;
38     do{    
39         tempP2=P2;
40         if(opretor)
41         {          
42             P2=P2&beginchar;
43         }
44         else
45         {
46             P2=P2|beginchar;
47         }
48         delay(delaytime);
49 
50         tempchar=beginchar<<(8-stepcount);
51         beginchar>>=stepcount;
52         beginchar=tempchar|beginchar;
53 
54         if(beginchar!=endchar)
55         {
56             P2=tempP2;
57         }
58     }while(beginchar!=endchar);
59 }

 

转载于:https://www.cnblogs.com/joeycih/p/3352080.html

### 使用C51单片机实现跑马灯功能 #### 原理概述 在嵌入式系统开发中,C51 单片机是一种经典的微控制器平台,广泛应用于基础教学和实际项目开发。跑马灯(流水灯)是一个典型的入门级实验,用于展示单片机对 GPIO 的控制能力。其实现的核心在于通过对单片机端口寄存器的写操作来改变外部 LED 的状态。 以下是基于 C51 单片机实现跑马灯功能的具体方法: --- #### 硬件连接 假设 8 个 LED 连接到单片机的 P1 口(P1.0 至 P1.7),阳极接高电平,阴极通过限流电阻接地。当某一位设置为低电平时,对应的 LED 将被点亮;反之则熄灭[^3]。 --- #### 软件实现 以下是一段完整的 C51 单片机跑马灯代码示例: ```c #include <reg52.h> // 包含头文件,定义特殊功能寄存器 void delay(unsigned int time) { unsigned int i, j; for (i = 0; i < time; i++) // 外层循环决定延时长度 for (j = 0; j < 120; j++); // 内层循环消耗时间 } void main() { unsigned char temp = 0x01; // 初始化变量,表示第一个 LED 点亮 while (1) { // 主循环无限执行 P1 = temp; // 将当前状态赋给 P1 口 delay(500); // 延时函数调用,调整显示间隔 temp <<= 1; // 左移一位,使下一个 LED 点亮 if (!(temp & 0x80)) // 如果最高位未置位,则重置初始状态 temp |= 0x01; } } ``` 上述代码实现了从左至右依次点亮 LED 并返回起点的效果。其中 `delay` 函数提供了必要的视觉延迟,使得灯光移动更加明显[^4]。 --- #### 扩展功能 如果希望增加反向流动或其他动态效果,可以通过修改核心逻辑轻松完成。例如,在原有基础上加入逆序遍历部分即可形成双向运动模式: ```c while (1) { // 正向扫描 for (unsigned char i = 0; i < 8; i++) { P1 = 0xFE << i; // 动态更新掩码值 delay(500); } // 反向扫描 for (unsigned char i = 0; i < 8; i++) { P1 = ~(0xFE << i); // 对原掩码取反得到镜像序列 delay(500); } } ``` 此版本展示了正反两个方向上的连续变换过程[^5]。 --- #### 注意事项 - **初始化配置**:确保所有涉及 I/O 引脚的方向已正确设定为输出。 - **电源管理**:合理分配供电电压以保护外设免受过载损害。 - **程序优化**:适当调节延时参数平衡功耗与用户体验之间的关系。 --- ### 总结 借助简单的硬件搭建配合精心设计的算法结构,利用 C51 单片机能高效达成丰富多彩的视觉呈现目标。这对于培养初学者动手能力和逻辑思维具有重要意义[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值