实验程序.docx
《实验程序.docx》由会员分享,可在线阅读,更多相关《实验程序.docx(37页珍藏版)》请在冰点文库上搜索。
实验程序
单片机实验程序
软件实验一
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中。
MOVR3,#12H;输入减数高八位
MOVR4,#34H;输入减数低八位
MOVR5,#56H;输入被减数高八位
MOVR6,#78H;输入被减数低八位
CLRC;C位清"0"
SUBBA,R6;A与R6相减,结果存入A
MOV31H,A;将低八位的差数存入31H
SUBBA,R5;A与R5相减,结果存入A
MOV30H,A;将高八位的差数存入30H
2、编程实现
X(X≥40)
Y=2X(201(X≤20);实现X>=40时,Y=X;20ORG0000HLJMPMAINORG0030HMAIN:CMP40:CJNER2,#40,NEXT0;X与40比较,结果由CY读出NEXT0:JNCBIGGER40;判断C的值,C为0时则X大于或者等于40,跳到BIGGER40JCCMP20;判断C的值,C不为0时则X小于40,跳到CMP20CMP20:CJNER2,#21,NEXT1;X与21比较,结果由CY读出NEXT1:JNCBIGGER20;判断C的值,C为0时则X大于或者等于21(即X大于20),跳到BIGGER20JCSMALLER20;判断C的值,C不为0时则X小于20,跳到SMALLER20BIGGER40:MOVA,R2;X>=40时,将X的值赋给存放Y的值的R3MOVR3,ASJMP$BIGGER20:MOVA,R2;20MOVB,#02MULABMOVR3,ASJMP$SMALLER20:CLRA;X<20时,将0赋给YMOVR3,ASJMP$软件实验二1、找出内RAM中从30H到50H中在最小值。;找出内RAM中从30H到50H中在最小值,并将最小值存放于60H中ORG0000HLJMPMAINORG0030HADDRMAXEQU50H;定义ADDRMAX为所查找范围的上限值ADDRMINEQU30H;定义ADDRMIN为所查找范围的下限值MAIN:MOVR0,#ADDRMIN;将地址指针存放于R0中,并赋初值LOOP1:MOV60H,@R0LOOP2:CJNER0,#ADDRMAX,NEXT1;判断R0是否达到所查找范围的上限NEXT1:JNCOUT;是就跳出循环INCR0;否则RO加1MOVA,@R0CJNEA,60H,NEXT2;将相邻两个数((R0))和(60H)进行比较NEXT2:JNCLOOP2;若((R0))大于(60H)则直接跳到LOOP2JCLOOP1;若((R0))小于或者等于(60H)则OUT:SJMP$;跳到LOOP1END2、用查表方式编写y=x3(x为0~9的整数),要求分别用@A+DPTR和@A+PC的方法。;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中ORG0000HLJMPMAINORG0030HMAIN:MOVA,R4ADDA,R4;将累加器A翻倍MOVDPTR,#TABMOVCA,@A+DPTRMOVR2,AMOVA,R4;重新将X的值存入AADDA,R4;A翻倍INCA;A加1MOVCA,@A+DPTRMOVR3,ASJMP$;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中ORG0000HLJMPMAINORG0030HMAIN:MOVA,R4ADDA,R4;将累加器A翻倍MOVDPTR,#TABMOVCA,@A+DPTRMOVR2,AMOVA,R4;重新将X的值存入AADDA,R4;A翻倍INCA;A加1MOVCA,@A+DPTRMOVR3,ASJMP$软件实验三1、用查表方式编写y=x13+x23+x33。(x为0~9的整数)#includevoidmain(){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开始的数据区中。试编写有关程序。#includevoidmain(){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开始的单元中。#includevoidmain(){signedchardataa[10]={0,-100,-80,110,40,105,88,57,-2,9};//将二进制数存入数组achari,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口做输出口,接八只发光二极管,编写程序,使发光二极管闪烁#includevoiddelay_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;//点亮leddelay_500ms(2);//延时1sP1=0xff;//熄灭leddelay_500ms(2);//延时1s}}2.P1.0,P1.1作输入口接两个独立按键,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取按键状态,将此状态,在发光二极管上显示出来。#includesbitkey1=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#includevoiddelay_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#includevoiddelay_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#defineuintunsignedintsbitled=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上(二进制形式)#includesbitkey=P3^3;voidinit1()//外部中断1初始化{EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//下降沿触发}voidinit1_interrupt()interrupt2{P0=P0-1;//计数中断次数,并在P0口输出}voidmain()//主函数{init1();P0=0xff;while(1);}硬件实验三双色LED点阵实验1.固定显示,在点阵上轮流显示数据0-9,A-F #includeunsignedcharcodetab[]={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#defineuintunsignedintcharlie[]={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;ifor(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);//延时200msfor(k=0;k<8;k++)//控制能在整个点阵上移动{for(j=0;j<20;j++)//控制在点阵上移动的时间{for(i=0;i<8;i++)//行,列扫描,并在点阵上显示{P0=
1(X≤20)
;实现X>=40时,Y=X;20ORG0000HLJMPMAINORG0030HMAIN:CMP40:CJNER2,#40,NEXT0;X与40比较,结果由CY读出NEXT0:JNCBIGGER40;判断C的值,C为0时则X大于或者等于40,跳到BIGGER40JCCMP20;判断C的值,C不为0时则X小于40,跳到CMP20CMP20:CJNER2,#21,NEXT1;X与21比较,结果由CY读出NEXT1:JNCBIGGER20;判断C的值,C为0时则X大于或者等于21(即X大于20),跳到BIGGER20JCSMALLER20;判断C的值,C不为0时则X小于20,跳到SMALLER20BIGGER40:MOVA,R2;X>=40时,将X的值赋给存放Y的值的R3MOVR3,ASJMP$BIGGER20:MOVA,R2;20MOVB,#02MULABMOVR3,ASJMP$SMALLER20:CLRA;X<20时,将0赋给YMOVR3,ASJMP$软件实验二1、找出内RAM中从30H到50H中在最小值。;找出内RAM中从30H到50H中在最小值,并将最小值存放于60H中ORG0000HLJMPMAINORG0030HADDRMAXEQU50H;定义ADDRMAX为所查找范围的上限值ADDRMINEQU30H;定义ADDRMIN为所查找范围的下限值MAIN:MOVR0,#ADDRMIN;将地址指针存放于R0中,并赋初值LOOP1:MOV60H,@R0LOOP2:CJNER0,#ADDRMAX,NEXT1;判断R0是否达到所查找范围的上限NEXT1:JNCOUT;是就跳出循环INCR0;否则RO加1MOVA,@R0CJNEA,60H,NEXT2;将相邻两个数((R0))和(60H)进行比较NEXT2:JNCLOOP2;若((R0))大于(60H)则直接跳到LOOP2JCLOOP1;若((R0))小于或者等于(60H)则OUT:SJMP$;跳到LOOP1END2、用查表方式编写y=x3(x为0~9的整数),要求分别用@A+DPTR和@A+PC的方法。;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中ORG0000HLJMPMAINORG0030HMAIN:MOVA,R4ADDA,R4;将累加器A翻倍MOVDPTR,#TABMOVCA,@A+DPTRMOVR2,AMOVA,R4;重新将X的值存入AADDA,R4;A翻倍INCA;A加1MOVCA,@A+DPTRMOVR3,ASJMP$;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中ORG0000HLJMPMAINORG0030HMAIN:MOVA,R4ADDA,R4;将累加器A翻倍MOVDPTR,#TABMOVCA,@A+DPTRMOVR2,AMOVA,R4;重新将X的值存入AADDA,R4;A翻倍INCA;A加1MOVCA,@A+DPTRMOVR3,ASJMP$软件实验三1、用查表方式编写y=x13+x23+x33。(x为0~9的整数)#includevoidmain(){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开始的数据区中。试编写有关程序。#includevoidmain(){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开始的单元中。#includevoidmain(){signedchardataa[10]={0,-100,-80,110,40,105,88,57,-2,9};//将二进制数存入数组achari,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口做输出口,接八只发光二极管,编写程序,使发光二极管闪烁#includevoiddelay_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;//点亮leddelay_500ms(2);//延时1sP1=0xff;//熄灭leddelay_500ms(2);//延时1s}}2.P1.0,P1.1作输入口接两个独立按键,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取按键状态,将此状态,在发光二极管上显示出来。#includesbitkey1=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#includevoiddelay_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#includevoiddelay_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#defineuintunsignedintsbitled=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上(二进制形式)#includesbitkey=P3^3;voidinit1()//外部中断1初始化{EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//下降沿触发}voidinit1_interrupt()interrupt2{P0=P0-1;//计数中断次数,并在P0口输出}voidmain()//主函数{init1();P0=0xff;while(1);}硬件实验三双色LED点阵实验1.固定显示,在点阵上轮流显示数据0-9,A-F #includeunsignedcharcodetab[]={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#defineuintunsignedintcharlie[]={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;ifor(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);//延时200msfor(k=0;k<8;k++)//控制能在整个点阵上移动{for(j=0;j<20;j++)//控制在点阵上移动的时间{for(i=0;i<8;i++)//行,列扫描,并在点阵上显示{P0=
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
BIGGER20:
MOVA,R2;20MOVB,#02MULABMOVR3,ASJMP$SMALLER20:CLRA;X<20时,将0赋给YMOVR3,ASJMP$软件实验二1、找出内RAM中从30H到50H中在最小值。;找出内RAM中从30H到50H中在最小值,并将最小值存放于60H中ORG0000HLJMPMAINORG0030HADDRMAXEQU50H;定义ADDRMAX为所查找范围的上限值ADDRMINEQU30H;定义ADDRMIN为所查找范围的下限值MAIN:MOVR0,#ADDRMIN;将地址指针存放于R0中,并赋初值LOOP1:MOV60H,@R0LOOP2:CJNER0,#ADDRMAX,NEXT1;判断R0是否达到所查找范围的上限NEXT1:JNCOUT;是就跳出循环INCR0;否则RO加1MOVA,@R0CJNEA,60H,NEXT2;将相邻两个数((R0))和(60H)进行比较NEXT2:JNCLOOP2;若((R0))大于(60H)则直接跳到LOOP2JCLOOP1;若((R0))小于或者等于(60H)则OUT:SJMP$;跳到LOOP1END2、用查表方式编写y=x3(x为0~9的整数),要求分别用@A+DPTR和@A+PC的方法。;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中ORG0000HLJMPMAINORG0030HMAIN:MOVA,R4ADDA,R4;将累加器A翻倍MOVDPTR,#TABMOVCA,@A+DPTRMOVR2,AMOVA,R4;重新将X的值存入AADDA,R4;A翻倍INCA;A加1MOVCA,@A+DPTRMOVR3,ASJMP$;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中ORG0000HLJMPMAINORG0030HMAIN:MOVA,R4ADDA,R4;将累加器A翻倍MOVDPTR,#TABMOVCA,@A+DPTRMOVR2,AMOVA,R4;重新将X的值存入AADDA,R4;A翻倍INCA;A加1MOVCA,@A+DPTRMOVR3,ASJMP$软件实验三1、用查表方式编写y=x13+x23+x33。(x为0~9的整数)#includevoidmain(){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开始的数据区中。试编写有关程序。#includevoidmain(){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开始的单元中。#includevoidmain(){signedchardataa[10]={0,-100,-80,110,40,105,88,57,-2,9};//将二进制数存入数组achari,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口做输出口,接八只发光二极管,编写程序,使发光二极管闪烁#includevoiddelay_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;//点亮leddelay_500ms(2);//延时1sP1=0xff;//熄灭leddelay_500ms(2);//延时1s}}2.P1.0,P1.1作输入口接两个独立按键,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取按键状态,将此状态,在发光二极管上显示出来。#includesbitkey1=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#includevoiddelay_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#includevoiddelay_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#defineuintunsignedintsbitled=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上(二进制形式)#includesbitkey=P3^3;voidinit1()//外部中断1初始化{EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//下降沿触发}voidinit1_interrupt()interrupt2{P0=P0-1;//计数中断次数,并在P0口输出}voidmain()//主函数{init1();P0=0xff;while(1);}硬件实验三双色LED点阵实验1.固定显示,在点阵上轮流显示数据0-9,A-F #includeunsignedcharcodetab[]={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#defineuintunsignedintcharlie[]={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;ifor(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);//延时200msfor(k=0;k<8;k++)//控制能在整个点阵上移动{for(j=0;j<20;j++)//控制在点阵上移动的时间{for(i=0;i<8;i++)//行,列扫描,并在点阵上显示{P0=
MOVB,#02
MULAB
SMALLER20:
CLRA;X<20时,将0赋给Y
软件实验二
1、找出内RAM中从30H到50H中在最小值。
;找出内RAM中从30H到50H中在最小值,并将最小值存放于60H中
ADDRMAXEQU50H;定义ADDRMAX为所查找范围的上限值
ADDRMINEQU30H;定义ADDRMIN为所查找范围的下限值
MOVR0,#ADDRMIN;将地址指针存放于R0中,并赋初值
LOOP1:
MOV60H,@R0
LOOP2:
CJNER0,#ADDRMAX,NEXT1;判断R0是否达到所查找范围的上限
JNCOUT;是就跳出循环
INCR0;否则RO加1
MOVA,@R0
CJNEA,60H,NEXT2;将相邻两个数((R0))和(60H)进行比较
NEXT2:
JNCLOOP2;若((R0))大于(60H)则直接跳到LOOP2
JCLOOP1;若((R0))小于或者等于(60H)则
OUT:
SJMP$;跳到LOOP1
2、用查表方式编写y=x3(x为0~9的整数),要求分别用@A+DPTR和@A+PC的方法。
;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中
MOVA,R4
ADDA,R4;将累加器A翻倍
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVR2,A
MOVA,R4;重新将X的值存入A
ADDA,R4;A翻倍
INCA;A加1
软件实验三
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开始的数据区中。
试编写有关程序。
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
3、有10个8位带符号二进制数,请将10个数按从小到大的顺序排列,并存到内RAM50H开始的单元中。
signedchardataa[10]={0,-100,-80,110,40,105,88,57,-2,9};
//将二进制数存入数组a
chari,j,k,x,y;
//冒泡法排序,由小到大
x=10;
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口做输出口,接八只发光二极管,编写程序,使发光二极管闪烁#includevoiddelay_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;//点亮leddelay_500ms(2);//延时1sP1=0xff;//熄灭leddelay_500ms(2);//延时1s}}2.P1.0,P1.1作输入口接两个独立按键,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取按键状态,将此状态,在发光二极管上显示出来。#includesbitkey1=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#includevoiddelay_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#includevoiddelay_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#defineuintunsignedintsbitled=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上(二进制形式)#includesbitkey=P3^3;voidinit1()//外部中断1初始化{EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//下降沿触发}voidinit1_interrupt()interrupt2{P0=P0-1;//计数中断次数,并在P0口输出}voidmain()//主函数{init1();P0=0xff;while(1);}硬件实验三双色LED点阵实验1.固定显示,在点阵上轮流显示数据0-9,A-F #includeunsignedcharcodetab[]={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#defineuintunsignedintcharlie[]={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;ifor(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);//延时200msfor(k=0;k<8;k++)//控制能在整个点阵上移动{for(j=0;j<20;j++)//控制在点阵上移动的时间{for(i=0;i<8;i++)//行,列扫描,并在点阵上显示{P0=
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++;
硬件实验一P1口输入,输出实验
1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管闪烁
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;//点亮leddelay_500ms(2);//延时1sP1=0xff;//熄灭leddelay_500ms(2);//延时1s}}2.P1.0,P1.1作输入口接两个独立按键,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取按键状态,将此状态,在发光二极管上显示出来。#includesbitkey1=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#includevoiddelay_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#includevoiddelay_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#defineuintunsignedintsbitled=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上(二进制形式)#includesbitkey=P3^3;voidinit1()//外部中断1初始化{EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//下降沿触发}voidinit1_interrupt()interrupt2{P0=P0-1;//计数中断次数,并在P0口输出}voidmain()//主函数{init1();P0=0xff;while(1);}硬件实验三双色LED点阵实验1.固定显示,在点阵上轮流显示数据0-9,A-F #includeunsignedcharcodetab[]={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#defineuintunsignedintcharlie[]={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;ifor(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);//延时200msfor(k=0;k<8;k++)//控制能在整个点阵上移动{for(j=0;j<20;j++)//控制在点阵上移动的时间{for(i=0;i<8;i++)//行,列扫描,并在点阵上显示{P0=
for(j=0;j<183;j++)
for(k=0;k<1000;k++);
voidmain()//主函数
(1)
P1=0x00;//点亮led
delay_500ms
(2);//延时1s
P1=0xff;//熄灭led
2.P1.0,P1.1作输入口接两个独立按键,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取按键状态,将此状态,在发光二极管上显示出来。
sbitkey1=P1^0;//控制点亮第一个led灯
sbitkey2=P1^1;//控制熄灭第一个led灯
sbitled1=P1^2;//控制点亮第二个led灯
sbitled2=P1^3;//控制熄灭第二个led灯
if(!
key1)//key1按键被按下,点亮第一个led灯
led1=0;
else//松开key1按键后,熄灭第一个led灯
led1=1;
key2)//key2按键被按下,点亮第二个led灯
led2=0;
else//松开key2按键,熄灭第二个led灯
led2=1;
3.利用P1口控制发光二极管LED灯按照下面工作方式:
LED灯从左到右依次点亮;LED灯从右到左依次点亮;按照以上步骤重复运行,其中要求灯亮的时间为1s
voiddelay_500ms(intz)//延时程序一次500ms
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#includevoiddelay_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#defineuintunsignedintsbitled=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上(二进制形式)#includesbitkey=P3^3;voidinit1()//外部中断1初始化{EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//下降沿触发}voidinit1_interrupt()interrupt2{P0=P0-1;//计数中断次数,并在P0口输出}voidmain()//主函数{init1();P0=0xff;while(1);}硬件实验三双色LED点阵实验1.固定显示,在点阵上轮流显示数据0-9,A-F #includeunsignedcharcodetab[]={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#defineuintunsignedintcharlie[]={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;ifor(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);//延时200msfor(k=0;k<8;k++)//控制能在整个点阵上移动{for(j=0;j<20;j++)//控制在点阵上移动的时间{for(i=0;i<8;i++)//行,列扫描,并在点阵上显示{P0=
P1=0xfe;
(2);
for(i=0;i<7;i++)
P1=_crol_(P1,1);//led从左到右移动
(2);//间隔1s
P1=_cror_(P1,1);//led从右到左移动
4.利用P1口控制发光二极管LED灯按照下面工作方式:
LED灯从左到右奇数依次点亮;LED灯从右到左偶数依次点亮;按照以上步骤重复运行,其中要求灯亮的时间为500ms
voiddelay_500ms(intz)//延时函数每次500ms
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#defineuintunsignedintsbitled=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上(二进制形式)#includesbitkey=P3^3;voidinit1()//外部中断1初始化{EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//下降沿触发}voidinit1_interrupt()interrupt2{P0=P0-1;//计数中断次数,并在P0口输出}voidmain()//主函数{init1();P0=0xff;while(1);}硬件实验三双色LED点阵实验1.固定显示,在点阵上轮流显示数据0-9,A-F #includeunsignedcharcodetab[]={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#defineuintunsignedintcharlie[]={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;ifor(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);//延时200msfor(k=0;k<8;k++)//控制能在整个点阵上移动{for(j=0;j<20;j++)//控制在点阵上移动的时间{for(i=0;i<8;i++)//行,列扫描,并在点阵上显示{P0=
for(i=0;i<3;i++)
P1=_crol_(P1,2);//奇数个LED依次点亮
(1);//延时500ms
P1=0x7f;
P1=_cror_(P1,2);//偶数个LED依次点亮
硬件实验二外部中断实验
1.通过按键申请中断,在中断处理程序中对输出信号进行反转
#defineuintunsignedint
sbitled=P0^0;
sbitkey=P3^3;
voidinit1()//外部中断初始化函数
EA=1;//开总中断
EX1=1;//开外部中断
IT1=0;//下降沿触发
voidinit_1()interrupt2
if(key==0)
led=~led;//led亮灭交替
init1();
2.将外部中断源连接到单片机的外部中断1上,计算器外部中断1的中断次数(<255),并能实时将结果显示在发光二极管LED上(二进制形式)
voidinit1()//外部中断1初始化
EX1=1;//开外部中断1
IT1=1;//下降沿触发
voidinit1_interrupt()interrupt2
P0=P0-1;//计数中断次数,并在P0口输出
P0=0xff;
硬件实验三双色LED点阵实验
1.固定显示,在点阵上轮流显示数据0-9,A-F
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,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用来控制字符和字符之间的切换
cnty=0;
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和一
#defineucharunsignedchar
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;ifor(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);//延时200msfor(k=0;k<8;k++)//控制能在整个点阵上移动{for(j=0;j<20;j++)//控制在点阵上移动的时间{for(i=0;i<8;i++)//行,列扫描,并在点阵上显示{P0=
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];
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
for(i=0;i<8;i++)//实现在点阵上从上到下移动
TEMP[i]=_crol_(TEMP[i],1);
hang2[i]=TEMP[i];
delay_ms(200);//延时200ms
for(j=0;j<20;j++)//控制在点阵上移动的时间
P0=
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2