51单片机实验程序.docx
- 文档编号:15231756
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:28
- 大小:23.66KB
51单片机实验程序.docx
《51单片机实验程序.docx》由会员分享,可在线阅读,更多相关《51单片机实验程序.docx(28页珍藏版)》请在冰点文库上搜索。
51单片机实验程序
333。
(x为0x2~+x39的整数)用查表方式编写y=x1+
#include
voidmain()
{
将对应的每位数字的三次方的值0~9codeinta[10]={0,1,8,27,64,125,216,343,512,729};//
存入中,为程序存储器,当所存的值在或之间的话就用,charcode0~255code-128~+127而现在的值明显超过这个范围,用较合适。
的范围是或。
0~65535int-32768~32767int此处定义根据习惯,也可写成但是变量一定要用来intcharx1,x2,x3inty,x1,x2,x3;//y定义。
x1=2;
x2=4;
三个的值是自定的,只要是当中的数值皆可,也可重复。
//x1,x2,x30~9x3=9;y=a[x1]+a[x2]+a[x3];
单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。
//while
(1);}
结果的查询在软件内部,在仿真界面点击右下角(一般初始位置是右下角)的Keilvision//的框架内双击“”文字输入后按回车,右侧会显示其进16watchdouble-clickorF2toaddy制数值如,鼠标右键该十六进制,选择第一行的可查看对应的进制数。
0x3410decimal,
1、有10个8位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的数据(1的个数为偶数)都要存到内RAM50H开始的数据区中。
试编写有关程序。
#include
voidmain()
{
将所要处理的值存入中,这些可以根据RAMinta[10]={0,1,5,20,24,54,64,88,101,105};//
个人随意设定,但建议不要超过的范围。
0~255定义一个变量//chari;
定义一个指针指向内部这个地址。
*qchar*q=0x50;//0x50
循环,共十次,也可以用for(i=0;i<10;i++)for(i=9;i>=0;i--)//9~0
{
将的值赋给累加器ACCa[i]ACC=a[i];//
位上的奇偶校验位,如果累加器内数值的个数为偶数那么1//PSW0ACCif(P==0)为,若为奇数,为。
这里的是大写的。
0PPP1{
*q=a[i];
每赋一个值,指针挪一个位置指向下一个。
q++;//
}
}
同实验一,程序不能停。
//while
(1);}
3.有10个8位带符号二进制数,请将10个数按从小到大的顺序排列,并存到内RAM50H开始的单元中。
#include
voidmain()
{
将所有值存入中,因为有负RAM;//chardataa[10]={-50,-36,0,-128,1,99,127,89,-89,40}
数,所以不能用。
因为是所以假设的数值不要超过之外charunsignedchar-128~+127定义指针指向0x50//*qunsignedchar*q=0x50;
unsignedchari,j;
定义三个变量,用于循环及换位。
在换位时有赋值,所以要用不能用chartchart;//
。
unsignedcharfor(i=0;i<10;i++)
冒泡法,具体可以参考语言程序设计的书。
Cfor(j=0;j<10-i;j++)//{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
将已经排好序的数组存入指向的地址。
*qfor(i=0;i<10;i++)//
{
*q=a[i];
q++;
}
while
(1);
}
1、基本部分:
(1)P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
#include
定义延迟函数,用于后面灯亮的持续时间。
//LEDvoiddelay(unsignedcharx)
{
unsignedchari,j,k;
do
{
for(i=10;i>0;i--)
for(j=100;j>0;j--)
for(k=249;k>0;k--);
}
while(--x);}
main()
{
第一个灯亮//11111110P1=0xfe;while
(1)
{
delay
(1);//延时500ms
左移一个位即具体跟的区别与具体细节可联系< 我与你讲解 if(P1==0XFF) { P1=0XFE; } } } (2)P1.0、P1.1作输入口接两个拨动开关,P1.2、P1.3作输出口,接两个发光二极管,编写程序读取开关状态,将此状态,在发光二极管上显示出来。 编程时应注意P1.0、P1.1作为输入口时应先置1,才能正确读入值。 #include sbitp1_0=P1^0; sbitp1_1=P1^1; sbitp1_2=P1^2; 程序不能对单个引脚进行编程,需要用定义才可用。 sbitp1_3=P1^3;//sbit main() { 前两个引脚置一是为了让其能获取输入信号,后两个//p1_0=1;p1_1=1;p1_2=1;p1_3=1;引脚是赋初值,方便后面取反工作。 while (1) { 判断的引脚是否有变化。 //P1.0if(! p1_0){ 如果引脚变化,引脚也跟随变化。 //P1.0P1.2p1_2=! p1_2; } 判断的引脚是否有变化。 //P1.1if(! p1_1){ 如果引脚变化,引脚也跟随变化。 P1.3p1_3=! p1_3;//P1.1 } } } 2、扩展部分: (1)利用P1口控制发光二极管LED灯按照下面方式工作: a)LED灯从左到右依次点亮; b)LED灯从右到左依次点亮; 。 500msc)按照以上步骤重复运行,其中要求灯亮的时间为 #include voiddelay(unsignedcharx) { unsignedchari,j,k; do { for(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) { 如果左移右移是单个灯移动的话,那么这句改为LED=LED<<1|1;//P1=P1<<1;就可以了。 delay (1); 判断左移是否完毕,完毕跳出此次的while//breakif(P1==0x00) break; } 左移完毕后给赋初值,准备右移//P1P1=0x7f; delay (1); while (1) { 如果左移右移是单个灯移动的话,那么这句改为//P1=P1>>1;就可以了。 LED=LED>>1|0x80;delay (1); 判断右移是否完毕,完毕后跳出breakif(P1==0x00)//break; } } } (2)利用P1口控制发光二极管LED灯按照下面方式工作: a)从左到右奇数LED灯依次点亮; b)从右到左偶数LED灯依次点亮; c)按照以上步骤重复运行,其中要求灯亮的时间为500ms。 //此程序也可以用<<和>>来实现,具体细节可以来问我#include //当程序中有涉及到_crol_或者_nop_等库函数时,必须添#include voiddelay(unsignedcharx) { unsignedchari,j,k; do { for(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左移两个位置P1=_crol_(P1,2); //判断左移结束if(P1==0xfe) break; } P1=0X7f; while (1) { delay (1); //P1右移两个位置P1=_cror_(P1,2); //判断右移结束if(P1==0x7f) break; } } } #include 500ms 延时函数//voiddelay(unsignedcharx). { unsignedchari,j,k; do { for(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左移一个位置,补位补的是1。 此处不明白P1=(P1<<1)|0x01; 可以找我。 //P1左移一个位置,补位补的是0。 P1=P1<<1; delay (1); //左移结束,跳出循环if(P1==0xaa) break; } //P1赋值,为右移做准备P1=0X7f; delay (1); while (1) { //P1右移一个位,补位补的是1,同样的,不P1=(P1>>1)|0x80; 明白来找我 //P1右移一个位P1=P1>>1; delay (1); //判断右移是否完毕,退出此次循环。 if(P1==0x55) break; } } } 本实验模拟交通信号灯控制,一般情况下正常显示,有急救车到达时,两个方向交通信号灯全红,以便让急救车通过。 设急救车通过路口时间为5秒,急救车通过后,交通恢复正常,本实验用单次脉冲申请外部中断,表示有急救车通过。 #include //设置unsignedcharx,y,i,j,k; //定义四个变量用于记录中断时的现场,以便恢unsignedchard0,d1,d2,d3; 复现场。 voiddelay(x)//延时函数 { do { for(i=10;i>0;i--) for(j=100;j>0;j--) for(k=249;k>0;k--); } while(--x); } //定义中断函数,无需声明。 interrupt0表示外部中断0的zd()interrupt0 中断函数 { y=P1; d0=x; d1=i; d2=j; //记录中断时P1的值,延时函数的x,i,j,k也要记录。 d3=k; //P1应为东西红南北红,所以设为F6。 P1=0xf6; delay(5); x=d0; i=d1; j=d2; k=d3; //现场恢复,包括延时函数中的x,i,j,k。 P1=y; } main() { //P1设定初始状态,两路皆为红灯,此步骤可以忽略。 P1=0xf6; delay (1); //开总中断EA=1; //开外部中断0中断。 EX0=1; //设置外部中断0为下降沿触发有效方式。 IT0=0为低电平有效IT0=1; //下列四种灯亮的状态循环。 while (1) { //东西绿,南北红P1=0xf3; delay(10); //东西黄,南北红P1=0xf5; delay(3); //东西红,南北绿P1=0xde; delay(10); //东西红,南北黄P1=0xee; delay(3); } } 1、基本部分: 用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转. #include //要使用单个引脚应先定义sbitp1_0=P1^0; unsignedchari; voidmain() { //t0工作在定时器,工作方式1TMOD=0X01; TL0=0XB0; //设定定时器初值,初值的计算可查看书本P143,此处定时器定时时间为TH0=0X3C; 100ms //开EA总中断,开t0中断IE=0X82; //定时器工作开关开启TR0=1; //设定i作为后面定时一秒的使用i=10; while (1); } //T0定时/计数器的中断t_0()interrupt1{ //进入一次中断,i的值减一i--; //当进入10次中断,即i=0的时候,定时时间为1S。 if(i==0) { //重新让i=10,使得后面继续定时1S。 i=10; //P1.0取反。 p1_0=~p1_0; } TL0=0XB0; //赋定时初值,定时器或计数器必要步骤,除工作方式2外。 TH0=0X3C; } 2、扩展部分: 利用P1口控制发光二极管LED灯按照下面方式工作: 1)从左到右奇数LED灯依次点亮; 2)从右到左偶数LED灯依次点亮; 3)按照以上步骤重复运行,其中要求灯亮的时间为500ms,由定时器T1实现。 #include #include unsignedchari,j,k; voidmain() { //设定T1工作在定时器T1,方式1。 同时也会设定T0工作在定时器T0,TMOD=0X10; 方式0,但是我们后面没有interrupt1的子函数,所以T0没发挥作用。 //开总中断,开T1中断IE=0X88; TL1=0XB0; //定时器初值,时间为100msTH1=0X3C; //开定时器T1的开关TR1=1; i=5; j=0; //用三个变量来判断时长,循环阶段。 k=0; //赋P1初值,第一个灯亮P1=0xfe; //等待定时工作完成while (1); } //T1的中断子函数t_1()interrupt3 { //进入一次,i就减1i--; TL1=0xB0; //每次进入中断定时器的初值就为0,所以需要重装TH1=0x3C; //500ms后if(i==0) { //让i=5,继续定时500ms。 i=5; //j一开始为0,j加一j++; //如果j等于4,代表P1口左移了四次if(j==4) { j=0; //k取反,用于后面左移右移的执行k=! k; } //P1口左移if(k==0) { //左移到头了,要右移需要把灯亮的位置变化下if(P1==0xfd) { P1=0xbf; } P1=_crol_(P1,2); } //P1口右移if(k! =0) { //右移到头了,要右移需要把灯亮的位置变化下if(P1==0xbf) { P1=0xfd; } P1=_cror_(P1,2); } } } #include unsignedchari,j; voidmain() { i=5; j=0; //只亮第一个灯P1=0xfe; //设置T1的工作方式为1,定时器工作TMOD=0X10;//中断EA开,ET1开IE=0X88; TL1=0XB0; //初值设定为100msTH1=0X3C; //开启工作开关TR1=1; //等待定时工作完成while (1); } //T1中断子函数t_1()interrupt3 { i--; TL1=0XB0; //赋初值TH1=0X3C; //时间为500msif(i==0) { i=5; //利用j来判断左移或右移是否结束j++; if(j<4) { P1=P1<<1|0x01; //P1口左移两位,且补位是补1。 也可以用P1=P1<<2|0X03P1=P1<<1|0x01; 代替 } //左移结束,赋P1值准备右移if(j==4) { P1=0x7f; } //右移阶段if(j>4) { P1=P1>>1|0X80; //P1口右移两位,且补位是补1。 也可以用P1=P1>>2|0XC0P1=P1>>1|0X80; 代替 } //右移结束,赋P1值准备左移if(j==8) { P1=0xfe; //最后还要将J恢复为0以便下次循环。 j=0; } } } 1、基本部分: 8031内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。 将其数值按二进制数在P1口驱动LED灯上显示出来。 #include voidmain() { //T0工作方式1,计数器工作TMOD=0X05; TL0=0X00; //初值设置方法可以参考P143页TH0=0Xff; //中断EA=1,ET0中断开启IE=0X82; //开启中断开关TR0=1; while (1) { //计数器的值存在TL0里面。 每加一个值,所得的值就是以八位P1=~TL0; 二进制形式存在TL0里面的。 } } //T0的计数器中断t_0()interrupt1 { TL0=0X00; TH0=0Xff; } 2、扩展部分: 利用T0作为定时器,T1作为计数器,将试验箱上的脉冲信号源接到T1引脚,测量出脉冲信号源的频率。 #include unsignedchari,a; voidmain() { a=0; i=10; //设置T0为工作方式1,定时器工作。 T1为工作方式1,计数器工作TMOD=0X51; EA=1; ET0=1; //这里也可以设置为IE=0x82。 关闭了T1的中断ET1=0; TL0=0XB0; //时间设定为100msTH0=0X3C; TL1=0X00; //计数器开启最大范围计数TH1=0X00; TR0=1; //皆开启开关TR1=1; //等待计数定时工作完成while (1) { //查询溢出标志位。 if(TF1==1) { //溢出一次a的值加1a++; //将溢出标志位清零TF1=0; TH1=0x00; //重新装上计数器初值TL1=0X00; } } } T0//定时器的中断子程序t_0()interrupt1 { TL0=0XB0; //赋初值TH0=0X3C; i--; if(i==0) { i=10; 显示出来。 P1//将低位记录的次数赋给P1=TL1;即为频//将高位记录的次数赋给显示出来,P2即一秒内的计数次数,P2=TH1; 率。 TR0=0; TR1=0;//频率读出后关闭T0和T1 } } //一般情况下,所测频率不能超过500kHz,否则此程序结果有错。 程序频率计算为: P1和P2的读数转为十进制数字,加上(a*65536)得出频率总和。 1、基本部分: 利用74ls165读入拨盘开关的状态,利用单片机串行口将状态读入并通过P1口输出到LED,从而实现拨盘开关对LED灯的控制。 #include //实验箱内部已经将P1.6引脚与165的S/L引脚相连,也把P3.6sbitP1_6=P1^6;与165的CLK引脚相连 voidmain() { SM0=0; SM1=0; //串行口工作方式0,也可用SCON=0x10REN=1; EA=1; //开总中断和串行口中断ES=1; while (1); } //串行口中断子程序I_0()interrupt4 { //让74LS165将按键的状态读入P1_6=0; //让74LS165将读入的8位按键码用串行方式输出,从低位到高位;P1_6=1; //将SBUF缓冲器里的数据读给P2P2=SBUF; //RI要由软件置0RI=0; } 2、扩展部分: 利用74ls165读入拨盘开关的状态,利用单片机P3口将状态读入并通过P1口输出到LED,从而实现拨盘开关对LED灯的控制。 #include //与165的内部S/L相连sbitp1_6=P1^6;//与165的内部CLK相连sbitp3_6=P3^6;//P1.7短路帽扣上时,P1.7与165的QH相连sbitp1_7=P1^7; unsignedchari,x; main() { while (1) { //数据移入165芯片p1_6=0; //数据从165芯片输出p1_6=1; //防止第一位丢失x=p1_7; for(i=0;i<7;i++) { p3_6=0; //内部制造一个上升沿,从而达到数据传输,一个上升沿一个数据。 p3_6=1; //每次左移一个位,空出来的位补P1_7的值x=x<<1|p1_7; } //将移位完的X赋给P2,那么P2上显示的就是按键的二进制状态P2=x; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 实验 程序