MCS-51单片机实验源程序
仅供参考。没有最好,只有更好!希望大家设计出更好的程序来。
软件实验一 求一组数据的最大(小)值
/*软件实验的目的:熟悉单片机常用的基本程序(算法),调试时观察变量(含数组)值的变化,从而理解程序的功能,了解变量(含数组)在单片机存储器中的具体位置。*/
int a[]={-1,2,-30,40,-500,600,-7000,8000,-32750,32765}; //任意给出10个int型数(范围:-32768~+32767),放在数组a中 void main() {
unsigned char i; int max,min;
max=min=a[0]; //max,min先取该组数据的第一个 for(i=1;i<10;i++) {
if(a[i]>max) max=a[i]; if(a[i] while(1); //没有什么要做了,则用该语句作为main函数的结尾,无限循环 } 附调试截图: 注意:由于是纯软件实验(单片机没有进行实际的输入与输出),有些变量要声明为全局 变量(如上面的数组a),否则可能会被Keil软件编译时优化掉(即:一些语句没有真正..生成执行代码),导致无法观察到正确结果。 软件实验二 二进制(十六进制)数转换为BCD数 //按流程图,编写程序如下: #define uchar unsigned char void main() { uchar x=0xA5; //设二进制数为1010 0101,在Keil中只能用十六进制0xA5或十进制165(不能直接用二进制形式) uchar a[3]; a[2]=x/100; x=x0; a[1]=x/10; x=x; a[0]=x; while(1); } //或者用for循环语句,先取出个位 #define uchar unsigned char void main() { uchar x=0xA5; uchar i,a[3]; for(i=0;i<3;i++) { a[i]=x; x=x/10; } while(1); } 软件实验三 二进制(十六进制)数转换为ASCII码 //将0-9、A-F的ASCII码做成表格(数组)放到程序存储器ROM中 #define uchar unsigned char uchar code ascii[]={\ABCDEF\码表放ROM中 /*上句赋值也可写成{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, 0x41,0x42,0x43,0x44,0x45,0x46} */ /* 还可写成{48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70} */ /* 还可写成{'0','1','2','3','4','5','6','7','8','9','A','B','C','D', 'E','F'} */ void main() { uchar x=0x5A; //设二进制数为0101 1010,在Keil中只能用十六进制0x5A或十进制90(不能直接用二进制形式) uchar cc,a[2]; cc=x & 0x0f; //取x的低4位1010(即A) a[0]=ascii[cc]; //查表,a[0]存x低4位对应十六进制数(即A)的ASCII码 cc=(x>>4)& 0x0f; //取x的高4位0101(即5) a[1]=ascii[cc]; //查表,a[1]存x高4位对应十六进制数(即5)的ASCII码 while(1); } 硬件实验一 并行口输入、输出 //P2做输出口,接8只LED,编写程序,使LED循环点亮(流水灯) #include #include void Delay(unsigned int x) //延时函数,在12MHz晶振下,延时约x ms {unsigned char i; while(x--) for(i=0;i<123;i++); } void main() { char a=0xfe; while(1) { P2=a; Delay(500); //在12MHz晶振下,延时约500ms a=_crol_(a,1); //循环左移,_cror_为循环右移 } } //P3.2和P3.3做输入口,分别接两个拨动开关到GND;P2.7~P2.4做输出口,接4只 LED,用来指示两个开关的闭合状态组合 #include char a; while(1) { a=P3; //读入P3口状态 a=a&0x0C; //a中只保留P3.3、P3.2的值,其余位清零 if(a==0x0C) P2=0x7F; //P3.3=1开,P3.2=1开,则P2.7=0亮 if(a==0x08) P2=0xbF; //P3.3=1开,P3.2=0合,则P2.6=0亮 if(a==0x04) P2=0xdF; //P3.3=0合,P3.2=1开,则P2.5=0亮 if(a==0x00) P2=0xEF; //P3.3=0合,P3.2=0合,则P2.4=0亮 } } //用一个共阳七段数码管循环显示0-9和A-F,每个数显示0.5s #include char code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管段码(放在程序存储器ROM中) void Delay(unsigned int x) //延时函数,在12MHz晶振下,延时约x ms {unsigned char i; while(x--) for(i=0;i<123;i++); } void main() { char j; P1_0=0; //位选信号 while(1) { for(j=0;j<16;j++) { P0=TABLE[j]; Delay(500); } } } 硬件实验二 外部中断
MCS-51单片机实验源程序



