C51单片机实验报告流水灯交通灯定时器双机交互时钟学号:31100800 班级:自动化10 班姓名:张指导老师:胡2019.12单片机核心板实验要求一、流水灯实验1 、实验目的:1 ) 简单I/O 引脚的输出2 ) 掌握软件延时编程方法3 ) 简单按键输入捕获判断2 、完成功能要求1 ) 开机是点亮12 发光二极管,闪烁三下2 ) 按照顺时针循环依次点亮发光二极管3 ) 通过按键将发光二极管的显示改为顺逆时针方式二、定时器或实时时钟实验1 、实验目的1 ) 数码管动态显示技术2 ) 定时器的应用3 ) 按键功能定义2 、完成功能要求1 ) 通过按键可以设定定时时间,启动定时器,定时时间到,让12 个发光二极管闪烁,完成定时器功能。
2 ) 实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。
上述二个功能至少完成一种功能。
三、双机通信实验1 、实验目的UART 串行通信接口技术应用2 、完成功能要求用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。
四、交通灯实验1 、实验目的1 )按键、数码管、发光二极管综合应用编程技术2 )数据存储于EEPRO的技术(也可以不使用) 3 )定时中断技术 4 )按键中断技术 2 、完成功能要求1 )对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。
2 )设定参数掉电后不丢失(如果不使用EEPRO,此功能可以不实现)。
3 )紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。
再按该键,恢复正常显示。
实验一流水灯实验一、实验目的 1 )简单I/O 引脚的输出 2 )掌握软件延时编程方法 3 )简单按键输入捕获判断二、实验实现的功能 1 )开机是点亮12发光二极管,闪烁三下 2 )按照顺时针循环依次点亮发光二极管 3 )通过按键将发光二极管的显示改为顺逆时针方式三、系统硬件设计1 )如单片机核心板所示的硬件电路。
四、系统软件设计设计思路:1 )定义数组使得调用数组可以使led 灯能够顺时针和逆时针显示;2 )将按键的输入端全部置零,做单独按键使用;3 )利用“ while ”循环使得数码管可以闪烁三下;4 )利用“ for ”循环使得小灯能够依次点亮一个周期;5 )将以上思想汇总,编程,实现功能。
程序详见附录。
五、实验过程中遇到的问题及解决方法1 )刚开始不知道怎样只设置一个管脚(如POP),查阅相关资料后知道表示方法,并学会了用“ sbit ”语句定义,方便多了。
2)对于C语言的很多东西都不知道,语句的用法也不清楚,重新看了C语言,用到什么看什么很快就懂了。
3 )主程序中没有用延时程序和死循环导致led 不能点亮,请教同学以后才知道。
4 )对于按键只是不了解,看书又很模糊,看了网上“ KINGST 工作室”也就是“手把手教你学单片机”的视频后很清楚明了,之后好多东西也是从上边学到,就不再赘述了。
指导老师签字:日期:实验二定时器或实时时钟实验一、实验目的 1 )数码管动态显示技术 2 )定时器的应用 3 )按键功能定义二、实验实现的功能 1 )通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。
2 )实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。
上述二个功能至少完成一种功能。
三、系统硬件设计1 )如单片机核心开发板所示的硬件电路。
四、系统软件设计设计思路:1 )做的是秒表定时器的实验;2 )利用中断技术实现利用单片机定时器完成计时功能;3 )定时器1 计时中断程序每隔0.001s 中断一次并当作一个计数,则1000 次中断为1 秒,然后十进制进位即可;4 )在程序开始计数器不工作时设定一个值,当计数器工作时将时间与设定时间比较,如果想等,计数器停止工作,小灯闪烁三下;5 )将以上思想汇总,编程,实现功能。
程序详见附录。
五、实验过程中遇到的问题及解决方法1 )最开始的时钟和秒表都没有用计时器和中断,但是也达到了实验要求,最后又改用始终计时器,浪费了很多时间。
2 )不知道怎么使数码管显示不同数字,从网上学到用动态扫描来显示。
3 )认真学习了中断技术并运用之后,切实意识到中断技术是单片机的核心技术,数码管显示也变得简单和稳定了。
4 )子程序中的参数传递不出来,在网上搜索以后知道了全局变量和局部变量,并知道了“ void ”的作用。
5 )运用“!”符号后不用再麻烦的写“ key==0”, 很实用指导老师签字:实验三双机通信实验一、实验目的1 )UART 串行通信接口技术应用二、实验实现的功能1 )用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。
三、系统硬件设计1 )如单片机核心板所示的硬件电路。
四、系统软件设计设计思路:1 )该实验不对端口进行复杂操作,所以实验较简单;2 )设定波特率并计算出“ TH1” 和” TL1”的值;3)对单片机进行初始化;4 )通过键盘扫面程序读出按下降的键并给予相关的编号;5 )输出编号;6)读入数过来的值;7)在数码管上显示;8 )将以上思想汇总,编程,实现功能。
程序详见附录。
五、实验过程中遇到的问题及解决方法1 )对UART技术不了解,看书和视频以后有了初步了解。
2 )按照课本上的程序模仿之后发现可以接收不能发送,认真查询程序发现了在利用数码管显示时将“ P0=0XF7直接将按键检测端口置高,按键无效了。
3 )解决问题二之后还是不能发送数据,最后检查发现直接用“ IF(TI)”不能有效地开通发送标志位,所以用了先将初值赋值给一个数,检测之后比较,并用比较结果进入发送允许,最后实现。
指导老师签字:实验四交通灯试验一、实验目的 1 )按键、数码管、发光二极管综合应用编程技术2)数据存储于EEPRO的技术(也可以不使用)3)定时中断技术4 )按键中断技术二、实验实现的功能 1 )对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。
2 )设定参数掉电后不丢失(如果不使用EEPRO,M 此功能可以不实现)。
3 )紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。
再按该键,恢复正常显示。
三、系统硬件设计1 )如单片机核心板所示的硬件电路。
四、系统软件设计设计思路:1 )该实验较麻烦,但是有实验一和实验二做铺垫思路也是很清晰地;2 )交通灯为南北通东西停——等待——东西通南北停——等待——南北通东西停,, 依次循环,所以应该设计一个周期包含以上四步;3 )计数器工作时比较计数器的值和所设定的置,确定范围,确定该范围内显示的灯的种类;4 )对于急停的情况,应该在每秒都检测一下键盘,如果键盘有输入,中断,执行全部红灯的程序;5 )关于跳出急停程序,用“ while “循环和” if “语句实现;6 )红绿灯和黄灯的显示时间在程序最开始计数器未开始工作室设定两个数的值;7)将以上思想汇总,编程,实现功能。
程序详见附录。
五、实验过程中遇到的问题及解决方法1 )该实验是一个综合性较强的实验,不过由于有实验一,实验二的铺垫,在技术上遇到的问题已经很少了,但是还是遇到一些问题。
2 )最开始的时钟和秒表都没有用计时器和中断,但是也达到了实验要求,最后又改用始终计时器,浪费了很多时间。
3 )在急停之后如何出循环成为一个很大的困惑,最后运用了“ while ”循环解决了4 )发现用子程序以后会使程序简明不少。
指导老师签字:附录:实验一流水灯实验最终实现:按任意键反向,只是必须等到一轮结束以后。
程序如下:#include#define uchar unsigned charsbit 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(dvoid main() { uchar b,y,n; flick(); while(1) { n=b; y=(n%2); if(y==1){ uchar x; for(x=0;xko2=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 intsbit 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.0592MHzwhile (--j); } while (--i); }void flick() { uchar d; while(dvoid show() {char j; switch(j) { case0:P0=tab2[j];j++;P1=tab1[tab3[0]];break; case1:P0=tab2[j];j++;P1=tab1[tab3[1]];break; case2:P0=tab2[j];j++;P1=tab1[tab3[2]];break; case3: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;mif(b==n) { TR1=0; b=0; n=1; flick(); }实验三双机通信实验最终实现:两机连接后按任意键可在两外的机子上显示该键编号。