实验程序.docx

上传人:b****1 文档编号:14908886 上传时间:2023-06-28 格式:DOCX 页数:37 大小:25.37KB
下载 相关 举报
实验程序.docx_第1页
第1页 / 共37页
实验程序.docx_第2页
第2页 / 共37页
实验程序.docx_第3页
第3页 / 共37页
实验程序.docx_第4页
第4页 / 共37页
实验程序.docx_第5页
第5页 / 共37页
实验程序.docx_第6页
第6页 / 共37页
实验程序.docx_第7页
第7页 / 共37页
实验程序.docx_第8页
第8页 / 共37页
实验程序.docx_第9页
第9页 / 共37页
实验程序.docx_第10页
第10页 / 共37页
实验程序.docx_第11页
第11页 / 共37页
实验程序.docx_第12页
第12页 / 共37页
实验程序.docx_第13页
第13页 / 共37页
实验程序.docx_第14页
第14页 / 共37页
实验程序.docx_第15页
第15页 / 共37页
实验程序.docx_第16页
第16页 / 共37页
实验程序.docx_第17页
第17页 / 共37页
实验程序.docx_第18页
第18页 / 共37页
实验程序.docx_第19页
第19页 / 共37页
实验程序.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验程序.docx

《实验程序.docx》由会员分享,可在线阅读,更多相关《实验程序.docx(37页珍藏版)》请在冰点文库上搜索。

实验程序.docx

实验程序

单片机实验程序

软件实验一

1.分别编程实现两个16位无符号数相加,结果存放在40H41H中;两个16位的无符号数相减,结果存放在30H31H中。

两个16位无符号数相加,结果存放在30H31H中

ORG0000H

LJMPMAIN

ORG0030H

MAIN:

MOVR3,#01H;输入加数高八位

MOVR4,#23H;输入加数低八位

MOVR5,#45H;输入被加数高八位

MOVR6,#67H;输入被加数低八位

MOVA,R4;将R4存入寄存器A

ADDA,R6;A与R6相加,结果存入A

MOV31H,A;将低八位的和数存入31H

MOVA,R3;将R3存入寄存器A

ADDCA,R5;A与R5相加,结果存入A

MOV30H,A;将高八位的和数存入30H

SJMP$

END

;两个16位的无符号数相减,结果存放在30H31H中。

ORG0000H

LJMPMAIN

ORG0030H

MAIN:

MOVR3,#12H;输入减数高八位

MOVR4,#34H;输入减数低八位

MOVR5,#56H;输入被减数高八位

MOVR6,#78H;输入被减数低八位

MOVA,R4;将R4存入寄存器A

CLRC;C位清"0"

SUBBA,R6;A与R6相减,结果存入A

MOV31H,A;将低八位的差数存入31H

MOVA,R3;将R3存入寄存器A

SUBBA,R5;A与R5相减,结果存入A

MOV30H,A;将高八位的差数存入30H

SJMP$

END

 

2、编程实现

X(X≥40)

Y=2X(20

1(X≤20)

;实现X>=40时,Y=X;20

ORG0000H

LJMPMAIN

ORG0030H

MAIN:

CMP40:

CJNER2,#40,NEXT0;X与40比较,结果由CY读出

NEXT0:

JNCBIGGER40;判断C的值,C为0时则X大于或者等于40,跳到BIGGER40

JCCMP20;判断C的值,C不为0时则X小于40,跳到CMP20

CMP20:

CJNER2,#21,NEXT1;X与21比较,结果由CY读出

NEXT1:

JNCBIGGER20;判断C的值,C为0时则X大于或者等于21(即X大于20),跳到BIGGER20

JCSMALLER20;判断C的值,C不为0时则X小于20,跳到SMALLER20

BIGGER40:

MOVA,R2;X>=40时,将X的值赋给存放Y的值的R3

MOVR3,A

SJMP$

BIGGER20:

MOVA,R2;20

MOVB,#02

MULAB

MOVR3,A

SJMP$

SMALLER20:

CLRA;X<20时,将0赋给Y

MOVR3,A

SJMP$

软件实验二

1、找出内RAM中从30H到50H中在最小值。

;找出内RAM中从30H到50H中在最小值,并将最小值存放于60H中

ORG0000H

LJMPMAIN

ORG0030H

ADDRMAXEQU50H;定义ADDRMAX为所查找范围的上限值

ADDRMINEQU30H;定义ADDRMIN为所查找范围的下限值

MAIN:

MOVR0,#ADDRMIN;将地址指针存放于R0中,并赋初值

LOOP1:

MOV60H,@R0

LOOP2:

CJNER0,#ADDRMAX,NEXT1;判断R0是否达到所查找范围的上限

NEXT1:

JNCOUT;是就跳出循环

INCR0;否则RO加1

MOVA,@R0

CJNEA,60H,NEXT2;将相邻两个数((R0))和(60H)进行比较

NEXT2:

JNCLOOP2;若((R0))大于(60H)则直接跳到LOOP2

JCLOOP1;若((R0))小于或者等于(60H)则

OUT:

SJMP$;跳到LOOP1

END

2、用查表方式编写y=x3(x为0~9的整数),要求分别用@A+DPTR和@A+PC的方法。

;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中

ORG0000H

LJMPMAIN

ORG0030H

MAIN:

MOVA,R4

ADDA,R4;将累加器A翻倍

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOVR2,A

MOVA,R4;重新将X的值存入A

ADDA,R4;A翻倍

INCA;A加1

MOVCA,@A+DPTR

MOVR3,A

SJMP$

;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中

ORG0000H

LJMPMAIN

ORG0030H

MAIN:

MOVA,R4

ADDA,R4;将累加器A翻倍

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOVR2,A

MOVA,R4;重新将X的值存入A

ADDA,R4;A翻倍

INCA;A加1

MOVCA,@A+DPTR

MOVR3,A

SJMP$

软件实验三

1、用查表方式编写y=x13+x23+x33。

(x为0~9的整数)

#include

voidmain()

{

inta[10]={0,1,8,27,64,125,216,343,512,729};//0~9的立方表

intx1,x2,x3,y;

x1=0;

x2=6;

x3=6;

y=a[x1]+a[x2]+a[x3];//X1,X2,X3的立方和

while

(1);

}

2、有10个8位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的数据(1的个数为偶数)都要存到内RAM50H开始的数据区中。

试编写有关程序。

#include

voidmain()

{

unsignedchardataa[10]={0,1,8,19,40,75,88,57,2,9};//二进制数据存入数组a中

chari;

char*d=0x50;//定义d为指向内RAM50H的指针

//对a[i]进行奇偶校验,偶数存入内RAM50H开始的数据中

for(i==0;i<10;i++)

{

ACC=a[i];//a[i]存入累加器ACC中

if(P==0)//对a[i]进行奇偶校验

{

*d=a[i];//偶数存入内RAM50H开始的数据区中

d++;//d指针加1

}

}

while

(1);

}

3、有10个8位带符号二进制数,请将10个数按从小到大的顺序排列,并存到内RAM50H开始的单元中。

#include

voidmain()

{

signedchardataa[10]={0,-100,-80,110,40,105,88,57,-2,9};

//将二进制数存入数组a

chari,j,k,x,y;

char*d=0x50;//定义d为指向内RAM50H的指针

//冒泡法排序,由小到大

x=10;

for(i==0;i<10;i++)

{

x--;

j=0;

for(j==0;j

{

if(a[j]>a[j+1])//判断a[j]>a[j+1],是的话两者互换

{y=a[j+1];a[j+1]=a[j];a[j]=y;}

}

}

//排序后数据存入内RAM50H开始的单元中

for(k==0;k<10;k++)

{

*d=a[k];

d++;

}

while

(1);

}

硬件实验一P1口输入,输出实验

1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管闪烁

#include

voiddelay_500ms(intz)//延时程序间隔500ms

{

inti,j,k;

for(i=0;i

{

for(j=0;j<183;j++)

for(k=0;k<1000;k++);

}

}

voidmain()//主函数

{

while

(1)

{

P1=0x00;//点亮led

delay_500ms

(2);//延时1s

P1=0xff;//熄灭led

delay_500ms

(2);//延时1s

}

}

2.P1.0,P1.1作输入口接两个独立按键,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取按键状态,将此状态,在发光二极管上显示出来。

#include

sbitkey1=P1^0;//控制点亮第一个led灯

sbitkey2=P1^1;//控制熄灭第一个led灯

sbitled1=P1^2;//控制点亮第二个led灯

sbitled2=P1^3;//控制熄灭第二个led灯

voidmain()//主函数

{

while

(1)

{

if(!

key1)//key1按键被按下,点亮第一个led灯

{

led1=0;

}

else//松开key1按键后,熄灭第一个led灯

{

led1=1;

}

if(!

key2)//key2按键被按下,点亮第二个led灯

{

led2=0;

}

else//松开key2按键,熄灭第二个led灯

{

led2=1;

}

}

}

3.利用P1口控制发光二极管LED灯按照下面工作方式:

LED灯从左到右依次点亮;LED灯从右到左依次点亮;按照以上步骤重复运行,其中要求灯亮的时间为1s

#include

#include

voiddelay_500ms(intz)//延时程序一次500ms

{

inti,j,k;

for(i=0;i

{

for(j=0;j<183;j++)

for(k=0;k<1000;k++);

}

}

voidmain()//主函数

{

chari;

P1=0xfe;

delay_500ms

(2);

while

(1)

{

for(i=0;i<7;i++)

{

P1=_crol_(P1,1);//led从左到右移动

delay_500ms

(2);//间隔1s

}

for(i=0;i<7;i++)

{

P1=_cror_(P1,1);//led从右到左移动

delay_500ms

(2);//间隔1s

}

}

}

4.利用P1口控制发光二极管LED灯按照下面工作方式:

LED灯从左到右奇数依次点亮;LED灯从右到左偶数依次点亮;按照以上步骤重复运行,其中要求灯亮的时间为500ms

#include

#include

voiddelay_500ms(intz)//延时函数每次500ms

{

inti,j,k;

for(i=0;i

{

for(j=0;j<183;j++)

for(k=0;k<1000;k++);

}

}

voidmain()

{

chari;

while

(1)

{

P1=0xfe;

delay_500ms

(1);

for(i=0;i<3;i++)

{

P1=_crol_(P1,2);//奇数个LED依次点亮

delay_500ms

(1);//延时500ms

}

P1=0x7f;

delay_500ms

(1);

for(i=0;i<3;i++)

{

P1=_cror_(P1,2);//偶数个LED依次点亮

delay_500ms

(1);//延时500ms

}

}

}

硬件实验二外部中断实验

1.通过按键申请中断,在中断处理程序中对输出信号进行反转

 

#include

#defineuintunsignedint

sbitled=P0^0;

sbitkey=P3^3;

voidinit1()//外部中断初始化函数

{

EA=1;//开总中断

EX1=1;//开外部中断

IT1=0;//下降沿触发

}

voidinit_1()interrupt2

{

if(key==0)

{

led=~led;//led亮灭交替

}

}

voidmain()//主函数

{

init1();

while

(1);

}

2.将外部中断源连接到单片机的外部中断1上,计算器外部中断1的中断次数(<255),并能实时将结果显示在发光二极管LED上(二进制形式)

#include

sbitkey=P3^3;

voidinit1()//外部中断1初始化

{

EA=1;//开总中断

EX1=1;//开外部中断1

IT1=1;//下降沿触发

}

voidinit1_interrupt()interrupt2

{

P0=P0-1;//计数中断次数,并在P0口输出

}

voidmain()//主函数

{

init1();

P0=0xff;

while

(1);

}

硬件实验三双色LED点阵实验

1.固定显示,在点阵上轮流显示数据0-9,A-F

 

#include

unsignedcharcodetab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,};

//列选通设置

unsignedcharcodedigittab[36][8]={

{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},//0

{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00},//1

{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},//2

{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00},//3

{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00},//4

{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00},//5

{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00},//6

{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00},//7

{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00},//8

{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00},//9

{0x02,0x0C,0x14,0x24,0x14,0x0C,0x02,0x00},//A

{0x00,0x00,0xFF,0x91,0x91,0x91,0x6E,0x00},//B

{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00},//C

{0x00,0x00,0x7F,0x41,0x41,0x41,0x3E,0x00},//D

{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00},//E

{0x00,0x00,0xFF,0x88,0x88,0x88,0x80,0x00},//F

{0x00,0x3C,0x42,0x42,0x4A,0x4F,0x00,0x00},//G

{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00},//H

{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00},//I

{0x00,0x00,0x04,0x86,0x82,0xFC,0x80,0x00},//J

{0x00,0x00,0xFF,0x18,0x24,0x42,0x81,0x00},//K

{0x00,0x00,0xFE,0x02,0x02,0x02,0x02,0x00},//L

{0x00,0x7E,0x20,0x10,0x0C,0x10,0x20,0x7E},//M

{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00},//N

{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},//0

{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00},//P

{0x00,0x00,0x7C,0x82,0x8A,0x86,0x7E,0x01},//Q

{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00},//R

{0x00,0x00,0x64,0x92,0x92,0x92,0x4C,0x00},//S

{0x00,0x00,0x40,0x40,0x7F,0x40,0x40,0x00},//T

{0x00,0x00,0x7C,0x02,0x02,0x02,0x7C,0x00},//U

{0x00,0x60,0x18,0x04,0x06,0x04,0x18,0x60},//V

{0xFF,0x02,0x04,0x08,0x08,0x04,0x02,0xFF},//W

{0x00,0x82,0x44,0x28,0x10,0x28,0x44,0x82},//X

{0x00,0x80,0x40,0x20,0x1F,0x20,0x40,0x80},//Y

{0x00,0x41,0x43,0x45,0x49,0x51,0x61,0x00},//Z

};

unsignedinttimecount1,timecount2;//定义的变量

unsignedcharcntx,cnty;//cntx列选通变量cnty用来控制字符和字符之间的切换

voidmain()//主函数

{

cnty=0;

while

(1)

{

if(cnty<36)

{

P2=tab[cntx];//列线

P0=digittab[cnty][cntx];//行线

}

if(++timecount1>=50)//用来控制扫描的速度

{

timecount1=0;

if(++cntx>=8)cntx=0;

}

if(++timecount2>=20000)//用来控制字符和字符之间变换的时间

{

timecount2=0;

if(++cnty>=36)cnty=0;

}

}

}

 

2.滚动显示,从左到右,从右到左,从上到下,从下到上,轮流显示1和一

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

charlie[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};//列扫描

charhang1[]={0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示“1”

charhang2[]={0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};//显示“一”

charhang3[]={0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80};//显示“一”

charhang4[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e};//显示”1”

charTEMP[8];//空数组,用来存放变量

charTEMP1[8];//空数组,用来存放变量

charTEMP2[8];//空数组,用来存放变量

charTEMP3[8];//空数组,用来存放变量

voiddelay_ms(uintx)//延时程序,延时时间为xms

{

uinti,j;

for(i=0;i

for(j=0;j<148;j++);

}

voidmain()//主函数,主要功能为从左到右,从右到左,从上到下,

{//从下到上,显示“1”和“一”

uinti,j,k;

for(i=0;i<8;i++)//将数组hang2中的值存放到数值TEMP中,用于从上到下

{

TEMP[i]=hang2[i];

}

for(i=0;i<8;i++)//将数组hang3中的值存放到数值TEMP1中,用于从下到上

{

TEMP1[i]=hang3[i];

}

for(i=0;i<8;i++)//将数组lie中的值分别存放到数值TEMP2和TEMP3中,

{//用于左右移动

TEMP2[i]=lie[i];

TEMP3[i]=lie[i];

}

while

(1)

{

for(k=0;k<8;k++)//控制能在整个点阵上移动

{

for(j=0;j<20;j++)//用来控制点阵移动的时间

{

for(i=0;i<8;i++)//行,列扫描,并在点阵上显示

{

P0=lie[i];

P3=hang2[i];

delay_ms

(2);

}

}

for(i=0;i<8;i++)//实现在点阵上从上到下移动

{

TEMP[i]=_crol_(TEMP[i],1);

hang2[i]=TEMP[i];

}

}

delay_ms(200);//延时200ms

for(k=0;k<8;k++)//控制能在整个点阵上移动

{

for(j=0;j<20;j++)//控制在点阵上移动的时间

{

for(i=0;i<8;i++)//行,列扫描,并在点阵上显示

{

P0=

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2