单片机课程设计报告范例

单片机课程设计示例

交通灯控制系统设计

一、总体设计

1、设计要求:

交通灯的任务要求为:模拟十字路口的交通灯的亮、灭及闪烁

基本工作原理:根据交通灯的亮灭情况,可以分为四种状态,利用定时计数器每20秒产生一次中断,每产生一次中断后由是否有特殊情况决定交通灯的状态变换。

2、  硬件和软件功能的划分

本课题要求实现的功能比较简单。由单片机的定时/计数器产生八分之一秒的定时时间,通过软件的方式实现20秒的定时时间。交通灯的亮灭由8255A控制,PA口控制东西向,PB口控制南北向。

3、  交通灯状态划分

十字路口交通灯如下图所示,将12个交通灯进行编号

这12个交通灯共有四个状态:

     状态1(S1):东西红灯(4、10)亮,南北绿灯(3、9)亮

状态2(S2):南北绿灯(3、9)灭,黄灯(2、8)闪烁,东西仍为红灯(4、10)亮

状态3(S3):南北红灯(1、7)亮,东西绿灯(6、12)亮

状态4(S4):东西绿灯(6、12)灭,黄灯(5、11)闪烁,南北仍为红灯(1、7)亮

当东西向(或南北向)有特殊情况,开关K0为低电平则应使交通灯处于S3(东西绿灯、南北),开关K1为低电平则应使交通灯处于S1(南北向绿灯、东西向红灯),当K0、K1均为低电平则取消特殊情况,返回正常显示情况。

二、硬件设计

根据总体设计要求,确定系统扩展与功能接口,设计出系统的电路原理图。

1、  系统扩展

最小系统,由8031、地址锁存器和程序存储器组成。根据课题要求,在此基础上进行扩展。地址锁存器选74LS373,程序程序器选2764(8K),尽管本系统程序不长,但考虑以后扩展方便,选用2764。

考虑到交通灯数量比较多,控制信号比较多,对单片机的I/O口进行扩展,使用通用I/O接口芯片8255A来对单片机I/O口进行扩展。

2、  功能接口

所谓接口是CPU与外界的连接部件,以实现CPU与外部设备的最佳耦合和匹配。本课题只要求显示接口。显示设备为2位七段数码管。要使用七段数码管可以利用8031的串行口、可以利用可编程并行I/O扩展芯片8155或8255。由于仿真系统的限制选用8155。

2个共阴极数码管自左至右以两位数的形式显示秒数。为了保证数码管的亮度,必须保证输入电流的大小,因此,选用74LS244作为驱动放大器(实验系统内部已经做好)。

3、  系统的组成及统一编址

I/O端口是CPU与I/O设备直接通信的地址。单片机系统对I/O端口是采用端口地址与存储器地址统一编址的方式,即存储器映射方式。编址技术分线选法和译码法。由于涉及外围芯片很少,所以采用线选法。系统简图如下:

由于是线选法,因此芯片地址不是唯一的。而8155与外部数据存储器统一编址,可以与程序程序器重叠编址。因此,我们取它们的地址如下:

2764:0000H~1FFFH        存储程序

8155:命令/状态口 7F80H

      PA口       7F81H   输出扫描码(字选码)

      PB口       7F82H   输出字形码

      PC口       7F83H   接收回复码

      定时器低8位7F84H  没用

      定时器高8位7F85H  没用

      RAM        3F00H~3FFFH没用

      工作方式为:定时器不工作,禁止PA、PB中断,PC口为输入方式(方式0),PA口、PB口为输出方式。因此,工作方式字为03H。

4、  汇集各芯片及数码管的技术资料,绘制系统原理图。

将8031、74LS373、2764、8155、数码管(包括为保证其驱动电流而添加的驱动器74LS244)等资料汇集起来,熟悉各芯片的引脚的功能及连接方法,绘制系统原理图。

三、软件设计  

1、系统定义

1.1、各种数据类型的定义。

秒采用采用BCD码,八分之一秒计数采用16进制。

1.2、定义和分配存储空间、定义标志位。

堆栈区安放在片内RAM的高端60H~7FH;

0区为工作寄存器;

1区为显示程序的工作寄存器;

地址为3AH的存储单元内存放LED显示的数据,以压缩BCD码形式存放

设计一个标志单元,地址为3CH,用来标示当前交通灯的状态,共四种状态,00H带表状态1,01H代表状态2,02H代表状态3,03代表状态4

存储单元列表如下:

    位标志在设计过程中,根据需要再添加。

2、  软件结构设计

程序总体执行过程是:上电后系统自动进行初始化,定时/计数器开始工作,检测标志单元3CH,根据3CH单元中的内容让交通灯处于对应的状态, 然后调用显示子程序,将3AH和3BH地址内的数据在七段数码管上显示出来。接着循环检测3CH单元中的内容以及特殊情况控制信号和调用显示子程序,让交通灯处于对应的状态,将3AH地址内的数据送七段数码管上显示出来,在整个过程中定时/计数器中断始终打开等待定时/计数器中断。中断服务程序完成状态的变换(3CH的值的改变)以及LED显示内容(3AH)的改变。

主程序的框图都如图所示:

    

3、  模块设计

根据主程序框图,定义如下几个模块:

初始化模块、状态1显示子程序、状态2显示子程序、状态3显示子程序、状态4显示子程序、出错处理程序、LED显示程序、中断服务程序。由于在程序运行过程中多次出现需要延时的情况,这里将延时程序也作为一个模块。

3.1、初始化模块

功能:完成变量初始化、8155初始化、定时器初始化和中断初始化。初始化的框图如图所示。

根据框图写出如下程序:(注意:后面我们要经常对以下程序进行补充和修改,利用它对其它模块或子程序进行调试。因此,要随时保存不同的版本。为方便起见,以下程序我们称版本1.0)

ORG     0000H

            AJMP    START

            ORG     000BH    ;T0中断入口地址

            AJMP    INT0     ;中断服务程序

            ORG     0030H

START:   MOV     SP,#60H  置堆栈顶指针

  MOV     3AH,#20H时间存储区单元初始化

            MOV     3CH,#00H

            MOV     R3,00H

          MOV     R2,00H

          MOV     A,#80H     ;8255A初始化,置工作方式

          MOV     DPTR,#0FF2BH

          MOVX    @DPTR,A

          MOV     A,#03H                      ;置8155命令格式

MOV     DPTR,#0FF20H               ;指向命令口

MOVX    @DPTR,A

          MOV      TMOD,#01H ;置T0为定时器,工作方式1

          MOV      TH0,0BH

          MOV      TL0,0DCH

          SETB     EA   ;中断初始化

          SETB     ET0

          SETB     TR0

程序中的时间常数是从要求一秒中断一次,但8051单片机的最大定时时间达不到1秒,所以选择1/8秒作为定时时间。DVCC的晶振频率为6MHz,则机器周期为2μs。设时间初值为X,工作方式1时定时器为16位,最大计数值为216=65536,则:

1/8=(65536-X)×2×10-6

解得X=3036D=0BDCH

TH0 =0BH,TL0 =0DCH。

3.2状态1显示程序模块

功能:交通灯处于状态1

状态1(S1)为东西红灯(4、10)亮,南北绿灯(3、9)亮,所以本程序模块即为将3、4、9、10号灯点亮

3.2.1、程序

由于本模块的程序比较简单,只是简单的将4个高电平打到对应的端口就可以了,所以程序框图略,在这里直接给出程序:

DISP1:   MOV   DPTR,#0FF29H

          MOV   A,#00H

          MOVX  @DPTR,A

          INC    DPTR

          MOV   A,00H        ;让所有灯熄灭

          MOVX  @DPTR,A

MOV   DPTR,#0FF29H

          MOV   A,#03H

          MOVX  @DPTR,A

          INC    DPTR

          MOV   A,0CH

          MOVX  @DPTR,A     ;东西红灯亮,南北绿灯亮

          RET

3.3状态2显示程序

状态2(S2)为东西红灯(4、10)亮,南北黄灯黄灯(2、8)闪烁,本程序模块比状态1显示程序稍稍复杂一点,除了要将高电平打入对应的端口外还要控制黄灯的闪烁,黄灯的闪烁采用软件延时的办法实现,即黄灯亮后延时一段时间再灭,然后再延时一段时间再亮。

3.3.1程序

程序框图如下:

程序如下:

DISP2:   MOV   DPTR,#0FF29H

          MOV   A,#00H

          MOVX  @DPTR,A

          INC    DPTR

          MOV   A,00H        ;让所有灯熄灭

          MOVX  @DPTR,A

MOV   DPTR,#0FF29H

          MOV   A,#02H

          MOVX  @DPTR,A

          INC    DPTR

          MOV   A,8AH

MOVX  @DPTR,A      ;东西红灯亮,南北黄灯亮

          ACALL  DELAY        ;延时1秒

          MOV   A,08H

MOVX  @DPTR,A      ;南北黄灯灭

                ACALL  DELAY        ;延时1秒

                RET

3.4状态3显示程序及状态4显示程序

状态3显示程序与状态1显示程序类似,状态4显示程序与状态2显示程序类似,请同学们参照状态1和状态2显示程序自行完成状态3和状态4显示程序,这里就不详细叙述了。

3.5出错处程序

出错处理程序指的是状态标志字节中的数据超过了正常范围(00H~03H)时的处理程序,正常情况下一般不会出现。当系统出现故障时,出现这种情况应该将所有红灯变亮。

其程序与框图与状态1类似。

3.6延时程序

延时程序用来实现延时1秒的功能,采用软件延时的方式。显然延时程序要用循环结构来实现,由于延时1秒是一个比较长时间的延时所以要采用三重循环来实现。延时程序是一个比较简单的纯粹的循环程序,结构比较简单,框图就省略,这里直接给出程序。

3.6.1延时程序

     DEALY: MOV  R7,#02H

      LOOP1:  MOV  R6,#0FFH

     LOOP2:   MOV  R5,0FFH

     LOOP3:   NOP

               DJNZ R5,LOOP3

               DJNZ R6,LOOP2

               DJNZ R7,LOOP1

     RET

当然,采用软件延时由于存在中断以及其它因素的影响,不可能达到精确的1秒,这里的延时程序大概延时0.9秒,如果需要更加精确请同学们自己调整每层循环的循环次数。在实际的应用过成中由于LED显示的需要,LED显示程序调用的间隔时间不能太长,所以在实际应用中我们常常将上述延时程序改为如下程序:

     DELAY:   MOV  R7,#0FFH

     LOOP1:   MOV  R6,0FFH

     LOOP2:   ACALL DISP

               DJNZ R6,LOOP2

               DJNZ R7,LOOP1

               RET

3.7 LED显示程序

LED显示程序就是将3AH单元的内容在两个LED显示器上显示出来。由于3AH单元内存储的是压缩BCD码,所以必须在显示前对其进行拆字,即将一个字节压缩BCD码拆成两个单字节BCD码,如图所示:

3.7.1拆字程序

子程序名:CZ

功能:将将3AH单元存储的压缩BCD码拆成单字节BCD码,存储到显示存储区3DH、3EH中。

入口条件:3AH

出口条件:3DH、3EH

程序框图如右:

程序清单如下:

CZ:  MOV     R0,#3AH

     MOV     R1,#3DH

CZ1: MOV     A,@R0  

     ANL     A,#0FH

     MOV     @R1,A   ;存个位

     INC     R1

     MOV     A,@R0

     ANL     A,#0F0H

     SWAP    A

     MOV     @R1,A   ;存十位

     RET

用下列程序调试:

MOV    3AH,#12H 

        ACALL  CZ

    SJMP  $

单步执行观察3DH、3EH的值是否为02H和01H。调试成功后保存子程序CZ备用。

3.7.2、显示子程序

显示的原理如下:从最左边数码管开始,由PA口输出字选码(在这里为00100000B,即20H),由8155的PB口输出欲显示的字形码(如字符“0”,共阴极的字形码为“0C0H”),则在最左边的数码管显示字符“0”。然后,由PA口输出字选码(在这里为00010000B,即40H),由8155的PB口输出欲显示的字形码,则在下一个数码管显示相应字符。40H可以由对20H循环移位得到。共循环2次,则2个数码管自左至右顺序显示一次,调整好中间的间隔时间(用延时程序实现),利用人的视觉暂留,得到同时显示的效果。

由于字形码无规律可寻,编程不方便,因此,将字形码按0、1、……,9,A,……,F的顺序排列,其它字符如H、_、空字符(熄灭)排在其后,构成字形表。在LED5~LED0存放欲显示字符在表中的序号,通过查表程序得到相应的字形码,由PB口输出。如显示“0”时,在LED5中不是字形码为“0C0H”,而是“00H”,因为字形码“0C0H”在字形表中的序号是“0”,16进制表示为“00H”。

由此,可绘制程序框图如右图所示。

显示子程序名:DISP

功能:将3DH~3EH中的内容在数码管上显示出来。

入口条件:3DH、3EH

出口条件:无

DISP:   SETB    RS0       ;置工作寄存器1区

        MOV     R1,#3EH  ;指向3EH

        MOV     R4,#02H   ;扫描码00000010B从最左边开始

MOV     DPTR,#DTAB;字形码表首地址送DPTR

        MOV     A,@R1

        MOVC    A,@A+DPTR   ;查表得字形码

        MOV     DPTR,#0FF22H

        MOVX    @DPTR,A       ;PB口送字形码

        MOV     DPTR,#0FF21H

        MOV     A,R4

        MOVX    @DPTR,A       ;PA口送扫描码

        MOV     R5,#30H

DISP1: NOP

DJNZ    R5,DISP2        ;延时

        DEC     R1            ;指下一显示存储单元

        MOV     A,R4          ;扫描码循环右移

        RR      A

        MOV     R4,A

        CLR     RS0         ;返回工作寄存器0区

        RET                   ;返回

DTAB:   DB 0C0H,0F9H,0A4H,0B0H     ;字形码表

        DB 99H,92H,82H,0F8H,80H,90H

        DB 88H,83H,0C6H,0A1H,86H

        DB 8EH,0FFH,0C7H,89H

        DB 0FFH,0C0H,0C7H,0C7H,86H,89H

注意要根据实际情况调整两个LED显示之间的时间间隔。

3.8中断服务程序

这个程序是整个设计过程中最复杂的一个程序,它实现的功能非常多。定时/计数器每1/8秒产生一次中断,而我们实际需要的是每1秒钟LED显示器上的数字减1,每20秒交通灯变换一个状态,所以在中断服务程序中还需要用软件的方式产生1秒和20秒的定时。

3.8.1中断服务程序

程序框图如下图所示:

程序如下:

INT0:      CLR  TR0

INC  R2

                       CJNE R2,#08H,END1

                       MOV  R2,#00H

                       MOV  A,3AH

                       CJNE A,#00H,LOOP1

                       MOV  3AH,#20H

                       INC  R3

                       CJNE R3,#01H,LP1

                       MOV  3CH,#01H

                       SJMP END1

           LP1:        CJNE R3,02H,LP2

                       MOV  3CH,#02H

                       SJMP END1

           LP2:       CJNE R3,03H,LP3

                       MOV  3CH,#03H

                       SJMP END1

           LP3:       CJNE R3,04H,LP4

                       MOV  3CH,#04H

                       MOV  R3,#00H

                       SJMP END1

           LP4:       MOV  R3,#00H

ACALL ERROR

                       SJMP END1

LOOP1:     CJNE A,#20H,LOOP2

            CLR  CY

            SUBB A,#07H

            SJMP END1

LOOP2:     CJNE A,#10H,LOOP3

            CLR  CY

            SUBB A,#07H

            SJMP END1

LOOP3:     DEC 3AH

END1:                 MOV TH0,0BH

                       MOV TL0,0DCH

            SETB TR0

RETI

相关推荐