51单片机实验程序_1.docx
51单片机实验程序用查表方式编写yx13x23x33。x为09的整数#includevoidmain()intcodea10=0,1,8,27,64,125,216,343,512,729;/将09对应的每位数字的三次方的值存入code中,code为程序存储器,当所存的值在0255或-128+127之间的话就用char,而如今的值明显超过这个范围,用int较适宜。int的范围是065535或-3276832767。inty,x1,x2,x3;/此处定义根据习惯,可以写成charx1,x2,x3但是变量y一定要用int来定义。x1=2;x2=4;x3=9;/x1,x2,x3三个的值是自定的,只要是09当中的数值皆可,可以重复。y=ax1+ax2+ax3;while(1);/单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。/结果的查询在Keilvision软件内部,在仿真界面点击右下角一般初始位置是右下角的watch的框架内双击“double-clickorF2toadd文字输入y后按回车,右侧会显示其16进制数值如0x34,鼠标右键该十六进制,选择第一行的decimal,可查看对应的10进制数。1、有10个8位二进制数据,要求对这些数据进行奇偶校验,但凡知足偶校验的数据1的个数为偶数都要存到内RAM50H开场的数据区中。试编写有关程序。#includevoidmain()inta10=0,1,5,20,24,54,64,88,101,105;/将所要处理的值存入RAM中,这些能够根据个人随意设定,但建议不要超过0255的范围。chari;/定义一个变量char*q=0x50;/定义一个指针*q指向内部0x50这个地址。for(i=9;i>=0;i-)/90循环,共十次,可以以用for(i=0;iwhile(1);/同实验一,程序不能停。3.有10个8位带符号二进制数,请将10个数按从小到大的顺序排列,并存到内RAM50H开场的单元中。#includevoidmain()chardataa10=-50,-36,0,-128,1,99,127,89,-89,40;/将所有值存入RAM中,由于有负数,所以不能用unsignedchar。由于是char所以假设的数值不要超过-128+127之外unsignedchar*q=0x50;/定义指针*q指向0x50unsignedchari,j;chart;/定义三个变量,用于循环及换位。在换位时有赋值,所以t要用char不能用unsignedchar。for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t;for(i=0;ivoiddelay(unsignedcharx)/定义延迟函数,用于后面LED灯亮的持续时间。unsignedchari,j,k;dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x);main()P1=0xfe;/11111110第一个灯亮while(1)delay(1);/延时500msP1=P1sbitp1_0=P10;sbitp1_1=P11;sbitp1_2=P12;sbitp1_3=P13;/程序不能对单个引脚进行编程,需要用sbit定义才可用。main()p1_0=1;p1_1=1;p1_2=1;p1_3=1;/前两个引脚置一是为了让其能获取输入信号,后两个引脚是赋初值,方便后面取反工作。while(1)if(!p1_0)/判定P1.0的引脚能否有变化。p1_2=!p1_2;/假如P1.0引脚变化,P1.2引脚也跟随变化。if(!p1_1)/判定P1.1的引脚能否有变化。p1_3=!p1_3;/假如P1.1引脚变化,P1.3引脚也跟随变化。2、扩展部分:1利用P1口控制发光二极管LED灯根据下面方式工作:a)LED灯从左到右依次点亮;b)LED灯从右到左依次点亮;c)根据以上步骤重复运行,其中要求灯亮的时间为500ms。#includevoiddelay(unsignedcharx)unsignedchari,j,k;dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x);main()while(1)/无限循环里面的内容P1=0XFE;/右移完毕后赋初值,为左移做准备delay(1);while(1)P1=P1>1;/假如左移右移是单个灯移动的话,那么这句改为LED=LED>>1|0x80;就能够了。delay(1);if(P1=0x00)/判定右移能否完毕,完毕后break跳出break;2利用P1口控制发光二极管LED灯根据下面方式工作:a从左到右奇数LED灯依次点亮;b从右到左偶数LED灯依次点亮;c根据以上步骤重复运行,其中要求灯亮的时间为500ms。#include/此程序可以以用>来实现,详细细节能够来问我#include/当程序中有涉及到_crol_或者_nop_等库函数时,必须添加此头文件。voiddelay(unsignedcharx)unsignedchari,j,k;dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x);main()while(1)/无限循环括号里的内容P1=0xfe;/第一个灯亮,while(1)delay(1);P1=_crol_(P1,2);/P1左移两个位置if(P1=0xfe)/判定左移结束break;P1=0X7f;while(1)delay(1);P1=_cror_(P1,2);/P1右移两个位置if(P1=0x7f)/判定右移结束break;#includevoiddelay(unsignedcharx)/延时函数500msunsignedchari,j,k;dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x);main()while(1)/无限循环括号里的内容P1=0xfe;/赋值,为左移做准备delay(1);while(1)P1=(P1>1)|0x80;/P1右移一个位,补位补的是1,同样的,不明白来找我P1=P1>>1;/P1右移一个位delay(1);if(P1=0x55)/判定右移能否完毕,退出此次循环。break;本实验模拟交通信号灯控制,一般情况下正常显示,有急救车到达时,两个方向交通信号灯全红,以便让急救车通过。设急救车通过路口时间为5秒,急救车通过后,交通恢复正常,本实验用单次脉冲申请外部中断,表示有急救车通过。#includeunsignedcharx,y,i,j,k;/设置unsignedchard0,d1,d2,d3;/定义四个变量用于记录中断时的现场,以便恢复现场。voiddelay(x)/延时函数dofor(i=10;i>0;i-)for(j=100;j>0;j-)for(k=249;k>0;k-);while(-x);zd()interrupt0/定义中断函数,无需声明。interrupt0表示外部中断0的中断函数y=P1;d0=x;d1=i;d2=j;d3=k;/记录中断时P1的值,延时函数的x,i,j,k也要记录。P1=0xf6;/P1应为东西红南北红,所以设为F6。delay(5);x=d0;i=d1;j=d2;k=d3;P1=y;/现场恢复,包括延时函数中的x,i,j,k。main()P1=0xf6;/P1设定初始状态,两路皆为红灯,此步骤能够忽略。delay(1);EA=1;/开总中断EX0=1;/开外部中断0中断。IT0=1;/设置外部中断0为下降沿触发有效方式。IT0=0为低电平有效while(1)/下列四种灯亮的状态循环。P1=0xf3;/东西绿,南北红delay(10);P1=0xf5;/东西黄,南北红delay(3);P1=0xde;/东西红,南北绿delay(10);P1=0xee;/东西红,南北黄delay(3);1、基本部分:用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转.#includesbitp1_0=P10;/要使用单个引脚应先定义unsignedchari;voidmain()TMOD=0X01;/t0工作在定时器,工作方式1TL0=0XB0;TH0=0X3C;/设定定时器初值,初值的计算可查看书本P143,此处定时器定时时间为100msIE=0X82;/开EA总中断,开t0中断TR0=1;/定时器工作开关开启i=10;/设定i作为后面定时一秒的使用while(1);t_0()interrupt1/T0定时/计数器的中断i-;/进入一次中断,i的值减一if(i=0)/当进入10次中断,即i=0的时候,定时时间为1S。i=10;/重新让i=10,使得后面继续定时1S。p1_0=p1_0;/P1.0取反。TL0=0XB0;TH0=0X3C;/赋定时初值,定时器或计数器必要步骤,除工作方式2外。2、扩展部分:利用P1口控制发光二极管LED灯根据下面方式工作:1从左到右奇数LED灯依次点亮;2从右到左偶数LED灯依次点亮;3根据以上步骤重复运行,其中要求灯亮的时间为500ms,由定时器T1实现。#include#includeunsignedchari,j,k;voidmain()TMOD=0X10;/设定T1工作在定时器T1,方式1。同时也会设定T0工作在定时器T0,方式0,但是我们后面没有interrupt1的子函数,所以T0没发挥作用。IE=0X88;/开总中断,开T1中断TL1=0XB0;TH1=0X3C;/定时器初值,时间为100msTR1=1;/开定时器T1的开关i=5;j=0;k=0;/用三个变量来判定时长,循环阶段。P1=0xfe;/赋P1初值,第一个灯亮while(1);/等待定时工作完成t_1()interrupt3/T1的中断子函数i-;/进入一次,i就减1TL1=0xB0;TH1=0x3C;/每次进入中断定时器的初值就为0,所以需要重装if(i=0)/500ms后i=5;/让i=5,继续定时500ms。j+;/j一开场为0,j加一if(j=4)/假如j等于4,代表P1口左移了四次j=0;k=!k;/k取反,用于后面左移右移的执行if(k=0)/P1口左移if(P1=0xfd)/左移到头了,要右移需要把灯亮的位置变化下P1=0xbf;P1=_crol_(P1,2);if(k!=0)/P1口右移if(P1=0xbf)/右移到头了,要右移需要把灯亮的位置变化下P1=0xfd;P1=_cror_(P1,2);#includeunsignedchari,j;voidmain()i=5;j=0;P1=0xfe;/只亮第一个灯TMOD=0X10;/设置T1的工作方式为1,定时器工作IE=0X88;/中断EA开,ET1开TL1=0XB0;TH1=0X3C;/初值设定为100msTR1=1;/开启工作开关while(1);/等待定时工作完成t_1()interrupt3/T1中断子函数i-;TL1=0XB0;TH1=0X3C;/赋初值if(i=0)/时间为500msi=5;j+;/利用j来判定左移或右移能否结束if(j