圣源电子制作

 找回密码
 立即注册
查看: 7290|回复: 1
打印 上一主题 下一主题

用AT89S51单片机来制作的2位手动计数器

[复制链接]
跳转到指定楼层
楼主
发表于 2011-9-30 11:02:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
转载自互联网!!!
1. 实验任务        利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.7管脚接一个轻触开关,作为手动计数的按钮,用单片机的P2.0-P2.7接一个共阴数码管,作为00-99计数的个位数显示,用单片机的P0.0-P0.7接一个共阴数码管,作为00-99计数的十位数显示;硬件电路图如图19所示
       2. 电路原理图


  3. 系统板上硬件连线

  1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h

  2.把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a-h端口上;

  3.把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区域中的SP1端口上;

  4. 程序设计内容

  1.单片机对按键的识别的过程处理

  2.单片机对正确识别的按键进行计数,计数满时,又从零开始计数;

  3.单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示如何拆开十位和个位我们可以把所计得的数值对10求余,即可个位数字,对10整除,即可得到十位数字了

  4.通过查表方式,分别显示出个位和十位数字

  5. 程序框图
     

  1. 6. 汇编源程序


  2.   Count EQU 30H


  3.   SP1 BIT P3.7


  4.   ORG 0


  5.   START: MOV Count#00H


  6.   NEXT: MOV ACount


  7.   MOV B#10


  8.   DIV AB


  9.   MOV DPTR#TABLE


  10.   MOVC A@A+DPTR


  11.   MOV P0A


  12.   MOV AB


  13.   MOVC A@A+DPTR


  14.   MOV P2A


  15.   WT: JNB SP1WT


  16.   WAIT: JB SP1WAIT


  17.   LCALL DELY10MS


  18.   JB SP1WAIT


  19.   INC Count


  20.   MOV ACount


  21.   CJNE A#100NEXT


  22.   LJMP START


  23.   DELY10MS: MOV R6#20


  24.   D1: MOV R7#248


  25.   DJNZ R7$


  26.   DJNZ R6D1


  27.   RET


  28.   TABLE: DB 3FH06H5BH4FH66H6DH7DH07H7FH6FH


  29.   END
复制代码


  1. 7. C语言源程序


  2.   #include


  3.   unsigned char code table[]={0x3f0x060x5b0x4f0x66


  4.   0x6d0x7d0x070x7f0x6f};


  5.   unsigned char Count;

  6.   void delay10ms(void)


  7.   {


  8.   unsigned char ij;


  9.   for(i=20;i>0;i--)


  10.   for(j=248;j>0;j--);


  11.   }

  12.   void main(void)

  13.   {

  14.   Count=0;

  15.   P0=table[Count/10];


  16.   P2=table[Count%10];


  17.   while(1)


  18.   {


  19.   if(P3_7==0)


  20.   {


  21.   delay10ms();


  22.   if(P3_7==0)


  23.   {


  24.   Count++;


  25.   if(Count==100)


  26.   {


  27.   Count=0;


  28.   }


  29.   P0=table[Count/10];


  30.   P2=table[Count%10];


  31.   while(P3_7==0);


  32.   }


  33.   }


  34.   }

  35.   }
复制代码



回复

使用道具 举报

沙发
发表于 2011-9-30 13:19:07 | 只看该作者
此贴于20110930 12:24 被管理员编辑:

2位计数器改3位程序:

  1.     P0顯示百位數,P1顯示十位數,P2顯示個位數
  2.     #include

  3.       unsigned char code table[]={0x3f0x060x5b0x4f0x66
  4.       0x6d0x7d0x070x7f0x6f};
  5.       unsigned int Count;
  6.       void delay10ms(void)
  7.       {

  8.       unsigned char ij;

  9.       for(i=20;i>0;i--)

  10.       for(j=248;j>0;j--);

  11.       }
  12.       void main(void)

  13.       {
  14.       Count=0;
  15.       P0=table[Count/100];
  16.         P1=table[(Count%100)/10];
  17.       P2=table[Count%10];

  18.       while(1)

  19.       {

  20.       if(P3_7==0)

  21.       {
  22.       delay10ms();

  23.       if(P3_7==0)

  24.       {
  25.       Count++;

  26.       if(Count==1000)

  27.       {

  28.       Count=0;

  29.       }

  30.       P0=table[Count/100];
  31.         P1=table[(Count%100)/10];
  32.       P2=table[Count%10];

  33.       while(P3_7==0);

  34.       }

  35.       }

  36.       }

  37.       }
复制代码


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|联系我们|闽公网安备 35012102000020号|闽ICP备11020110号-1|圣源电子

GMT+8, 2024-10-18 19:28 , Processed in 0.044408 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表