📄 新建 文本文档.txt
字号:
/* 一、排序实验
从虚拟终端输入8个任意数据,通过串口传送给单片机的led_buf缓冲区,并在8个led上显示;
按回车键对led_buf缓冲区中的数据进行由小到大排序,排序结果在led上显示。
(按退格键,去除前一个输入数据)
传送速率为1200波特,设fosc=12MHz,SMOD=0。
解:T1的计数初值x=230=0E6H */
//中断接收程序(8_1_R.C)
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar led_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //定义"0~7"段码
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义"8~f,空格"段码
uchar led_buf[8]={16,16,16,16,16,16,16,16}; //定义led缓冲区,显示空格。
char *p;
void display(void)
{ uchar i,SELE_B; uint j;
SELE_B=0x01; //设置位选码(选中最左边位)
for(i=0;i<8;i++)
{ P2=0x00; //关闭所有LED
P1=led_code[led_buf[i]]; //输出字形码
P2=SELE_B; //输出位选码
for(j=0;j<=25;j++); //延时211us
SELE_B<<=1; //产生下一位的位选码
}
}
void sort(uchar *p,uchar Size) //排序程序(入口参数:p指向数组的指针;Size元素个数)
{
bit Change;uchar i,j,Temp; //Change、i、Temp分别表示交换标志、循环控制、暂存变量
//Size--; //Size减1为比较次数
for(i=0;i<8;i++)
//*p=led_buf[i];
do
{
Change=0;
for(j=0;j<(Size-1);j++)
{if(led_buf[j]>led_buf[j+1])
{Change=1;
Temp=led_buf[j];
led_buf[j]=led_buf[j+1];
led_buf[j+1]=Temp;
}}}while(Change);
}
Trs() interrupt 4 //串口接收中断程序
{ uchar i;
RI=0; //接受中断标志清0
if(SBUF == 8 ) {for(i=7;i>0;i--) led_buf[i]=led_buf[i-1];led_buf[0]=16;}//是8时,退格调
else if(SBUF == 13) sort(led_buf , 8); //是13时,调用排序程序
else{ for(i=0;i<7;i++) led_buf[i]=led_buf[i+1]; //LED_BUF内容左移
*p=SBUF & 0x0F; //接受下一个数据
}
}
main()
{ TMOD=0x20; //T1方式2
TH1=0xe6; //波特率1200
TL1=0xe6; //波特率1200
TR1=1; //启动T1计数
SCON=0x50; //设置串口方式1(允许接受)
EA=1;ES=1; //开中断
while(1) //进入发送循环
{ p=led_buf+7; //指向显示缓冲区
display(); //显示接收数据
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -