标题:
单片机串口发射 接收显示二极管,四个按键控制四种显示状态
[打印本页]
作者:
电子发烧人
时间:
2020-6-15 22:33
标题:
单片机串口发射 接收显示二极管,四个按键控制四种显示状态
按键1按下从上到下点亮
按键2按下从两头往中间点亮
按键3按下从中间往两边点亮
按键4按下从下面往上点亮
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png
(15.15 KB, 下载次数: 73)
下载附件
2020-6-16 15:26 上传
单片机源程序如下:
#include<reg51.h>
#define ILEN 8 //接收缓冲区大小
unsigned char display_data[ILEN][8]; //显示方式数据缓冲存储区
unsigned char istart=0; //接收缓冲区起始索引
unsigned char iend=0; //接收缓冲区结束索引
unsigned int dat_size[ILEN]=0; //显示方式数据长度存储区
/******************************************************
函数功能:延时N微秒
******************************************************/
void delay_nus(unsigned int i)
{
i=i/10;
while(--i);
}
/******************************************************
函数功能:延时N毫秒
******************************************************/
void delay_nms(unsigned int n)
{
n=n+1;
while(--n)
delay_nus(900);
}
void main()
{
unsigned char j;
TMOD=0x20; //定时器T1工作方式2
SCON=0x50; //串口工作方式1
PCON=0x00; //SMOD=0,波特率不倍增
TH1=0xfd;
TL1=0xfd; //根据规定给定时器T1赋初值,即波特率为9600b/s
TR1=1; //启动定时器T1
ES=1; //串口中断允许
EA=1; //开启总中断
while(1)
{
while(iend == istart) //等待数据缓冲区出现新数据
;
for(j=0;j < dat_size[istart & (ILEN-1)];j++) //根据显示数据长度取出数据
{
P1=display_data[istart & (ILEN-1)][j]; //送显示数据
delay_nms(500);
}
istart++; //为下次从缓冲区取出一组显示数据做好准备
}
}
/******************************************************
函数功能:串口中断接收服务函数
******************************************************/
void com_isr() interrupt 4 using 1
{
unsigned char c;
static unsigned char i=0;
if(RI==1) //是否接收完成
{
c=SBUF; //从缓冲寄存器中取出数据
RI=0; //软件清零
if(istart+ILEN !=iend ) //判断缓冲区是否以存满
{
if(c!=0xff) //判断接收的数据是否是结束标志数据
{
display_data[iend & (ILEN-1)][i++]=c; //缓冲区接收数据
}
else //一组显示数据接收完成
{
dat_size[iend & (ILEN-1)]=i; //同时存储该组数据的长度
iend++; //为接收下组数据做好准备
i=0;
}
}
}
}
复制代码
所有资料51hei提供下载:
串口发射 接收四种方式点亮8个二极管.rar
(78.96 KB, 下载次数: 15)
2020-6-15 22:32 上传
点击文件名下载附件
串口点亮LED二极管
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1