山东大学单片机原理与应用实验 C语言程序实验

本实验使用C语言在AT89C51单片机上实现对片内RAM从30H开始的32个单元中的8位有符号二进制数进行排序,并将排序结果存回原地址。实验通过编写相应的C语言代码实现了数据的排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验题目

C语言程序实验

二、试验要求

片内RAM30H开始的32个单元中分布着随机的有符号8位二进制数,按从小到大的顺序进行排序,排序后的数据仍然保存到30H开始的32个单元中(低地址存放小数据)

三、实验过程及结果记录

1. 新建project工程文件,并选择芯片为AT89C51。

图1:选择芯片

2. 在source group1 目录创建文件,注意文件扩展名为.c

图2:创建目录

3.在新建的文件中编写代码,右键选择build target 选项进行编译链接。

4. 成功后,在下方会显示错误和警告

5. 点击启动调试按钮,然后选择run方式运行程序。

得到的排序实验结果如下:

图3:排序结果

四、实验源程序

	#include<reg51.h>
	#include<stdio.h>
	char data a[32] _at_ 0x30; 	//定义排序结果的储存位置为30H~4FH单元
	void main()
	{  //定义带排序的数组
		char b[32] = {
					  	1,3,9,2,17,4,11,6,
					  	5,20,100,64,21,14,
					 	79,35,92,7,91,23,65,
					  	16,13,18,18,73,65,
					  	101,27,19,62,69
					   };
		int i,j,t = 0;
//将待排数组里的数据移动至RAM 30H~4FH
		for(i=0;i<32;i++)
			a[i] = b[i];
		//外层循环控制比较单元地址上限
		for(j=0;j<31;j++)	
			//内层循环将每次循环的最大值转移至高地址处
			for(i=0;i<31-j;i++)
				if(a[i]>a[i+1])	//大小比较
				{//交换位置
					t = a[i];
					a[i] = a[i+1];
					a[i+1] = t;
				}
		while(1);
	}

受于文本原因,本文相关实验工程无法展示出来,现已将资源上传,可自行下载。

山东大学单片机原理与应用实验工程文件C语言程序实验-单片机文档类资源-CSDN下载山东大学单片机原理与应用实验工程文件详解博客地址:https://blog.csdn.net/m更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/m0_52316372/85915655

实验一 走马灯实验 一、实验题目: P2口接八个发光二极管,分别为D0、D1……D7。程序先点亮D1,延时一段时间(2秒钟),再顺序点亮D1……D7,然后又是D0。同时只能有一个灯亮。设晶振频率fosc=6MHz,要求亮灯2秒后下一个灯点亮。 二、实验目的: 1、学习89C51的功能及编程方法。 2、学习P2口的使用方法及延时子程序的编写及使用。 3、学习内部定时/计数器的使用及编程方法。 4、初步掌握中断处理程序的编写方法。 5、学习Proteus ISIS和 Keil C51软件的使用方法。 三、程序说明及流程图: 1、计算计数初值 T=2 16÷(6M÷12)=0.13s>0.1s 分段数:2s÷0.1=20(段) a=-0.1×6000000÷12=-50000 2、程序流程图 (1) 使用延时程序实现跑马灯 (2) 使用软件计数方法实现跑马灯 (3) 使用硬件计数方法实现跑马灯 四、实验硬件连接及程序: 1、使用延时程序实现跑马灯 (1)硬件连线图: (2)程序及说明: #include "reg51.h" //89C51的库函数 void delay () //延时程序 { int a=50000; while (--a); } void main () { char a=1; //赋值a=00000001,用于亮灯 do { P2=a; //把a的值赋值给P2 a=a<<1; //使a左移一位 if (a= =0) a=1; //如果a=0,重新从0000001开始 delay (); //调用延时程序 } while (1); //让主函数死循环,一直运行 } 2、使用软件计数方法实现跑马灯 (1)硬件连线图: (2)程序及说明: #include "reg51.h" //89C51的库函数 char a=0x01,b=0; //a=00000001,用于亮灯;b=0,用于计数 void main () { TL0=-50000%256; //将计数初值赋值给T0的低8位TL0 TH0=-50000/256; //将计数初值赋值给T0的高8位TH0 TMOD=0x01; //T1不用。T0:软件控制启停,定时器状态,方式1 ET0=1; //允许T0中断 EA=1; //CPU开放中断 TR0=1; //T0开始运行 P2=0x01; //最低位的灯亮,即D0亮 while (1){;} //让主函数死循环,一直运行 } void T0_srv () interrupt 1 using 1 //T0的中断服务函数,中断编号1,寄存器组1 { TL0=-50000%256; //将计数初值赋值给T0的低8位TL0 TH0=-50000/256; //将计数初值赋值给T0的低8位TL0 b++; //b自加1 if(b= =20) //如果b=20,则为2秒钟 {b=0;a=a<<1; //使b复位,a左移1位 if (a= =0) a=1; //如果a=0,重新从00000001开始 P2=a; //把a的值赋值给P2 } } 3、使用硬件计数方法实现跑马灯 (1)硬件连线图: (2)程序及说明: #include "reg51.h" //89C51的库函数 char a=0x01; //a=00000001,用于亮灯 void main () { TL0=-50000%256; //将计数初值赋值给T0的低8位TL0 TH0=-50000/256; //将计数初值赋值给T0的高8位TH0 TL1=TH1=-20; //T1为加
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timerring

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值