单片机课程设计之计数器

这是我们这个学期的课程设计课题

下面就分享一下我的报告

写的有不正确之处请指教

一、设计任务与要求
1)设计任务
1表使用8051单片机实现计数功能;
2使用6LED对测量结果进行显示
3能通过按键对设计的计数器进行计数的效果;
2)设计要求:
1上电时,数码管显示000000
2利用三个按钮实现计数器的操作,并实现进位功能;

     3按键可以进行控制计时的个位,十位,百位;
二、硬件原理及单元电路分析
1、硬件原理分析:

1 STC12C5404AD资料



    STC12C5410AD系列及STC12C2052AD系列单片机是宏晶科技生产的单时钟/ 机器周期(1T)的单片机,是高速/ 低功耗/ 超强抗干扰的新一代8051 单片机,指令代码完全兼容传统8051,但速度快8-12倍,内部集成MAX810专用复位电路。4PWM,8路高速10A/D转换,针对电机控制,强干扰场合。STC12C2052AD系列只有2PWM,8 路高速8A/D 转换。
    1ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;
2EEPROM 功能;
3.看门狗10.内部集成MAX8
4.专用复位电路(外部晶体12M 以下时,可省外部复位电路);
5.时钟源:外部高精度晶体/ 时钟,内部R/C 振荡器用户在下载用户程序时,可选择是使用内部R/C 振荡器还是外部晶体/ 时钟常温下内部R/C 振荡器频率为:5.2MHz 6.8MHz精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,应认为是4MHz 8MHz
6.共616位定时器/计数器,两个专用16位定时器T0 T1再加上PCA模块可再实现416位定时器,STC12C2052AD系列只有两路PCA
7.外部中断2,下降沿中断或低电平触发中断,Power Down模式可由外部中断唤醒;
    8PWM(4 路)/PCA(可编程计数器阵列,4 路),5410 系列是4 路,2052 系列只有两路
       --- 也可用来当4 D/A 使用
       --- 也可用来再实现4 个定时器
   --- 也可用来再实现4 个外部中断
9A/D 转换, 10位精度ADC,共8路。STC12C2052AD系列只有8位精度;
10.通用全双工异步串行口(UART),由于STC12系列是高速的8051,也可再用定时器软件实现多串口。
11、通用I/O 口(27/23/15 个),复位后为: 准双向口/ 弱上拉(普通8051 传统I/O 口)
可设置成四种模式:准双向口/ 弱上拉,推挽/ 强上拉,仅为输入/ 高阻,开漏
每个I/O 口驱动能力均可达到20mA,但整个芯片最大不得超过55mA
12、工作频率范围:0 - 35 MHz,相当于普通8051 0420MHz.实际工作频率可达48MHz

274LS138资料











原理如下:
  
工作原理
①当一个选通端(E1)为高电平,另两个选通端((/E2))/(E3))为低电平时,可将地址端(A0A1A2)的二进制编码在Y0Y7对应的输出端以低电平译出。比如:A2A1A0=110时,则Y6输出端输出低电平信号。
②利用 E1E2E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。
③若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
④可用在8086的译码电路中,扩展内存。
74LS138的引脚功能:
A0~A2:地址输入端
STAE1):选通端
/STB/E2)、/STC/E3):选通端(低电平有效)
/Y0~/Y7:输出端(低电平有效)
VCC:电源正
GND:地
A0~A2对应Y0——Y7A0,A1,A2以二进制形式输入,然后转换成十进制,对应相应Y的序号输出低电平,其他均为高电平;


374LS164资料     


8位移位寄存器(串行输入,并行输出)
简要说明:
    当清除端(CLEAR)为低电平时,输出端(QAQH)均为低电平。串行数据输入端(AB)可控制数据。当 AB任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下Q0为低电平。当AB有一个为高电平,则另一个就允许输入数据,并在CLOCK上升沿作用下决定Q0的状态。

4MAX232的资料
 
内部结构基本可分三个部分:
    第一部分是电荷泵电路。由123456脚和4只电容构成。功能是产生+12v-12v两个电源,提供给RS-232串口电平的需要。
    第二部分是数据转换通道。由7891011121314脚构成两个数据通道。
    其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
    8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
    TTL/CMOS数据从T1INT2IN输入转换成RS-232数据从T1OUTT2OUT送到电脑DP9插头;DP9插头的RS-232数据从R1INR2IN输入转换成TTL/CMOS数据后从R1OUTR2OUT输出。
第三部分是供电。15DNG16VCC+5v)。
2、单元电路分析:
  1)单片机外部振荡电路:

2)利用74LS138进行数码管的位码选择:


(3)利用74LS164进行数码管的段选:
三、软件原理及框图阐述

1)系统框图



2)程序框图
















四、总原理图及元器件清单
1.原理图:
1Protues总原理图

(2)最小系统原理图:


2.元件清单

元件序号
型号
主要参数
数量
备注
R1,R3,R4,R5
金属膜电阻
10k
4

R2
金属膜电阻
2.2k
1

R6
金属膜电阻
1k
1

R7
金属膜电阻
3k
1

C1,C2
电容33
33pF
2

C3
电解电容
10uF
1

C4,C5,C6,C7
电容104
0.1uF
4

S1,S2,S3
WJW按钮
按钮
3

LED3
3位数码管
晶体管
2

U1
STC12C5404AD
单片机
1

U2
74LS138
多路开关译码
1

U3
74LS164
串行输入转并行输出
1

U4
MAX232
数据传输芯片
1

LS1
SPEAKER
蜂鸣器
1

T1
S8050
三极管
1

L1
XTAL
12MHZ晶振
1

J1
CON2
二脚塑料插座
1

J3
CON3
三脚塑料插座
1

J2
CON5
五脚塑料插座
1

RS1
RS232
9RS232
1


 五、软硬件调试
1、软件仿真结果:



2、实物照片:


3、具体操作过程:
上电后,初始化计数为00.00.00,开始显示计数器功能。按下S1键,个位数码管加一。再按下S2键,十位数码管加一,再按下S3键,百位数码管加一,可以记录此时的计数显示。并且当每一位到达进“9”时,进行进位,高位加一,此位归零。



六、性能测试与分析

1、可以实现的功能:
    1. 这次秒表的设计是通过单片机实现计数和进位功能;
2.通过测试,可以实现以数字形式显示计数的功能;
  3
通过按键S1控制个位,S2为控制十位,S3为控制百位,在以上的功能条件下可以进行计数;

2、计数的精度:
    该计数器可以实现范围内的的计数,并且可以通过按键控制个位,十位,百位直接加一

附录: 软件清单
;STC12C54XX最小系统板 人机交互参考程序

S1  EQU P1.4   ; S1--执行键
S2      EQU     P1.3   ; ↑键
S3  EQU P1.2   ; ↓键
CLK164  EQU     P3.4   ;SBUFF中模拟串口时钟线
DAT164  EQU     P1.1   ;SBUFF中模拟串口数据线
WEIMA   EQU     2FH    ;位码

EXEBIT  EQU 21H.1  ; 执行键 闭合
UPBIT   EQU 21H.2  ; ↑键 闭合
DOWNBIT EQU 21H.3  ; ↓键 闭合
EXEX    EQU 22H.1  ; 执行键 已执行
UPX EQU 22H.2  ; ↑键 已执行
DOWNX   EQU     22H.3  ; ↓键 已执行

LED0    EQU     35H    ;LED0显示值缓冲单元
LED1    EQU     34H    ;LED1显示值缓冲单元
LED2    EQU     33H    ;LED2显示值缓冲单元
LED3    EQU     32H    ;LED3显示值缓冲单元
LED4    EQU     31H    ;LED4显示值缓冲单元
LED5    EQU     30H    ;LED5显示值缓冲单元

OLD1    EQU 80H    ; S1 按下 时长
OLD2    EQU 81H    ; S2 按下 时长
OLD3    EQU 82H    ; S3 按下 时长
YEAR    DATA    36H    ; 比较 时长 常数


LEDTAB  EQU   0700H    ; 7段译码表


        ORG 0000H
                   LJMP BEGIN    ;开机复位,从此进入

        ORG 0003H
           ;LJMP    INTEX0   ;外中断0,中断入口

        ORG 000BH
           LJMP INTT0   ;T0中断,中断入口

        ORG 0013H
           ;LJMP    INTEX1  ;外中断1,中断入口

        ORG 001BH
           ;LJMP    INTT1    ;T1中断,中断入口

        ORG 0023H
                ;  LJMP RECEI    ;串行中断,中断入口

        ORG 002BH
           ;   LJMP INTT2  ;T2中断,中断入口

                ORG     0033H
               ;   LJMP  INTPCA  ;PCA中断,中断入口

           ORG     0040H
       BEGIN:  MOV     IE,#00H   ;开机关中断
           MOV     SP,#0E0H  ;重新设置堆栈指针
               CLR     P3.7      ;蜂鸣器消声
               MOV     LED0,#80H ;给显示缓冲初值.
               MOV     LED1,#00H
               MOV     LED2,#80H
               MOV     LED3,#00H
               MOV     LED4,#80H
               MOV     LED5,#00H

               LJMP    HERE      ;进入主循环体




               ORG     0100H
       HERE:    ;主循环体
                LCALL   DISPLED  ;LED数码管动态扫描程序
                JMP     HERE

       MAIN:
                RET  ;主程序

       DISPLED: ;LED数码管动态扫描程序
       DISP:    MOV R1,#LED5
        MOV R7,#07H
                MOV DPTR,#LEDTAB
                MOV     WEIMA,P1
        ANL WEIMA,#1FH  ;清零P2.7 P2.6 P2.5
       DISP1:   LCALL   EXBIT ;交换位码字节的bit5bit7
                ORL     A,#1CH
                MOV     P1,A
        MOV A,@R1
        MOVC    A,@A+DPTR
                LCALL   SBUFF  ;调用 模拟串口子程序
                LCALL   KEYAN  ;调用键盘扫描执行子程序
                LCALL   MAIN   ;执行主程序
                LCALL   DEL    ;调用软件延时子程序
                LCALL   DEL    ;可根据主程序长短增删个数
                LCALL   DEL
                LCALL   DEL
                LCALL   DEL
                LCALL   DEL
                LCALL   DEL
        INC R1
                MOV     A,WEIMA
                ADD     A,#20H
                MOV     WEIMA,A
        DJNZ    R7,DISP1
        LJMP    DISP

       EXBIT:   MOV     A,WEIMA  ;交换位码字节的bit5bit7
                MOV     C,ACC.5
                MOV     F0,C
                MOV     C,ACC.7
                MOV     ACC.5,C
                MOV     C,F0
                MOV     ACC.7,C
                RET

       SBUFF:   MOV R3,#08H   ;模拟串口子程序
       SBUFF1:  RLC A
        MOV DAT164,C ;
                CLR     CLK164   ;
        NOP
                SETB    CLK164   ;
        DJNZ    R3,SBUFF1
        RET

       KEYAN:   ;键盘扫描执行子程序
       KEY1:    JNB S1,KEY1A    ;S1按下则跳转
        MOV R0,#OLD1    ;未按下清零
        CLR A
        MOV @R0,A
        CLR 21H.1
        CLR 22H.1
        LJMP    KEY2
       KEY1A:   MOV R0,#OLD1
        LCALL   KEYS       ;调用判断按键时长子程序
        MOV 21H.1,C
       KEY2:    JNB S2,KEY2A   ;S2按下则跳转
        MOV R0,#OLD2   ;未按下清零
        CLR A
        MOV @R0,A
        CLR 21H.2
        CLR 22H.2
        LJMP    KEY3
       KEY2A:   MOV R0,#OLD2
        LCALL   KEYS     ;调用判断按键时长子程序
        MOV 21H.2,C
       KEY3:    JNB S3,KEY3A   ;S3按下则跳转
        MOV R0,#OLD3   ;未按下清零
        CLR A
        MOV @R0,A
        CLR 21H.3
        CLR 22H.3
        LJMP    AN
    KEY3A:  MOV R0,#OLD3
        LCALL   KEYS    ;调用判断按键时长子程序
        MOV 21H.3,C

    AN:     JB  21H.1,AN1     ;键盘执行
        JB  21H.2,AN2
        JNB 21H.3,AN0
        LJMP    AN3
    AN0:    LJMP    EEAN
    AN1:    JB  22H.1,AN1E
                LCALL   EXES1   ;执行S1
        SETB    22H.1
    AN1E:   LJMP    EEAN
    AN2:    JB  22H.2,AN2E
                LCALL   EXES2   ;执行S2
                SETB    22H.2
    AN2E:   LJMP    EEAN
    AN3:    JB  22H.3,AN3E
                LCALL   EXES3  ;执行S3
                SETB    22H.3
    AN3E:   LJMP    EEAN
    EEAN:  RET

        EXES1: ;执行S1
                INC     LED0
                MOV     A,LED0
                CJNE    A,#8AH,ENDS1
                MOV     LED0,#80H
                MOV     A,LED1
                ADD     A,#01H
                MOV     LED1,A
                CJNE    A,#0AH,ENDS1
                MOV     LED1,#00H
                MOV     A,LED2
                ADD     A,#01H
                MOV     LED2,A
                CJNE    A,#8AH,ENDS1
                MOV     LED2,#80H
                MOV     A,LED3
                ADD     A,#01H
                MOV     LED3,A
                CJNE    A,#0AH,ENDS1
                MOV     LED3,#00H
                MOV     A,LED4
                ADD     A,#01H
                MOV     LED4,A
                CJNE    A,#8AH,ENDS1
                MOV     LED4,#80H
                MOV     A,LED5
                ADD     A,#01H
                MOV     LED5,A
                CJNE    A,#0AH,ENDS1   ;;
                MOV     LED5,#00H
                RET
                ENDS1:
                RETI
        EXES2:  ;执行S2
                INC      LED1   ;;
                MOV      A,LED1
                CJNE     A,#0AH,ENDS2
                MOV      LED1,#00H
                 MOV     A,LED2
                ADD     A,#01H
                MOV     LED2,A
                CJNE    A,#8AH,ENDS1
                MOV     LED2,#80H
                MOV     A,LED3
                ADD     A,#01H
                MOV     LED3,A
                CJNE    A,#0AH,ENDS1
                MOV     LED3,#00H
                MOV     A,LED4
                ADD     A,#01H
                MOV     LED4,A
                CJNE    A,#8AH,ENDS1
                MOV     LED4,#80H
                MOV     A,LED5
                ADD     A,#01H
                MOV     LED5,A
                CJNE    A,#0AH,ENDS1   ;;
                MOV     LED5,#00H
        ENDS2:  RET
        EXES3:  ;执行S3
                 INC      LED2
                 MOV     A,LED2
                 CJNE    A,#8AH,ENDS1
                 MOV     LED2,#80H
                 MOV     A,LED3
                 ADD     A,#01H
                 MOV     LED3,A;;
                 MOV     A,LED3
                 CJNE    A,#0AH,ENDS1
                 MOV     LED3,#00H
                 MOV     A,LED4
                ADD     A,#01H
                MOV     LED4,A
                CJNE    A,#8AH,ENDS1
                MOV     LED4,#80H
                MOV     A,LED5
                ADD     A,#01H
                MOV     LED5,A
                CJNE    A,#0AH,ENDS1   ;;
                MOV     LED5,#00H

                RET

        KEYS:   ;判断按键时长子程序
                INC @R0
        MOV A,#YEAR
        CLR C
        SUBB    A,@R0
        JNC KEYS2
        MOV @R0,#00H
        SETB    C
        RET
    KEYS2:  CLR C
        RET

        INTEX0: ;外中断0 中断服务程序
                PUSH    PSW
        PUSH    ACC
        SETB    RS0

                POP     ACC
                POP     PSW
                RETI

        INTT0:  ;T0 中断服务程序
                PUSH    ACC
        PUSH    PSW
                SETB    RS1
    EINTT0:
        POP PSW
        POP ACC
        RETI

    INTT1:   ;T1 中断服务程序
        PUSH    PSW
        PUSH    ACC
        SETB    RS1

    EINTT1: POP ACC
        POP PSW
        RETI

    INTEX1: ;外中断1 中断服务程序
                PUSH   PSW
        PUSH   ACC

        EEX1:
                POP    ACC
        POP    PSW
        RETI

      DEL:      ;软件延时子程序
               ;MOV R4,#01H
      DEL3:    MOV  R3,#01H
      DEL2:    MOV  R2,#0F0H
      DEL1:    NOP
               NOP
           DJNZ R2,DEL1
          ; DJNZ    R3,DEL2
               ;DJNZ    R4,DEL3
           RET

               ORG     0700H   ;LEDTAB  7段码译码表
DB  0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
   ; 0     1    2    3   4    5    6    7    8    9
DB  0EEH,3EH,9CH,7AH,9EH,8EH,76H,1CH,0CEH
   ;  A   b    c   d   E   F   H   L    P

                ORG     0780H   ;LEDTAB. 7段码译码表带小数点
DB  0FDH,61H,0DBH,0F3H,67H,0B7H,0BFH,0E1H,0FFH,0F7H
   ; 0.    1.   2.   3.  4.   5.   6.   7.   8.   9.
DB  0EFH,3FH,9DH,7BH,9FH,8FH,77H,1DH,0CFH
   ;  A.  b.   c.  d.  E.  F.  H.  L.   P.

                END



特别说明

由于众所周知的原因,本博客以往文章的图片无法显示,请谅解。

标签

生活纪实 (191) 感想 (113) ingress (54) 软件 (49) 小诗 (35) 梦境 (28) 教程 (21) 科幻 (21) 体会 (20) 杭州 (11) blogger (5) wordpress (5) Google adsense (4) Google voice (3) Chrome (2) Tensorflow (1) 谷粉 (1)

博客归档