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

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

2012.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) 数据存储于EEPROM的技术(也可以不使用) 3) 定时中断技术 4) 按键中断技术 2、 完成功能要求

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

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

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

实验一 流水灯实验

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

1)如单片机核心板所示的硬件电路。 四、系统软件设计

设计思路:

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

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

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

1)刚开始不知道怎样只设置一个管脚(如P0^0),查阅相关资料后知道表示方法,并学会了用“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) 数据存储于EEPROM的技术(也可以不使用) 3) 定时中断技术 4) 按键中断技术 二、实验实现的功能 1) 对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。 2) 设定参数掉电后不丢失(如果不使用EEPROM,此功能可以不实现)。 3) 紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。再按该键,恢复正常显示。 三、系统硬件设计

1)如单片机核心板所示的硬件电路。 四、系统软件设计 设计思路:

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

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

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

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

5)关于跳出急停程序,用“while“循环和”if“语句实现; 6)红绿灯和黄灯的显示时间在程序最开始计数器未开始工作室设定两个数的值; 7)将以上思想汇总,编程,实现功能。程序详见附录。 五、实验过程中遇到的问题及解决方法

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

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

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

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

指导老师签字:

附录:

实验一 流水灯实验

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

程序如下:

#include

#define uchar unsigned char

sbit ko1=P3^6; sbit ko2=P3^7; sbit ki1=P0^5; sbit ki2=P0^6; sbit ki3=P0^7;

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 ko1=P3^6; sbit ko2=P3^7; sbit ki1=P0^5; sbit ki2=P0^6; sbit ki3=P0^7;

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 ko1=P3^6; sbit ko2=P3^7; sbit ki1=P0^5; sbit ki2=P0^6; sbit ki3=P0^7;

sbit scran=P0^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];

}

}

实验四 交通灯实验

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

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 ko1=P3^6; sbit ko2=P3^7; sbit ki1=P0^5; sbit ki2=P0^6; sbit ki3=P0^7;

sbit dh=P2^2; sbit dl=P2^0; sbit dy=P2^1;

sbit xh=P3^2; sbit xl=P2^6; sbit xy=P2^7;

sbit nh=P2^5; sbit nl=P2^3; sbit ny=P2^4;

sbit bh=P3^5; sbit bl=P3^3;

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

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

2012.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) 数据存储于EEPROM的技术(也可以不使用) 3) 定时中断技术 4) 按键中断技术 2、 完成功能要求

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

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

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

实验一 流水灯实验

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

1)如单片机核心板所示的硬件电路。 四、系统软件设计

设计思路:

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

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

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

1)刚开始不知道怎样只设置一个管脚(如P0^0),查阅相关资料后知道表示方法,并学会了用“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) 数据存储于EEPROM的技术(也可以不使用) 3) 定时中断技术 4) 按键中断技术 二、实验实现的功能 1) 对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。 2) 设定参数掉电后不丢失(如果不使用EEPROM,此功能可以不实现)。 3) 紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。再按该键,恢复正常显示。 三、系统硬件设计

1)如单片机核心板所示的硬件电路。 四、系统软件设计 设计思路:

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

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

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

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

5)关于跳出急停程序,用“while“循环和”if“语句实现; 6)红绿灯和黄灯的显示时间在程序最开始计数器未开始工作室设定两个数的值; 7)将以上思想汇总,编程,实现功能。程序详见附录。 五、实验过程中遇到的问题及解决方法

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

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

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

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

指导老师签字:

附录:

实验一 流水灯实验

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

程序如下:

#include

#define uchar unsigned char

sbit ko1=P3^6; sbit ko2=P3^7; sbit ki1=P0^5; sbit ki2=P0^6; sbit ki3=P0^7;

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 ko1=P3^6; sbit ko2=P3^7; sbit ki1=P0^5; sbit ki2=P0^6; sbit ki3=P0^7;

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 ko1=P3^6; sbit ko2=P3^7; sbit ki1=P0^5; sbit ki2=P0^6; sbit ki3=P0^7;

sbit scran=P0^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];

}

}

实验四 交通灯实验

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

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 ko1=P3^6; sbit ko2=P3^7; sbit ki1=P0^5; sbit ki2=P0^6; sbit ki3=P0^7;

sbit dh=P2^2; sbit dl=P2^0; sbit dy=P2^1;

sbit xh=P3^2; sbit xl=P2^6; sbit xy=P2^7;

sbit nh=P2^5; sbit nl=P2^3; sbit ny=P2^4;

sbit bh=P3^5; sbit bl=P3^3;

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


    相关文章

    LED小灯实验报告

    led 流水灯的设计报告 课程名称: led流水灯设计 学 院: 大数据与信息工程学院 专 业: 姓 名: 学 号: 年 级: 任课教师: 一. 实验的背景和意义 单片机全称叫单片微型计算机,是一种集成在电路芯片,是采用大规模集成电路技术把 ...

    关于51单片机论文

    西安邮电学院 毕 业 设 计(论 文) 题 目: 院 (系): 专 业: 班 级: 学生姓名: 导师姓名: 职称: 1.绪 论 二十世纪跨越了三个"电"的时代,即电气时代.电子时代和现已进入的电脑时代.不过,这种电脑,通 ...

    实验报告基于AT89C51的液晶显示频率计的设计

    本科学生单片机课程设计报告 题姓学院 目名 号(系) 基于单片机的频率计设计 201218033工程与设计学院应用电子技术教育2012级杨 进 宝 专业.年级指导教师 课程设计成绩评定表 项目 评分依据 电路板焊接工艺功能完整 设计作品 性 ...

    基于单片机的智能照明控制系统设计论文

    届别 2012 届 学号 毕业设计(论文) 基于单片机的智能照明控制系统设计 姓 名 系 别 . 专 业 导师姓名.职称 完 成 时 间 目 录 摘要 ............................................ ...

    单片机毕业设计题目

    1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数字气压计的设计与实现 8. ...

    自动化毕业设计论文题目

    自 动 化 毕 业 设 计 论 文 题 目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. ...

    电气自动化设计论文题目大全

    机电一体化 毕 业 设 计 论 文 题 目 第1-100个电气自动化毕业设计论文题目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入 ...

    电气自动化毕业设计论文题目

    电 气 自 动 化 毕 业 设 计 论 文 题 目 第1-100个电气自动化毕业设计论文题目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6 ...

    简易电子琴毕业论文

    姓 名 专 业 班 级 11论 文 名 称 指 导 教 师 王 坤 杰 电子4 简易电子琴 孙德刚 附件1: 毕业设计(论文)任务书 届:专业(班):: 进度安排 指导教师评语 指导教师签名: 评阅教师评语 评阅教师签名: 答辩小组组长 年 ...