按键1按下从上到下点亮
按键2按下从两头往中间点亮
按键3按下从中间往两边点亮
按键4按下从下面往上点亮
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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)
|