本程序摘自张志良编著著《单片机实验实训100例——基于Keil C和Proteus》 ISBN 978-7-5124-1603-1北航出版社。
从串口随机输入16个数据,然后再从串口分二行分别输出其排序前后的数据。
#include <reg51.h> //包含访问sfr库函数reg51.h
#include <stdio.h> //包含I/O库函数stdio.h
#define uchar unsigned char //用uchar表示unsigned char
void main ( ) { //主函数
uchar data i,j,k,m; //定义字符型变量i、j、k(最大值序号)、m(暂存器)
uchar data a[16]; //定义整型数组a[16]
TMOD=0x20; //串口初始化:定时器1工作方式2;
TH1=TL1=0xE6; //置1200波特率(fosc=12MHz)
SCON=0x52; //串口方式1,允许接收,清发送中断
TCON=0x40; //设置中断控制,启动T1
for(i=0; i<16; i++) //for循环
scanf("%bu",a+i); //串口输入数组a数据(无符号字符型十进制整数)
for(i=0; i<16; i++) { //for循环
if (i%8==0) printf("\n"); //若i是8的整倍数,换行(输出时,8个一行)
printf ("a[%bu]=%bu,",i,a);} //输出数组a原始数据元素
for(i=0; i<15; i++) { //for循环,选择法排序
k=i; //最大值序号k赋值,设最大值为首个元素
for(j=i; j<16; j++) //for循环,依次与后续数组元素比较,选出最大值
if (a[k]<a[j]) k=j; //比较,若a[k] <a[j],最大值序号变更
m=a[k];a[k]=a;a=m;} //交换位置
printf ("\n"); //换行
for(i=0; i<16; i++) { //for循环
if (i%8==0) printf("\n"); //若i是8的整倍数,换行(输出时,8个一行)
printf ("a[%bu]=%bu,",i,a);} //输出从大到小排序后数组a的数据元素
while(1);} //原地踏步,无限循环
|