当前位置:作文大全 > C51单片机实验报告流水灯交通灯定时器双机交互时钟

C51单片机实验报告流水灯交通灯定时器双机交互时钟

时间:2021-11-08 18:18:10 浏览次数:

  C51单片机实验报告流水灯交通灯定时器双机交互时钟

 学 号:班 级: 自动化 10 班 姓 名: 张 指导老师: 胡

 2019.12

 单片机核心板实验要求

 一、 流水灯实验

 、 实验目的:

 ) 简单 I/O 引脚的输出 2 ) 掌握软件延时编程方法 3 ) 简单按键输入捕获判断 2 、 完成功能要求

 ) 开机是点亮 12 发光二极管,闪烁三下 2 ) 按照顺时针循环依次点亮发光二极管

 3 ) 通过按键将发光二极管的显示改为顺逆时针方式

 二、 定时器或实时时钟实验

 、 实验目的) 数码管动态显示技术 2 ) 定时器的应用 3 ) 按键功能定义 2 、 完成功能要求

 ) 通过按键可以设定定时时间,启动定时器,定时时间到,让 12 个发光二极管闪烁,完成定时器功能。

 ) 实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别

 显示分钟和秒)。

 上述二个功能至少完成一种功能。

 三、 双机通信实验

 1 、 实验目的UART 串行通信接口技术应用 2 、 完成功能要求

 用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。

 四、 交通灯实验

 1 、 实验目的1 )按键、数码管、发光二极管综合应用编程技术 2 )数据存储于EEPRO的技术

 (也可以不使用) 3 ) 定时中断技术 4 ) 按键中断技术 2 、 完成功能要求

 ) 对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。

 )设定参数掉电后不丢失(如果不使用 EEPRO,此功能可以不实现)。

 ) 紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通 过。再按该键,恢复正常显示。

 实验一 流水灯实验

 一、实验目的 1 ) 简单 I/O 引脚的输出 2 ) 掌握软件延时编程方法 3 ) 简单按键 输入捕获判断 二、实验实现的功能 1 ) 开机是点亮 12发光二极管,闪烁三下 2 ) 按照 顺时针循环依次点亮发光二极管 3 ) 通过按键将发光二极管的显示改为顺逆时针方式 三、

 系统硬件设计

 1 )如单片机核心板所示的硬件电路。

 四、系统软件设计

 设计思路:

 1 )定义数组使得调用数组可以使 led 灯能够顺时针和逆时针显示; 2 )将按键的输 入端全部置零,做单独按键使用; 3 )利用“ while ”循环使得数码管可以闪烁三下;

 )利用“ for ”循环使得小灯能够依次点亮一个周期; 5 )将以上思想汇总,编程, 实现功能。程序详见附录。

 五、实验过程中遇到的问题及解决方法

 1 )刚开始不知道怎样只设置一个管脚(如 POP),查阅相关资料后知道表示方法,

 并学会了用“ sbit ”语句定义,方便多了。

 2)对于C语言的很多东西都不知道,语句的用法也不清楚,重新看了 C语言,用到什

 么看什么很快就懂了。

 )主程序中没有用延时程序和死循环导致 led 不能点亮,请教同学以后才知道。

 4 ) 对于按键只是不了解,看书又很模糊,看了网上“ KINGST 工作室”也就是“手把手教你学 单片机”的视频后很清楚明了,之后好多东西也是从上边学到,就不再赘述了。

 指导老师签字: 日期:

 实验二 定时器或实时时钟实验

 一、实验目的 1 ) 数码管动态显示技术 2 ) 定时器的应用 3 ) 按键功能定义 二、 实验实现的功能 1 ) 通过按键可以设定定时时间,启动定时器,定时时间到,让 12个发

 光二极管闪烁,完成定时器功能。

 2 ) 实时时钟,可以设定当前时间,完成钟表功能 (四位数码管分别显示分钟和秒)。

 上述二个功能至少完成一种功能。

 三、系统硬件设计

 1 )如单片机核心开发板所示的硬件电路。

 四、系统软件设计 设计思路:

 1 )做的是秒表定时器的实验;

 )利用中断技术实现利用单片机定时器完成计时功能;

 )定时器 1 计时中断程序每隔 0.001s 中断一次并当作一个计数,则 1000 次中断为

 1 秒,然后十进制进位即可;

 )在程序开始计数器不工作时设定一个值,当计数器工作时将时间与设定时间比较, 如果想等,计数器停止工作,小灯闪烁三下; 5 )将以上思想汇总,编程,实现功能。程 序详见附录。

 五、实验过程中遇到的问题及解决方法

 1 )最开始的时钟和秒表都没有用计时器和中断,但是也达到了实验要求,最后又改 用始终计时器,浪费了很多时间。

 )不知道怎么使数码管显示不同数字,从网上学到用动态扫描来显示。

 )认真学习了中断技术并运用之后,切实意识到中断技术是单片机的核心技术,数 码管显示也变得简单和稳定了。

 )子程序中的参数传递不出来,在网上搜索以后知道了全局变量和局部变量,并知 道了“ void ”的作用。

 )运用“!”符号后不用再麻烦的写“ key==0”, 很实用

 指导老师签字:

 实验三 双机通信实验

 一、实验目的1 )UART 串行通信接口技术应用 二、实验实现的功能

 1 )用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。

 三、系统 硬件设计

 1 )如单片机核心板所示的硬件电路。

 四、系统软件设计 设计思路:

 1 )该实验不对端口进行复杂操作,所以实验较简单; 2 )设定波特率并计算出“ TH1” 和” TL1”的值;3)对单片机进行初始化;

 4 )通过键盘扫面程序读出按下降的键并给予相关的编号; 5 )输出编号 ;

 6) 读入数过来的值; 7) 在数码管上显示;

 8 )将以上思想汇总,编程,实现功能。程序详见附录。

 五、实验过程中遇到的问题 及解决方法

 )对UART技术不了解,看书和视频以后有了初步了解。

 )按照课本上的程序模仿之后发现可以接收不能发送,认真查询程序发现了在利用

 数码管显示时将“ P0=0XF7直接将按键检测端口置高,按键无效了。 3 )解决问题二之

 后还是不能发送数据,最后检查发现直接用“ IF(TI) ”不能有效地开通发送标志位,所以 用了先将初值赋值给一个数,检测之后比较,并用比较结果进入发送允许,最后实现。

 指导老师签字:

 实验四 交通灯试验

 一、实验目的 1 ) 按键、数码管、发光二极管综合应用编程技术 2) 数据存储于 EEPRO的技术(也可以不使用) 3)定时中断技术4 )按键中断技术 二、实验实现的 功能 1 ) 对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。 2 ) 设定参

 数掉电后不丢失(如果不使用 EEPRO,M 此功能可以不实现)。

 3 ) 紧急按键功能,当按 下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。再按该键,恢复正常显示。

 三、系统硬件设计

 1 )如单片机核心板所示的硬件电路。

 四、系统软件设计 设计思路:

 )该实验较麻烦,但是有实验一和实验二做铺垫思路也是很清晰地;

 )交通灯为南北通东西停——等待——东西通南北停——等待——南北通东西停 ,, 依次循环,所以应该设计一个周期包含以上四步;

 )计数器工作时比较计数器的值和所设定的置,确定范围,确定该范围内显示的灯 的种类;

 )对于急停的情况,应该在每秒都检测一下键盘,如果键盘有输入,中断,执行全 部红灯的程序;

 )关于跳出急停程序,用“ while “循环和” if “语句实现; 6 )红绿灯和黄灯的显

 示时间在程序最开始计数器未开始工作室设定两个数的值; 7)将以上思想汇总,编程,

 实现功能。程序详见附录。

 五、实验过程中遇到的问题及解决方法

 1 )该实验是一个综合性较强的实验,不过由于有实验一,实验二的铺垫,在技术上 遇到的问题已经很少了,但是还是遇到一些问题。

 2 )最开始的时钟和秒表都没有用计时器和中断,但是也达到了实验要求,最后又改 用始终计时器,浪费了很多时间。

 )在急停之后如何出循环成为一个很大的困惑,最后运用了“ while ”循环解决了

 )发现用子程序以后会使程序简明不少。

 指导老师签字:

 附录:

 实验一 流水灯实验

 最终实现:按任意键反向,只是必须等到一轮结束以后。

 程序如下:

 #include

 #define uchar unsigned char

 sbit ko 仁P3W; sbit ko2=P3A7; sbit ki 仁戸0人5; sbit ki2=P0A6; sbit ki3=P0A7;

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

 tab2[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3b,0x37,0x2f,0x1f};

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

 tab4[]={0x1f,0x2f,0x37,0x3b,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};

 void Delay900ms() //@11.0592MHz { unsigned char i, j, k; i = 13; j = 156;

 k = 83; do { do { while (--k); } while (--j); } while (--i); }

 void Delay10ms() //@11.0592MHz { unsigned char i, j;

 i = 108;

 j = 145; do { while (--j);

 } while (--i); }

 void flick() { uchar d; while(d

 void main() { uchar b,y,n; flick(); while(1) { n=b; y=(n%2); if(y==1)

 { uchar x; for(x=0;x

 ko2=0; ki1=1; ki2=1; ki3=1; if(!ki1||!ki2||!ki3) { Delay10ms(); if(!ki1||!ki2||!ki3) b+=1;

 while(!ki1||!ki2||!ki3); } }

 } if(y==0) { uchar x; for(x=0;x

 实验二 定时器时钟实验

 最终实现:上电后设置定时时间,按 2号键时间 +1,按 3号键时间 +100;按 1号键开 始工作;时间到偶小灯闪烁 3 下,回到初始状 {

 unsigned char i, j; i = 54; j = 199; do { 态。

 程序如下:

 #include

 #define uchar unsigned char #define uint unsigned int

 sbit ko 仁P3W; sbit ko2=P3A7; sbit ki 仁戸0人5; sbit ki2=P0A6; sbit ki3=P0A7;

 sfr P1M1=0x91; sfr P1M0=0x92;

 tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

 tab2[]={0xf7,0xfb,0xfd,0xfe}; tab3[4]={0}; uint a=0; uint b=0;

 void Delay100ms() //@11.0592MHz { unsigned char i, j, k; i = 5; j = 52; k

 = 195; do { do { while (--k); } while (--j); } while (--i); }

 void Delay5ms() //@11.0592MHz

 while (--j); } while (--i); }

 void flick() { uchar d; while(d

 void show() {

 char j; switch(j) { case

 0:P0=tab2[j];j++;P1=tab1[tab3[0]];break; case

 1:P0=tab2[j];j++;P1=tab1[tab3[1]];break; case

 2:P0=tab2[j];j++;P1=tab1[tab3[2]];break; case

 3:P0=tab2[j];j=0;P1=tab1[tab3[3]];break; default:break; } }

 void interrupt_timer1() interrupt 3

 { TH1=0xfc; TL1=0x67; a++; if(a==1000) { b++; a=0; tab3[0]=b%10;

 tab3[1]=b/10%10; tab3[2]=b/100%10; tab3[3]=b/1000%10; } show(); }

 void main() { uchar m,k; uint n=1; P1M1=0x00; P1M0=0xff; TMOD=0x10;

 TH1=0xfc; TL1=0x67; ET1=1; EA=1; while(1) { if(!TR1) { k=0; for(k=0;k

 }

 }

 { TR1=1; break; } while(!ki1); } if(!ki2) { Delay5ms(); if(!ki2) n+=1;

 while(!ki2); } if(!ki3) { Delay5ms(); if(!ki3) n+=100; while(!ki3); } tab3[0]=n%10; tab3[1]=n/10%10; tab3[2]=n/100%10; tab3[3]=n/1000%10; for(m=0;m

 if(b==n) { TR1=0; b=0; n=1; flick(); }

 实验三 双机通信实验

 最终实现:两机连接后按任意键可在两外的 机子上显示该键编号。

 程序如下:

 #include

 #define uchar unsigned char #define uint unsigned int

 sfr P1M1=0x91; sfr P1M0=0x92;

 sbit ko 仁P3W; sbit ko2=P3A7; sbit ki 仁戸0人5; sbit ki2=P0A6; sbit ki3=P0A7;

 sbit scran=戸0人3;

 tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d ,0x07,0x7f,0x6f};

 uchar a,b,n;

 void Delay5ms() //@11.0592MHz { unsigned char i, j; i = 54; j = 199; do

 { while (--j); } while (--i); }

 void main() { SCON=0xd0; TMOD=0x20; PCON=0x00; TH1=0xf4;

 TL1=0xf4; TR1=1; scran=0; while(1) { n=a; ko1=0; ko2=1; ki1=1; ki2=1;

 ki3=1; if(!ki1) {

 } if(!ki2) { } if(!ki3) { }

 ko1=1; ko2=0; ki1=1; ki2=1; ki3=1; if(!ki1) {

 Delay5ms(); if(!ki1) a=1;

 while(!ki1);

 Delay5ms(); if(!ki2) a=2;

 while(!ki2);

 Delay5ms(); if(!ki3) a=3;

 while(!ki3);

 Delay5ms(); if(!ki1) a=4;

 while(!ki1);

 if(!ki2) { Delay5ms(); if(!ki2) a=5; while(!ki2); } if(!ki3) { Delay5ms(); if(!ki3) a=6; while(!ki3); } if(a!=n) { SBUF=a; while(!TI); TI=0; } if(RI) { b=SBUF; RI=0; }

 P1=tab1[b];

 }

 }

 实验四 交通灯实验

 3 号键增加黄灯时间,3、4、 5任意键继续(从最终实现:上电之后进行初始设置, 2 号键增加红绿灯时间, 初始时间都为零; 1 号键开始工作;按 3、

 3 号键增加黄灯时间,

 3、4、 5任意键继续(从

 tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

 tab2[]={0xf7,0xfb,0xfd,0xfe}; tab3[4]={0};

 第一步开始。

 程序如下:

 #include

 #define uchar unsigned char #define uint unsigned int

 void led_show();

 uchar m,n; uint a=0; uint b=0;

 uchar k,c,d,f,g;

 sfr P1M1=0x91; sfr P1M0=0x92;

 sbit ko 仁P3W; sbit ko2=P3A7; sbit ki 仁戸0人5; sbit ki2=P0A6; sbit ki3=P0A7;

 sbit dh=P2A2; sbit dl=P2A0; sbit dy=P2Al;

 sbit xh=P3A2; sbit xl=P2A6; sbit xy=P2A7;

 sbit nh=P2A5; sbit nl=P2A3; sbit ny=P2A4;

 sbit bh=P3A5; sbit bl=P3A3;

 void show() { char j; switch(j) {

 case 0:P0=tab2[j];j++;P1=tab1[tab3[0]];break; case 1:P0=tab2[j];j++;P1=tab1[tab3[1]];break; case 2:P0=tab2[j];j++;P1=tab1[tab3[2]];break; case 3:P0=tab2[j];j=0;P1=tab1[tab3[3]];break; default:break; } }

 void Delay5ms() //@11.0592MHz { unsigned char i, j; i = 54; j = 199; do

 { while (--j); } while (--i); }

 void interrupt_timer1() interrupt 3 { TH1=0xfc; TL1=0x67; a++; if(a==1000)

 { b++; a=0; } if(b=0) { tab3[0]=(m-b)%10;

 tab3[1]=(m-b)/10%10; tab3[2]=(m-b)/100%10; tab3[3]=(m-b)/1000%10; } if(b=m) { tab3[0]=(d-b)%10; tab3[1]=(d-b)/10%10; xh=0;

 bh=0; while(!ki1||!ki2||!ki3); while(ki1) { if(!ki1||!ki2||!ki3)

 { while(!ki1||!ki2||!ki3); tab3[2]=(d-b)/100%10; tab3[3]=(d-b)/1000%10; } if(b=d) { tab3[0]=(f-b)%10; tab3[1]=(f-b)/10%10; tab3[2]=(f-b)/100%10; tab3[3]=(f-b)/1000%10; } if(b=f) { tab3[0]=(g-b)%10; tab3[1]=(g-b)/10%10; tab3[2]=(g-b)/100%10; tab3[3]=(g-b)/1000%10; } show(); }

 void det() { ko1=1; ko2=0; ki1=1; ki2=1; ki3=1; if(!ki1||!ki2||!ki3)

 { Delay5ms(); if(!ki1||!ki2||!ki3) { P2=0xdb; bl=1; by=1;

 b=0; break; } } } } }

 void led_show() { while(1) { dl=1; xl=1; nl=1; bl=1; dh=1; xh=1; nh=1;

 bh=1; dy=1; xy=1; ny=1; by=1; d=(m+n); f=(2*m+n); g=(2*m+2*n); if(b=0) { dl=0; xl=0; nl=1; bl=1; dh=1; xh=1; nh=0;

 // 东西通

 bh=0; dy=1; xy=1; ny=1; by=1; det(); }

 if(b=m) { dl=1; xl=1; nl=1; bl=1; dh=1; xh=1; nh=1; bh=1; dy=0; xy=0; ny=0; by=0; det(); }

 if(b=d) { dl=1; xl=1; nl=0; bl=0; dh=0; xh=0; nh=1; bh=1; dy=1; xy=1; ny=1; by=1; det(); }

 if(b=f) { dl=1; xl=1; nl=1;

 // 黄

 // 南北通 // 黄

 bl=1;

 dh=1; xh=1; nh=1; bh=1; dy=0; xy=0; ny=0; by=0; det(); } if(b==g) b=0; } }

 void main() { P1M1=0x00; P1M0=0xff; TMOD=0x10; TH1=0xfc; TL1=0x67; ET1=1; EA=1; TR1=0; while(1) { if(!TR1) { k=0; for(k=0;k

 led_show(); }

 while(!ki1); }

 if(!ki2) { Delay5ms(); if(!ki2) m+=1; while(!ki2); }

 if(!ki3) { Delay5ms(); if(!ki3)

 n+=1; while(!ki3); } tab3[0]=m%10; tab3[1]=m/10%10; tab3[2]=n%10; tab3[3]=n/10%10; for(c=0;c