单片机实验报告流水灯双机通信交通灯定时时钟_第1页
单片机实验报告流水灯双机通信交通灯定时时钟_第2页
单片机实验报告流水灯双机通信交通灯定时时钟_第3页
单片机实验报告流水灯双机通信交通灯定时时钟_第4页
单片机实验报告流水灯双机通信交通灯定时时钟_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验一 流水灯实验一、 实验目的1) 简单I/O引脚的输出2) 掌握软件延时编程方法3) 简单按键输入捕获判断二、 实验实现的功能1) 开机是点亮12发光二极管,闪烁三下2) 按照顺时针循环依次点亮发光二极管3) 通过按键将发光二极管的显示改为顺逆时针方式三、 系统硬件设计流水灯原理图四、 系统软件设计演示程序按键闪烁正转反转五、 实验过程中遇到的问题及解决方法1) 每次循环无论正转还是反转程序,总先是先执行P1口的8位led灯。原因:在利用KEIL自带的库函数中的_crol_和_cror_时,在正转和反转程序中应该调换顺序的,开始没注意到。改正后显示正常。2) 在开始实验的时候实行的是一直循

2、环的方式,利用按键嵌套。后来发现不理想,每次按键按到三次以上后进入死循环。解决方案:利用一个按键,显示一次。并加入按键释放,防止误动作。 指导老师签字: 日期:实验一程序:/*工程说明: 本工程主要完成了一下功能:1,复位后演示所有功能2,灯闪烁三次3,流水灯正转4,流水灯反转函数说明:yanshi():演示程序dengss():闪烁程序right():正转程序left(): 反转程序scankey():按键扫描*/#ifndef _led_h#define _led_h#define uint unsigned int#define uchar unsigned charuchar i,j,

3、a,b,c,d;uchar flag=0;/亮灯判断标志uchar aa,bb,cc,dd,ss;sbit H1=P36;sbit key1=P05;sbit key2=P06;sbit key3=P07;void delay(uint);/1ms延时void yanshi(void);/演示所有亮灯方式void dengss(void);/闪烁三次void left(void); /左循环亮灯void right(void);/右循环亮灯void scankey(); /按键扫描#endif#include"stc10.h"#include<intrins.h>

4、;#include<led.h> /包含各种变量定义及函数声明main()yanshi();delay(2000); /两秒后进入可控大循环 while(1)scankey();if(flag=0)right();if(flag=1) left();if(flag=2)dengss();void delay(uint x)uint i,j;for(i=110;i>0;i-)for(j=x;j>0;j-);void yanshi()dengss();right();left();P2=0XFF;P3=0XFF;void dengss()for(ss=3;ss>0;s

5、s-)P2=0;P3=0xc3;delay(1000);P2=0xff;P3=0xff;delay(1000);flag+=3;/退出小循环,只亮一次,增大按键扫描频率void right()aa=0xfe;for(a=8;a>0;a-)P2=aa;aa=_crol_(aa,1);delay(500);bb=0xfb;P2=0xff;/熄灭循环后亮着的for(b=4;b>0;b-)P3=bb;bb=_crol_(bb,1);delay(500);/D12保留发亮flag+=3;/退出小循环,只亮一次,增大按键扫描频率void left()cc=0xdf;for(c=4;c>0

6、;c-)P3=cc;cc=_cror_(cc,1);delay(500);P3=0xff;/熄灭D9dd=0x7f;for(d=8;d>0;d-)P2=dd;dd=_cror_(dd,1);delay(500);/D1保留发亮flag+=3;/退出小循环,只亮一次,增大按键扫描频率void scankey()H1=0;if(key1=0)delay(10); if(key1=0)flag=0;while(!key1);/等待按键释放if(key2=0)delay(10); if(key2=0)flag=1;while(!key2);/等待按键释放if(key3=0)delay(10);

7、if(key3=0)flag=2; while(!key3);/等待按键释放实验二 定时器或实时时钟实验一、 实验目的1) 数码管动态显示技术2) 定时器的应用3) 按键功能定义二、 实验实现的功能1) 通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。2) 实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。三、 系统硬件设计定时器或实时时钟实验仿真图定时器0四、 系统软件设计按键正常时钟倒计时时钟数码显示全为0时灯闪烁五、 实验过程中遇到的问题及解决方法定时器0调试过程中:a) 建好工程后,操作太快,忘了将保存过的C文件添加到工程

8、里面,提示无效module。b) 初始化函数 init_0() 声明时后面的;忘记了,调试后出现了很多错误与警告,里面的变量及端口都提示重复定义。数码管显示过程中:a) 函数编写好后调用提示:uncalled segment ,ignored for overplay.原因:有函数未调用,可是我已经调用所有函数,后来检查一段时间后发现,count_down() 被我写成了count_dowm().b) FLAG标志位应用时,当FLAG=1时应该立即执行正常时钟程序clock(),可是当按键稍微晚些按时会出现:延时一段时间后才执行。原因: num(uchar)定义于timer_0()中,主程序开

9、始时就启动,并num+,开始clock()并显示正确时间条件是:num=20,在按键按的晚时,num计数已超过20,必须等到超过定义的类型(uchar)然后重新从零记到20才能正确显示。c) 当FLAG=2时,应该在所有值均为0时进入dengss(),可每次都是直接进入。原因:全局变量和局部变量使用了相同的符号。查过资料后知,当全局变量和局部变量使用了相同的符号时,起作用的是局部变量,全局变量被屏蔽掉。所以当在dengss()中出现fen_shiwei,fen_gewei,miao_shiwei,miao_gewei 时直接做0处理,而灯闪烁的条件就是这个。当把display()中的变量名改变

10、后,执行过clock()的数值被保存,在执行count_down()时接着原来的数据变化。硬件仿真过程中:a) 数码管全暗,按键无反应原因:电阻没有连接。 指导老师签字: 日期:实验二程序:/*工程说明:此工程主要完成以下任务:1.数码显示2.按键扫描3.正常时钟显示4.倒计时5.定时中断主要函数名说明:void delay(uint);/1ms延时程序void init_0();/定时中断初始化void scankey();/按键扫描 /是时钟暂停与开始,时间调整,FLAG调整void dengss(); /灯闪烁void clock();/正常时钟void count_down();/倒计

11、时时钟void display(uchar,uchar,uchar,uchar); /数码显示*/#include<stc10.h>#include<dingshi_shuma.h>/包含变量定义和函数声明void main()P1M1=0x00;P1M0=0xff;init_0(); /初始化,设置50毫秒TR0=1; /启动定时器while(1)switch(FLAG)case 0:display(8,8,8,8);/操作前显示数字8888scankey();break;case 1:clock();scankey();break;case 2:count_down

12、();scankey();break;#ifndef _dingshi_shuma_#define _dingshi_shuma_#define uint unsigned int#define uchar unsigned char#define deport1 P1 /定义数码管段选数据入口#define deport0 P0 /定义按键选选择数据入口uchar num,FLAG=0,ss;extern uchar fen_shiwei=0,fen_gewei=0,miao_shiwei=0,miao_gewei=0;uchar clock_num10=0x3f,0x06,0x5b,0x4

13、f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴极数码显示数组0-9sbit w1=P00;sbit w2=P01;sbit w3=P02;sbit w4=P03;/位选口定义void delay(uint);/1ms延时程序void init_0();/定时中断初始化void scankey();/按键扫描void dengss(); /灯闪烁void clock();/正常时钟void count_down();/倒计时时钟void display(uchar,uchar,uchar,uchar); /数码显示void init_0() /初始化,设置50毫秒定时TM

14、OD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;void timer_0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;num+;void delay(uint x)uchar i,j;for (i=110;i>0;i-)for(j=x;j>0;j-);void dengss()for(ss=3;ss>0;ss-)P2=0;P3=0xc3;delay(1000);P2=0xff;P3=0xff;delay(1000);void cl

15、ock() /正常时钟程序if(num>=20) /1s定时num=0;miao_gewei+;if(miao_gewei=10)miao_gewei=0;miao_shiwei+;if(miao_shiwei=6)miao_shiwei=0;fen_gewei+;if(fen_gewei=10)fen_gewei=0;fen_shiwei+;if(fen_shiwei=6)fen_shiwei=0;display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);void count_down() /倒计时程序if(num>=20) /1s

16、定时num=0;miao_gewei-;if(miao_gewei=(0-1)miao_gewei=9;miao_shiwei-;if(miao_shiwei=(0-1)miao_shiwei=5;fen_gewei-;if(fen_gewei=(0-1)fen_gewei=9;fen_shiwei-;if(fen_shiwei=(0-1)fen_shiwei=5;display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);if(fen_shiwei|fen_gewei|miao_shiwei|miao_gewei)=0) /while(1)den

17、gss(); void display(uchar fen_shi,uchar fen_ge,uchar miao_shi,uchar miao_ge)w1=0;deport1=clock_numfen_shi;delay(10);w1=1;deport1=0; /消隐w2=0;deport1=clock_numfen_ge;delay(10);w2=1;deport1=0;/消隐w3=0;deport1=clock_nummiao_shi;delay(10);w3=1;deport1=0;/消隐w4=0;deport1=clock_nummiao_ge;delay(10);w4=1;depo

18、rt1=0;/消隐void scankey() uchar temp; P3=0xbf;temp=deport0;temp=temp&0xf0;if(temp!=0xf0)delay(10);temp=deport0;temp=temp&0xf0;if(temp!=0xf0)temp=deport0;switch(temp) case 0xdf: TR0=TR0;/暂停键break; case 0xbf: fen_shiwei+;if(fen_shiwei=6)fen_shiwei=0;break; case 0x7f: miao_shiwei+;if(miao_shiwei=

19、6)miao_shiwei=0;break;while(temp!=0xf0) /等待按键释放 temp=deport0;temp=temp&0xf0; P3=0x7f;temp=deport0;temp=temp&0xf0;if(temp!=0xf0) delay(10);temp=deport0;temp=temp&0xf0;if(temp!=0xf0)temp=deport0;switch(temp) case 0xdf:FLAG+;if(FLAG>=3)FLAG=1;break;case 0xbf:fen_gewei+;if(fen_gewei=10)fe

20、n_gewei=0;break;case 0x7f:miao_gewei+;if(miao_gewei=10)miao_gewei=0;break;while(temp!=0xf0) /等待按键释放 temp=deport0;temp=temp&0xf0; #endif实验三 双机通信一、 实验目的UART 串行通信接口技术应用二、 实验实现的功能用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。三、 系统硬件设计双机通讯实验仿真图四、 系统软件设计定时器0(定时时钟)串口中断(定时器1)按键数码显示数据传送五、 实验过程中遇到的问题及解决方法串口通信过程中出现的问题:a)

21、 在写程序前翻看了些相关资料,有一种写法是直接P2=SBUF;结果这种在接收程序中可以,但在发送程序中不可以。开始一直找不到原因,用led灯测试时,每次都是灯全亮。后来逐次尝试才找到了问题所在,但什么造成的这个结果还是没找到。如果是因为端口专用寄存器P2和串口数据缓冲器SBUF间不可以直接传送数据,那接收程序中为什么可以呢? ?_?解决方案:两寄存器中间找个中间变量。原因找到了:原程序SBUF=clock_nums; delay(5000); P2=SBUF;数据传送所需的时间是非常短的,而中间的延时5s所需的数据已经送走了,SBUF被重新初始化,所以出现了不正常的现象。结论:有中间变量是最可

22、靠的。b) 每次接收的数据都比发送的数据延迟一个节拍源程序:clock_num=SBUF; while(!RI);等待传送完成RI=0;清零,等待接收dis();显示函数当修改成:clock_num=SBUF; dis();显示函数while(!RI);等待传送完成RI=0;清零,等待接收时,问题消失了。c) 上面的程序还有个问题就是接收方的数码管只是闪一下就熄灭了。应把dis()放在while()后面,即:while(!RI)dis();这样在等待下次接收数据的过程中,可以一直执行显示函数。d) 串口通信和定时器0不能同时运行:TMOD定义问题,在两种初始化中定义不同,最后只能一个运行.结论

23、:工程初始化时应尽量把所有的初始化信息放在一起,方便检错.e) 数据传送过程中,各位发生错位现象:在此实验中数据传送方式为各位顺次传送的方式,传送过程中容易由于信息未送达(丢失)而造成错位显示现象.解决方案:在每个发送的数据前面发送一个标志位,按照事先设置的标志位分配数据位置. 指导老师签字: 日期:实验三程序:发送程序:#include<stc10.h>#include<dingshi_shuma.h>main()P1M0=0XFF;P1M1=0;TR0=1;init();/串口初始化init_0(); /定时器0初始化,设置50毫秒while(1)switch(FL

24、AG)case 0:display(8,8,8,8);scankey();send();break;case 1:clock();scankey();send();break;case 2:count_down();scankey();send();break; void init()SCON=0X53; /0101 0011 /SMO SM1 SM2 REN TB8 RB8 TI RIPCON=0X80;TMOD=0X21;TH1=232;TL1=232;TR1=1;void send()switch(m)case 0:SBUF=10; /标志位,区分送到的数据应放在什么位上while(!T

25、I);TI=0;SBUF=miao_gewei;while(!TI)/等待数据发送完成并一直显示上次发送的数据scankey();display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);TI=0;m+;break;case 1:SBUF=11; /标志位,区分送到的数据应放在什么位上while(!TI);TI=0;SBUF=miao_shiwei;while(!TI)/等待数据发送完成并一直显示上次发送的数据scankey();display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);TI=0;m

26、+;break;case 2:SBUF=12; /标志位,区分送到的数据应放在什么位上while(!TI);TI=0;SBUF=fen_gewei;while(!TI)/等待数据发送完成并一直显示上次发送的数据scankey();display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);TI=0;m+;break;case 3:SBUF=13; /标志位,区分送到的数据应放在什么位上while(!TI);TI=0;SBUF=fen_shiwei;while(!TI)/等待数据发送完成并一直显示上次发送的数据scankey();display(fe

27、n_shiwei,fen_gewei,miao_shiwei,miao_gewei);TI=0;m=0;break;接收程序:#include<stc10.h>#define uint unsigned int#define uchar unsigned char#define deport1 P1 /定义数码管段选数据入口uchar clock_num10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴极数码显示数组0-9uchar fen_shiwei=5,fen_gewei=6,miao_shiwei=7,miao_

28、gewei=8;uchar WEI_FLAG,t;sbit w1=P00;sbit w2=P01;sbit w3=P02;sbit w4=P03;/位选口定义void rec();void init();void delay(uint);void display(uchar,uchar,uchar,uchar); /数码显示main()P1M0=0XFF;P1M1=0;init();while(1)rec();void init()SCON=0X53; /0101 0011 /SMO SM1 SM2 REN TB8 RB8 TI RIPCON=0X80;TMOD=0X21;TH1=232;TL

29、1=232;TR1=1;void rec()WEI_FLAG=SBUF;while(!RI);RI=0; switch(WEI_FLAG)case 10:miao_gewei=SBUF;while(!RI)/等待数据接收完成并一直显示上次接收的数据display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);RI=0;break;case 11:miao_shiwei=SBUF;while(!RI)/等待数据接收完成并一直显示上次接收的数据display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);RI=

30、0;break;case 12:fen_gewei=SBUF;while(!RI)/等待数据接收完成并一直显示上次接收的数据display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);RI=0;break;case 13:fen_shiwei=SBUF;while(!RI)/等待数据接收完成并一直显示上次接收的数据display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);RI=0;break;void display(uchar fen_shi,uchar fen_ge,uchar miao_shi,

31、uchar miao_ge)w1=0;deport1=clock_numfen_shi;delay(10);w1=1;deport1=0; /消隐w2=0;deport1=clock_numfen_ge;delay(10);w2=1;deport1=0;/消隐w3=0;deport1=clock_nummiao_shi;delay(10);w3=1;deport1=0;/消隐w4=0;deport1=clock_nummiao_ge;delay(10);w4=1;deport1=0;/消隐void delay(uint x)uchar i,j;for (i=110;i>0;i-)for(

32、j=x;j>0;j-);实验四 交通灯实验一、 实验目的1) 按键、数码管、发光二极管综合应用编程技术2) 数据存储于EEPROM的技术(也可以不使用)3) 定时中断技术4) 按键中断技术二、 实验实现的功能1) 对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。2) 设定参数掉电后不丢失(如果不使用EEPROM,此功能可以不实现)。3) 紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。再按该键,恢复正常显示。三、 系统硬件设计交通灯实验仿真图四、 系统软件设计正常程序按键所有红灯亮恢复到按键前状态五、 实验过程中遇到的问题及解决方法1) 3秒闪烁程序只

33、是运行了一下,没有正常运行原因:count 位置放错了。解决:将变量count拿到switch()外面就可以了。2) 闪烁像流水灯原因:每个灯之间时间间隔太大了。解决:把两灯之间的延时去除,最后汇在一起延时处理。 指导老师签字: 日期:实验四程序:/*工程说明:由于实验板资源有限,交通灯模拟有如下约定:红灯灭时做绿灯用,绿灯灭时做红灯用本工程重要完成的功能如下:1,红灯亮10秒;黄灯亮闪烁3秒,并在亮的过程中闪烁;绿灯亮10秒2,红灯、绿灯交替亮灭3,按键1所有红灯亮,按按键2恢复停止时状态(灯的亮灭和原来一样)*/#include<stc10.h>#define uint uns

34、igned int#define uchar unsigned char#define deport1 P1 /定义数码管段选数据入口uchar FLAG=0,FLAG_1=1,count=9,num;/FLAG:灯三种状态控制。flag:特殊状况控制。uchar clock_num10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴极数码显示数组0-9void init();/初始化函数,包括时钟定时器0、外部中断0.void go(); /行void ss(); /警示void stop(); /停void delay(uint)

35、;void scankey();void display(uchar,uchar,uchar,uchar);sbit L1=P05;sbit L2=P06;sbit L3=P07;/按键位定义sbit w1=P00;sbit w2=P01;sbit w3=P02;sbit w4=P03;/位选口定义sbit led1=P20;sbit led2=P21;sbit led3=P22;sbit led4=P23;sbit led5=P24;sbit led6=P25;sbit led7=P26;sbit led8=P27; /对各灯进行位定义,然后单个操作sbit led9=P32;sbit led10=P33;sbit led11=P34;sbit led12=P35; /对各灯进行位定义,然后单个操作sbit H1=P36; /第一排按键/sbit H2=P37;/第二排按键void main()P1M1=0x00;P1M0=0xff;init();while(1)if(FLAG=0)go(); /行else if(FLAG!=0)stop(); /停if(count<=3) /count<=3意味着着剩三秒就该换交通方向了 /此时黄灯开始闪烁ss();display(0,count,coun

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论