使用单片机实现拉幕式数码显示技术的详细说明

电子说

1.2w人已加入

描述

  1. 实验任务

  用AT89S51单片机的P0.0/AD0-P0.7/AD7端口接数码管的a-h端,8位数码管的S1-S8通过74LS138译码器的Y0-Y7来控制选通每个数码管的位选端。AT89S51单片机的P1.0-P1.2控制74LS138的A,B,C端子。在8位数码管上从右向左循环显示“12345678”。能够比较平滑地看到拉幕的效果。

  2.电路原理图

  单片机

  图4.21.1

  3.系统板上硬件连线

  (1. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上;

  (2. 把“三八译码模块”区域中的Y0-Y7用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;

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

  4.程序设计方法

  (1. 动态数码显示技术;如何进行动态扫描,由于一次只能让一个数码管显示,因此,要显示8位的数据,必须经过让数码管一个一个轮流显示才可以,同时每个数码管显示的时间大约在1ms到4ms之间,所以为了保证正确显示,我必须每隔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;

  }

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分