基于单片机8051的LED显示控制程序
#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int uchar code Table[]= { 0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,//0 0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,//1 0x00,0x7E,0x02,0x02,0x7E,0x40,0x40,0x7E,//2 0x00,0x7E,0x02,0x02,0x7E,0x02,0x02,0x7E,//3 0x00,0x48,0x48,0x48,0x7E,0x08,0x08,0x08,//4 0x00,0x7E,0x40,0x40,0x7E,0x02,0x02,0x7E,//5 0x00,0x7C,0x40,0x40,0x7C,0x44,0x44,0x7C,//6 0x00,0x7C,0x04,0x04,0x04,0x04,0x04,0x04,//7 0x00,0x7C,0x44,0x44,0x7C,0x44,0x44,0x7C,//8 0x00,0x7E,0x42,0x42,0x7E,0x02,0x02,0x7E,//9
}; uint r= 0; char offset = 0; uchar Current_Level = 1,Dest_Level=1,x=0,t =0;
void main() { P1 = 0x80; Current_Level = 1;//?1???? TMOD = 0x01; //T0???? TH0 = -4000/256;//4ms//?????8?? TL0 = -4000%256; TR0=1; IE = 0x92;//???????? EA =1; while(1); }
void Serial_Receive() interrupt 4 { //????? unsigned char val=0; //TMOD=0010 0000B,???1?????2 TMOD=0x20; //SCON=0101 0000B,?????????1,???? SCON=0x50; PCON=0x00;//PCON??SMOD=0 TH1=0xFD;TL1=0xFD;//????9600b/s TR1=1;//??T1,???????? while(1) { while(RI==0); RI = 0;//????????? val=SBUF; P2=val; if (Dest_Level == Current_Level && SBUF != 0xff) { if (val ==0xfe)Dest_Level =5; if (val ==0xfd)Dest_Level =4; if (val ==0xfb)Dest_Level =3; if (val ==0xf7)Dest_Level =2; if (val ==0xef)Dest_Level =1; } } }
void Led_Dispaly() interrupt 1 { uchar i; //??????,???????,??????? if (Dest_Level == Current_Level && SBUF != 0xff) { Dest_Level = SBUF; SBUF = 0x00;
}
TH0 = -4000/256;//4ms
TL0 = -4000%256;
P1 =_crol_(P1,1);
i = Current_Level *8 + r + offset;
P0 = ~Table[i];
//up
if (Current_Level < Dest_Level )
{
if ( ++r ==8)
{//?????8??
r =0;
if( ++x ==4)
{//???x??????
x = 0;
if(++offset ==8)
{
offset = 0;
Current_Level++;
}
}
}
}
//down
else if(Current_Level > Dest_Level )
{
if ( ++r ==8)
{//?????8??
r =0;
if( ++x ==4)
{//???x??????
x = 0;
if(--offset == -8)
{
offset = 0;
Current_Level--;
}
}
}
}
//????,?????????
else
{
if ( ++r ==8) r =0;
}
}'
优化说明:
- 标题: 采用更具描述性的标题,例如 '基于单片机8051的LED显示控制程序',方便用户搜索相关内容。2. 描述: 添加简要描述,概括程序的功能,例如 '本程序使用单片机8051实现LED显示控制,通过串口接收指令,控制LED的上下移动。'3. 关键词: 添加与程序相关的关键词,例如 '单片机, 8051, LED显示, 串口通信, 代码优化',帮助搜索引擎理解程序内容。4. 代码格式: 调整代码格式,使用单引号代替双引号,方便搜索引擎识别代码。5. 内容优化: 添加一些解释性文字,例如代码中的注释,帮助用户理解程序的逻辑。6. 代码优化: 针对串行通信部分的逻辑进行优化,建议使用非阻塞方式接收串口数据,避免程序卡死在接收函数中。
关于串行通信部分的建议:
- 使用非阻塞方式接收串口数据: 建议使用中断方式接收串口数据,并在中断服务函数中处理数据。这样可以避免程序卡死在接收函数中,同时提高程序的实时性。2. 初始化串口: 在程序开始前,需要对串口进行初始化,包括波特率设置、数据格式设置等。3. 处理接收数据: 在接收数据后,需要对数据进行处理,例如解析数据格式、执行相应的操作等。
**示例代码:**c#include <reg51.h>#include <intrins.h>
// ... 其他代码 ...
// 串口中断服务函数void Serial_Receive() interrupt 4 { // 接收数据 if (RI == 1) { RI = 0; // 清除接收标志 unsigned char val = SBUF;
// 处理接收数据 if (Dest_Level == Current_Level && val != 0xff) { if (val == 0xfe) Dest_Level = 5; if (val == 0xfd) Dest_Level = 4; // ... 处理其他数据 ... } }}
void main() { // ... 其他代码 ...
// 初始化串口 TMOD = 0x20; // 设置定时器模式为模式2 SCON = 0x50; // 设置串口控制寄存器 PCON = 0x00; // 设置PCON寄存器,SMOD = 0 TH1 = 0xFD; // 设置定时器1高字节,波特率9600 TL1 = 0xFD; // 设置定时器1低字节,波特率9600 TR1 = 1; // 启动定时器1 IE |= 0x92; // 开启串口中断和定时器0中断 EA = 1; // 开启总中断 // ... 其他代码 ..
原文地址: https://www.cveoy.top/t/topic/gesU 著作权归作者所有。请勿转载和采集!