返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

第一章:硬件资源模块第二章:keilc软件使用
at89s51单片机实验及实践课题     at89s51单片机实验及实践课题
1.闪烁灯2.模拟开关灯
3.多路开关状态指示4.广告灯的左移右移
5.广告灯(利用取表方式)6.报警产生器
7.I/O并行口直接驱动LED显示8.按键识别方法之一
9.一键多功能按键识别技术10.00-99计数器
11.00-59秒计时器(软件延时)12.可预置可逆4位计数器
13.动态数码显示技术14.4×4矩阵式键盘识别技术
15.定时计数器T0作定时(一)16.定时计数器T0作定时应用技术(二)
17.99秒马表设计18.“嘀、嘀、……”报警声
19.“叮咚”门铃20.数字钟(★)
21.拉幕式数码显示技术22.电子琴
23.模拟计算器数字输入及显示24.8×8LED点阵显示技术
25.点阵LED“0-9”数字显示技术26.点阵式LED简单图形显示技术
27.ADC0809A/D转换器基本应用技术28.数字电压表
29.两点间温度控制30.四位数数字温度计
31.6位数显频率计数器32.电子密码锁设计
33.4×4键盘的电子密码锁34.带有存储器功能的数字温度计-DS1624技术应用
35.DS18B20数字温度计使用

单片机c语言<>欢迎进入51单片机学习网论坛讨论

本站新域名www.8951.com开通WWW.51C51.COM 中国单片机编程技术普及推广第一站!

            21.拉幕式数码显示技术

1.  实验任务

AT89S51单片机的P0.0/AD0P0.7/AD7端口接数码管的ah端,8位数码管的S1S8通过74LS138译码器的Y0Y7来控制选通每个数码管的位选端。AT89S51单片机的P1.0P1.2控制74LS138ABC端子。在8位数码管上从右向左循环显示“12345678”。能够比较平滑地看到拉幕的效果。

2.电路原理图

4.21.1

3.系统板上硬件连线

(1.       把“单片机系统”区域中的P0.0/AD0P0.7/AD78芯排线连接到“动态数码显示”区域中的ah端口上;

(2.       把“三八译码模块”区域中的Y0Y78芯排线连接到“动态数码显示”区域中的S1S8端口上;

(3.       把“单片机系统”区域中的P1.0P1.2端口用3根导线连接到“三八译码模块”区域中的ABC“端口上;

4.程序设计方法

(1.       动态数码显示技术;如何进行动态扫描,由于一次只能让一个数码管显示,因此,要显示8位的数据,必须经过让数码管一个一个轮流显示才可以,同时每个数码管显示的时间大约在1ms4ms之间,所以为了保证正确显示,我必须每隔1ms,就得刷新一个数码管。而这刷新时间我们采用单片机的定时/计数器T0来控制,每定时1ms对数码管刷新一次,T0采用方式2

(2.       在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。

5.程序框图

 

主程序框图

 

 

 

 

 

 

 

 


中断服务程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 6.汇编源程序

DISPBUF         EQU 30H

DISPCNT         EQU 38H

DISPBIT         EQU 39H

T1CNTA          EQU 3AH

T1CNTB          EQU 3BH

CNT             EQU 3CH

 

                ORG 00H

                LJMP START

                ORG 0BH

                LJMP INT_T0

START:          MOV DISPCNT,#8

                MOV A,#10

                MOV R1,#DISPBUF

LP:             MOV @R1,A

                INC R1

                DJNZ DISPCNT,LP

                MOV DISPBIT,#00H

                MOV T1CNTA,#00H

                MOV T1CNTB,#00H

                MOV CNT,#00H

                MOV TMOD,#01H

                MOV TH0,#(65536-1000) / 256

                MOV TL0,#(65536-1000) MOD 256

                SETB TR0

                SETB ET0

                SETB EA

                SJMP $

 

INT_T0:

                MOV TH0,#(65536-1000) / 256

                MOV TL0,#(65536-1000) MOD 256

                MOV A,DISPBIT

                ADD A,#DISPBUF

                MOV R0,A

                MOV A,@R0

                MOV DPTR,#TABLE

                MOVC A,@A+DPTR

                MOV P0,A

                MOV A,P1

                ANL A,#0F8H

                ADD A,DISPBIT

                MOV P1,A               

                INC DISPBIT

                MOV A,DISPBIT

                CJNE A,#08H,NEXT

                MOV DISPBIT,#00H

NEXT:           INC T1CNTA

                MOV A,T1CNTA

                CJNE A,#50,LL1

                MOV T1CNTA,#00H

                INC T1CNTB

                MOV A,T1CNTB

                CJNE A,#8,LL1

                MOV T1CNTB,#00H

                INC CNT

                MOV A,CNT

                CJNE A,#9,LLX

                MOV CNT,#00H

                MOV A,CNT

LLX:            CJNE A,#01H,NEX1

                MOV 30H,#8

LL1:            LJMP DONE

NEX1:           CJNE A,#02H,NEX2

                MOV 31H,#8

                MOV 30H,#8

                LJMP DONE

NEX2:           CJNE A,#03H,NEX3

                MOV 32H,#8

                MOV 31H,#8

                MOV 30H,#8

                LJMP DONE

NEX3:           CJNE A,#04H,NEX4

                MOV 33H,#8

                MOV 32H,#8

                MOV 31H,#8

                MOV 30H,#8

                LJMP DONE

NEX4:           CJNE A,#05H,NEX5

                MOV 34H,#8

                MOV 33H,#8

                MOV 32H,#8

                MOV 31H,#8

                MOV 30H,#8

                LJMP DONE

NEX5:           CJNE A,#06H,NEX6

                MOV 35H,#8

                MOV 34H,#8

                MOV 33H,#8

                MOV 32H,#8

                MOV 31H,#8

                MOV 30H,#8

                LJMP DONE

NEX6:           CJNE A,#07H,NEX7

                MOV 36H,#8

                MOV 35H,#8

                MOV 34H,#8

                MOV 33H,#8

                MOV 32H,#8

                MOV 31H,#8

                MOV 30H,#8

                LJMP DONE

NEX7:           CJNE A,#08H,NEX8

                MOV 37H,#8

                MOV 36H,#8

                MOV 35H,#8

                MOV 34H,#8

                MOV 33H,#8

                MOV 32H,#8

                MOV 31H,#8

                MOV 30H,#8

                LJMP DONE

NEX8:           CJNE A,#00H,DONE

                MOV 37H,#10

                MOV 36H,#10

                MOV 35H,#10

                MOV 34H,#10

                MOV 33H,#10

                MOV 32H,#10

                MOV 31H,#10

                MOV 30H,#10

LL:             LJMP DONE

DONE:           RETI

TABLE:          DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H

                END

7.C语言源程序

#include <AT89X51.H>

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,

                               0x66,0x6d,0x7d,0x07,

                               0x7f,0x6f,0x77,0x7c,

                               0x39,0x5e,0x79,0x71,0x00};

unsigned char dispbitcode[]={0xf8,0xf9,0xfa,0xfb,

                             0xfc,0xfd,0xfe,0xff};

unsigned char dispbuf[8]={16,16,16,16,16,16,16,16};

unsigned char dispbitcnt;

unsigned int t02scnt;

unsigned char t5mscnt;

unsigned char u;

unsigned char i;

 

void main(void)

{

  TMOD=0x02;

  TH0=0x06;

  TL0=0x06;

  TR0=1;

  ET0=1;

  EA=1;

  while(1);

}

 

void t0(void) interrupt 1 using 0

{

  t5mscnt++;

  if(t5mscnt==4)

    {

      t5mscnt=0;

      P0=dispcode[dispbuf[dispbitcnt]];

      P1=dispbitcode[dispbitcnt];

      dispbitcnt++;

      if(dispbitcnt==8)

        {

          dispbitcnt=0;

        }

    }

  t02scnt++;

  if(t02scnt==1600)

    {

      t02scnt=0;

      u++;

      if(u==9)

        {

          u=0;

        }

      for(i=0;i<8;i++)

        {

          dispbuf[i]=16;

        }

      for(i=0;i<u;i++)

        {

          dispbuf[i]=8;

        }

    }

}