‘壹’ 51单片机流水灯程序
程序如下:
#include <reg52.h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;
void main()
{
int i,j;
//点亮第一个灯
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//延时1秒
for(i = 0;i < 110; ++i)
{
for(j = 0; j < 1000; ++j)
{
;//什么也不做
}
}
//点亮第二个灯
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//点亮剩余的灯
//省略……
while(1);
}
流水灯几点说明:
void:因为该延时函数不需要返回值,所以写为void
delay1s:该函数的函数名,命名需要符合C语言的标识符命名规则。
(): 不需要传入参数,所以括号中为空
至此我们可以把流水灯程序写为以下形式:
‘贰’ 51单片机执行程序的过程
单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。
取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。
计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。
一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。
下面我们将举个实例来说明指令的执行过程:
开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取
出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。
例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,
0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:
1 程序计数器的内容(这时是0000H)送到地址寄存器;
2 程序计数器的内容自动加1(变为0001H);
3 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;
4 CPU使读控制线有效;
5 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。
至此,取指阶段完成,进入译码分析和执行指令阶段。
由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完毕。单片机中PC=0002H,PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。
‘叁’ 跪求一个51单片机控制ws2812灯带的程序,
WS2812是一种自带驱动IC的LED灯珠,可以通过程序控制每个LED的颜色和亮度。以下是一个简单的程序,用于控制144个WS2812 LED灯珠。这个程序是用C语言编写的,用于STC89C52RC单片机。
首先,我们需要知道WS2812数据传输协议的一些基本概念。WS2812 LED灯珠需要接收24位数据,每8位代表一个颜色(红色,绿色,蓝色)。数据以GRB顺序发送,即先发送绿色,然后是红色,最后是蓝色。每一位数据由一个高电平脉冲和一个低电平脉冲组成。如果高电平脉冲长于低电平脉冲,那么这一位被认为是1;如果低电平脉冲长于高电平脉冲,那么这一位被认为是0。
以下是一个示例程序:
```c
#include <reg51.h>
#define F_CPU 11059200UL // 11.0592 MHz
#define DELAY_COEFFICIENT 12 // 延迟系数
// 定义端口
sbit LED = P1^0;
// 延迟函数
void delay(unsigned int us)
{
while (us--);
}
// 发送一个比特
void send_bit(unsigned char bit_val)
{
if(bit_val)
{
// 发送逻辑1
LED = 1;
delay(DELAY_COEFFICIENT);
LED = 0;
delay(DELAY_COEFFICIENT / 3);
}
else
{
// 发送逻辑0
LED = 0;
delay(DELAY_COEFFICIENT / 3);
LED = 1;
delay(DELAY_COEFFICIENT);
}
}
// 发送一个字节
void send_byte(unsigned char byte_val)
{
unsigned char i;
for(i=0; i<8; i++)
{
send_bit((byte_val & (0x80 >> i)) != 0);
}
}
// 发送颜色值
void send_color(unsigned char r, unsigned char g, unsigned char b)
{
send_byte(g);
send_byte(r);
send_byte(b);
}
// 更新LED灯带
void update_led_strip()
{
LED = 0;
delay(DELAY_COEFFICIENT * 30);
}
// 主函数
void main()
{
unsigned char i;
while(1)
{
// 遍历每个LED灯珠
for(i=0; i<144; i++)
{
// 指定颜色值
send_color(0xFF, 0x00, 0x00); // 红色
}
// 更新LED灯带
update_led_strip();
// 延时
delay(F_CPU); // 延时1秒
}
}
```
此程序将所有LED设置为红色,然后通过循环不断更新LED灯带。请注意,您需要根据实际硬件连接来调整`LED`宏定义。您也可以修改`send_color`函数调用来改变灯珠的颜色。
请注意,`delay`函数的实现取决于您的具体硬件和编译器。在某些情况下,您可能需要提供更精确的延迟函数以满足WS2812的时间要求。我在这里使用了一个简单的循环延迟,这可能不是最佳的实现方式,但应该足够用于大多数场合。如果您遇到问题,可能需要使用其他方法(例如定时器)来实现更精确的延迟。
此外,这个程序没有考虑到电源的限制。WS2812 LED灯珠在全亮状态下会消耗大约60毫安的电流。如果所有144个灯珠都全亮,那么总电流将达到8.64安培,这可能超过了您的电源的能力。在实际使用中,您可能需要考虑如何合理地控制每个LED的亮度,以确保总电流在电源的承受范围内。
此外,这个程序没有考虑到电源的限制。WS2812 LED灯珠在全亮状态下会消耗大约60毫安的电流。如果所有144个灯珠都全亮,那么总电流将达到8.64安培,这可能超过了您的电源的能力。在实际使用中,您可能需要考虑如何合理地控制每个LED的亮度,以确保总电流在电源的承受范围内。
最后,需要注意的是,这个程序是一个基本的示例,它仅仅是将所有的LED灯珠设置为红色。如果您想实现更复杂的效果,比如让LED灯珠显示不同的颜色,或者实现动画效果,那么您可能需要修改这个程序,或者使用更高级的库或框架。
‘肆’ 怎么用c语言编程51单片机读写程序
编程代码如下:
ORG 0000H
MOV DPTR,#1000H ;给源数据块地址指针DPTR赋初值
MOV P2, #20H ;给目的数据块地址指针P2和R0赋初值
MOV RO,#00H
LOOP: MOVX A, @DPTR .
MOVX @RO, A .
INC DPTR
INC RO
CJNE RO,#64H, LOOP
SJMP $
(4)51单片机完整程序扩展阅读
MCS-51单片机主要由下列部件组成:1个8位CPU;1个片内振荡器及时钟电路;4KB ROM程序存储器,256BRAM;21个特殊功能寄存器。
2个1 6位定时/计数器;4个8位并行I/O口及1个可编程全双工串行接口;可寻址64KB的外部程序存储器空间;可寻址64KB的外部数据存储器空间;5个中断源、两个优先级中断嵌套中断结构。
MCS-51单片机内部有两个16位可编程的定时/计数器,简称定时器0 (T0) 和定时器1 (T1) 。它们分别由方式寄存器TMOD、控制寄存器TCON和数据寄存器TH0、TLO, TH1、TL1组成。
低优先级中断源可被高优先级中断源所中断,而高优先级中断源不能被任何中断源所中断;一种中断源(不管是高优先级还是低优先级) 一旦得到响应,与它同级的中断源不能再中断它。当同时收到几个同一优先级的中断时,响应哪一个中断源取决于内部查询顺序。