实验六 同步计数器的设计实验报告

实验六    同步计数器的设计

学号:                           姓名:

一、实验目的和要求

1.熟悉JK触发器的逻辑功能。

2.掌握用JK触发器设计同步计数器。

二、实验仪器及器件

三、实验预习

1、复习时序逻辑电路设计方法。

⑴ 逻辑抽象,得出电路的状态转换图或状态转换表

① 分析给定的逻辑问题,确定输入变量、输出变量以及电路的状态数。通常都是取原因(或条件)作为输入逻辑变量,取结果作输出逻辑变量。

② 定义输入、输出逻辑状态和每个电路状态的含意,并将电路状态顺序编号。

③ 按照题意列出电路的状态转换表或画出电路的状态转换图。

通过以上步骤将给定的逻辑问题抽象成时序逻辑函数。

⑵ 状态化简

①  等价状态:在相同的输入下有相同的输出,并且转换到同一次态的两个状态。

②  合并等价状态,使电路的状态数最少。

⑶ 状态分配

① 确定触发器的数目n。因为n个触发器共有种状态组合,所以为获得时序电路所需的M个状态,必须取

 

② 给每个电路状态规定对应的触发器状态组合。

⑷ 选定触发器类型,求出电路的状态方程、驱动方程和输出方程

① 根据器件的供应情况与系统中触发器种类尽量少的原则谨慎选择使用的触发器类型。

② 根据状态转换图(或状态转换表)和选定的状态编码、触发器的类型,即可写出电路的状态方程、驱动方程和输出方程。

⑸ 根据得到的方程式画出逻辑图

⑹ 检查设计的电路能否自启动

①  电路开始工作时通过预置数将电路设置成有效状态的一种。

②  通过修改逻辑设计加以解决。

⑺ 设计步骤简图

图3  设计步骤简图

2、按实验内容设计逻辑电路画出逻辑图。

设计思路详情见第六部分。电路图如下:

四、实验原理

1.计数器的工作原理

递增计数器----每来一个CP,触发器的组成状态按二进制代码规律增加。

递减计数器-----按二进制代码规律减少。

双向计数器-----可增可减,由控制端来决定。

2.集成J-K触发器74LS73

⑴ 符号:

图1  J-K触发器符号

⑵ 功能:

表1  J-K触发器功能表

⑶ 状态转换图:

图2  J-K触发器状态转换图

⑷ 特性方程:

⑸ 注意事项:

① 在J-K触发器中,凡是要求接“1”的,一定要接高电平(例如5V),否则会出现错误的翻转。

③   触发器的两个输出负载不能过分悬殊,否则会出现误翻。

④   J-K触发器的清零输入端在工作时一定要接高电平或连接到实验箱的清零端子。

3.时序电路的设计步骤

内容见实验预习。

五、实验内容

1.用J-K触发器和门电路设计一个特殊的12进制计数器,其十进制的状态转换图为:

图4  12进制计数器状态转换图

六、实验设计及数据与处理

⑴ 设计

在12进制同步计数器中,输出的状态只由前一周期的状态决定,而与外来输入无关,因此目标电路为Moore型。而数字电路只有0和1两种状态,因此目标电路要表达12种状态需要用4个变量的16种组合中的12种。现定义十进制数01~12的对应二进制数为输出状态,可得目标电路的状态转换表如下:

表2  12进制同步计数器状态状态转换表

本实验选择J-K触发器,根据状态转换表以及J-K触发器特性方程:

得到目标电路方程如下:

输出方程:

驱动方程:Q0一个CP发生一次变化,因此

Q1每当Q0为1时,发生变化,因此

Q2Q1Q0都为1以及12(即1100的时候)发生变化,因此

J2 = K2 =Q1nQ0n+Q3nQ2n

Q3Q2 Q1Q0都为1的时候,以及12的时候发生变化,因此

J3=K3=Q0nQ1nQ2n+Q3nQ2n

状态方程:

(2)由以上三种方程可以画出逻辑图如下:

图5  12进制同步计数器设计

(3)各输出端波形图

1—4的输出

5—8的输出

9—12的输出

然后继续到第一幅图,如此循环。

CP与各输出端的波形图如下:

七、实验心得与体会

1、通过此次实验对于触发器的逻辑功能有了更深的了解,学会了用J—K触发器实现同步电路或者异步电路,并且可以用多种方法完成这次实验。除了上述方法,也可以采用四个触发器实现1——15计数的电路,并对其进行改进,使其在13(即1101的时候),Q3Q2进行清零。当然,达到相同目的的J和K也是不唯一的。

2、在使用触发器前,要对其进行检查。具体方法是将J、K以及清零端接高电平,C1接CP,将Q接led灯,若灯每次状态都发生改变,则证明触发器没有问题。在实验中若是出现了问题,要进行故障检查。有以下的检查方法

⑴ 查线法

由于在实验中大部分故障都是由于布线错误引起的,因此,在故障发生时,复查电路连线为排除故障的有效方法。应着重注意:有无漏线、错线,导线与插孔接触是否可靠,集成电路各脚是否与插座插牢、集成电路是否插反等。

⑵ 观察法

用万用表直接测量各集成块的Vcc端是否加上电源电压;输入信号、时钟脉冲等是否加到实验电路上,观察输出端有无反应。重复测试观察故障现象,然后对某一故障状态,用万用表测试各输入/输出端的直流电平,从而判断出故障是否由插座、集成块引脚连接线等原因造成的故障。

3、在此次实验中,最容易发生的错误就是弄混了Q与Q反向。在实验前一定要观察触发器的结构,使其与功能图相对应。作为端口输出的时候,也一定要检查,输出的是Q还是Q反。

 

第二篇:计算器设计实验报告

计算机程序设计实验报告

                  指导老师:张永安

                  组长:潘文帅

                              成员:常越 郭肖男 宋王庆


计算机程序设计实验报告

一、实验目的:

1、          通过实验了解计算器的程序代码。

2、          能看懂计算器的电路原理图。

3、          锻炼学生的动手实践能力。

二、   实验内容:

设计一个简易的计算器,完成0~9999整数的一次加减乘除运算,减法运算结果可以实现计算结果的负数显示,除法运算结果为0~999并保留两位小数。

三、   实验设备:

元件清单:


四、实验说明:

计算器电板图:

计算器引脚原理图:

程序代码如下:

/*************************************************

程序名称:  计算器设计

功能:      完成0~9999整数的一次加减乘除运算,

                     减法运算结果可以实现计算结果的负数显示,

                     除法运算结果为0~999并保留两位小数,

            按键音,

                     设有清零键,

                     首位零不显示,

                     其它的显示"E"

设计人:       sgl

创建时间:  2007。12。11

修改时间:  2007。12。14

**************************************************/

#include<AT89X51.H>

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

                                                                  0x6d,0x7d,0x07,0x7f,0x6f,

                                                                  0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

unsigned    char    code    XIANSHIXIAOSHUDIAN[]={0xbf,0x86,0xdb,0xcf,0xe6,

                                                  0xed,0xfd,0x87,0xff,0xef,

                                                                 0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};//带小数点//

unsigned  char code XIANSHIWRONG[]={0x00,0x00,0x00,0x00,0x79};//错误时的显示//

unsigned  char code    SAOMIAO[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴极扫描码表格//

unsigned  char DANYUAN[8]={0,0,0,0,0,0,0,0};

unsigned  long CUNZHI;

unsigned  long    SHU[2]={0,0};

unsigned  char k,key,m,n;

/*************************************************

SIGN         存运算符(+、-、*、/)

FLAG         用第几个数组,(出现非运算符前为0,出现运算符后为1)

WRONG      输入多于4个时错误标志位 (0对、1错)

COUNT        输入0~9数字的个数

SIZE         减数大于被减数时为1

SIGNCOUNT    输入运算符的个数

XIAOSHU      存一位小数的值

DIVKEY       运算除法时置为1

**************************************************/

unsigned  char    SIGN,FLAG,WRONG,COUNT,SIZE,SIGNCOUNT,XIAOSHU[2],DIVKEY;

/*************************************************

程序名称:显示程序

入口参数:无

功能:实现将CUNZHI中的值进行动态数码显示

局部变量:i,j,q

全局变量:CUNZHI,DANYUAN[0],DANYUAN[1],DANYUAN[2],DANYUAN[3]

所用端口功能:P1口送显示码

             P2口公共端扫描

返回值:无

**************************************************/

void disp(void)

{   unsigned char i,j,p,q;

/**************错误时的显示*************/     

   if(WRONG==1)

    { for(i=0;i<5;i++)

           {  P1=XIANSHIWRONG[i];

                 P2=SAOMIAO[i];

                  for(j=6;j>0;j--)             //动态显示延时程序//

                  for(q=248;q>0;q--);

              }

       }

   else

    {       if(DIVKEY==1)

              {  DANYUAN[0]=XIAOSHU[1];

                    DANYUAN[1]=XIAOSHU[0];

                    DANYUAN[2]=CUNZHI%10;

                DANYUAN[3]=CUNZHI/10%10;

                 DANYUAN[4]=CUNZHI/100%10;

                       DANYUAN[5]=CUNZHI/1000%10;

                      for(p=5;p>2;p--)

                         {   if(DANYUAN[p]==0)

                                   DANYUAN[p]=16;

                                 else  break;

                            }

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

                      {   if(i==2)          //倒数第三位为小数位//

                                {   P1=XIANSHIXIAOSHUDIAN[DANYUAN[i]];

                                   }

                                else

                                   {

                                   P1=XIANSHI[DANYUAN[i]];

                                   }

                                P2=SAOMIAO[i];

                                 for(j=6;j>0;j--)             //动态显示延时程序//

                                    for(q=248;q>0;q--);

                        }

                 }

             else

          { 

                    DANYUAN[0]=CUNZHI%10;

                DANYUAN[1]=CUNZHI/10%10;

                 DANYUAN[2]=CUNZHI/100%10;

                       DANYUAN[3]=CUNZHI/1000%10;

/*******************首位为零不显示*************/

                        for(p=3;p>0;p--)       //首位为零不显示//

                         {   if(DANYUAN[p]==0)

                                   DANYUAN[p]=16;

                                 else  break;

                            }

/**************为负数时的显示*****************/

                if(SIZE==1)            //为负数第五位数码管显示"-"//

                         {   DANYUAN[4]=17;

                            }

                            else               //第五位数码管不显示//

                            {   DANYUAN[4]=16;

                            }

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

                      {   P1=XIANSHI[DANYUAN[i]];

                             P2=SAOMIAO[i];

                             for(j=6;j>0;j--)             //动态显示延时程序//

                               for(q=248;q>0;q--);

                        }

               }

       }

}

/**************************************************

程序名称:处理程序

入口参数:key

功能:实现加减乘除运算

全局变量:key、CUNZHI、SHU[0]、SHU[1]、FLAG、SIGN

返回值:无

**************************************************/

void CHULI(key)

   unsigned char i,j;

/*****************声音“嘀”*****************/

     TR0=1;

     for(i=200;i>0;i--)        //延时100ms//

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

        TR0=0;

/*****************************************/ 

       if(key==15)                  //按键为清除键//

      {  CUNZHI=0;

         SHU[0]=0;

               SHU[1]=0;

               COUNT=0;

               WRONG=0;

               SIZE=0;

               SIGNCOUNT=0;

               XIAOSHU[0]=0;

               XIAOSHU[1]=0;

               DIVKEY=0;

         }                             

    else    if((key>=0)&&(key<=9))                            //按键为数字键//

              {     COUNT++;          //按下的数字键的次数//

/*****************加权运算*****************/  

                       SHU[FLAG]=SHU[FLAG]*10+key;                                       //加权运算//

                             CUNZHI=SHU[FLAG];

                   }

               else   if((key>=10)&&(key<=13))                  //按键为运算键//

                                 {    SIGNCOUNT++;

                                        SIGN=key;

                                      FLAG++;

                         COUNT=0;

                               }

                                 else   if(key==14)                         //按键为等于键//

                                    {      switch(SIGN)

                                         {   case 10:                                  

                                                   CUNZHI=SHU[0]+SHU[1];

                                                           break;

                                                case 11:

                                               {    if(SHU[0]>SHU[1])

                                                               {  CUNZHI=SHU[0]-SHU[1];

                                                                  }

                                                               else

                                                                  {  SIZE=1;

                                                                     CUNZHI=SHU[1]-SHU[0];

                                                                  }                                                 

                                                     }

                                                               break;

                                                        case 12:                                  

                                                   CUNZHI=SHU[0]*SHU[1];

                                                         break;

                                                        case 13:

                                                 DIVKEY=1;

                                                   CUNZHI=SHU[0]*100/SHU[1];

                                                               XIAOSHU[1]=CUNZHI%10;

                                                               XIAOSHU[0]=CUNZHI/10%10;

                                                               CUNZHI/=100;

                                                               if(CUNZHI>999)     

                                       {  WRONG=1;

                                       }

                                                         break;

                                             }

                                       } 

             if((COUNT==5)||(SIGNCOUNT>1)||(CUNZHI>9999))        //输入数字键大于5时将WRONG置1//

                  {  WRONG=1;

                  }

}       

/**************************************************

程序名称:键盘扫描

入口参数:无

功能:进行键盘扫描

全局变量:k

局部变量:i,j

调用函数:CHULI(key)

返回值:无

**************************************************/

void  JIANPAN(void)

{  unsigned char i,j;

        P3=0xff;

              P3_4=0;                                                   //扫描P3.4这条线上的四个按键//

              k=P3;

              k=k&0x0f;

              if(k!=0x0f)                                 //看P3.4这条线上是否真的有按键按下//

              {     for(i=20;i>0;i--)                          //延时一段时间//

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

                     k=P3;                                                //再判断一次//

                     k=k&0x0f;

                     if(k!=0x0f)

                     {     switch(k) //通过可能发生的四种可能比较看是哪个按键按下//

                            {     case 0x0e:

                                          key=0;

                                   break;

                                  case 0x0d:

                                          key=4;

                                   break;

                                 case 0x0b:

                                          key=8;

                                   break;

                                   case 0x07:

                                          key=12;

                                   break;

                            }    

                                   k=P3;

                                  k=k&0x0f;

                                   while(k!=0x0f)

                                   {     k=P3;

                                          k=k&0x0f;

                                   }

                            CHULI(key);

                           

                     }

               }

         P3=0xff;

         P3_5=0;                                                        //扫描P3.5这条线上的四个按键//

         k=P3;

         k=k&0x0f;

         if(k!=0x0f)                                             //看P3.5这条线上是否有按键按下//

             {    for(i=20;i>0;i--)                                 //延时等待//

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

                         k=P3;                                                 //再看一次//

                         k=k&0x0f;

                         if(k!=0x0f)

                          {     switch(k)        //通过比较看是P3.5这条线上的哪一个按键按下//

                                {       case 0x0e:

                                               key=1;

                                                        break;

                                                case 0x0d:

                                                        key=5;

                                                        break;

                                                 case 0x0b:

                                                        key=9;

                                                        break;

                                                 case 0x07:

                                                        key=13;

                                                        break;

                                          }

                                                 k=P3;

                                                 k=k&0x0f;

                                                 while(k!=0x0f)

                                                 {     k=P3;

                                                        k=k&0x0f;

                                                 }

                                                 CHULI(key);

                                       }

                      }                 

                            P3=0xff;                                    //扫描P3.6这条线上的四个按键是否按下//

                            P3_6=0;

                            k=P3;

                            k=k&0x0f;

                            if(k!=0x0f)

                                   {     for(i=20;i>0;i--)

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

                                                 k=P3;

                                                 k=k&0x0f;

                                                 if(k!=0x0f)

                                                        {     switch(k)

                                                                      {     case 0x0e:

                                                                                    key=2;

                                                                                    break;

                                                                            case 0x0d:

                                                                                    key=6;

                                                                                    break;

                                                                             case 0x0b:

                                                                                    key=10;

                                                                                    break;

                                                                             case 0x07:

                                                                                    key=14;

                                                                                    break;

                                                                      }

                                                                      k=P3;

                                                                      k=k&0x0f;

                                                                      while(k!=0x0f)

                                                                      {     k=P3;

                                                                             k=k&0x0f;

                                                                      }

                                                                      CHULI(key);

                                                

                                                        }

                                     }

                                   P3=0xff;                                    //扫描P3.7这条线上的四个按键是否按下//

                                   P3_7=0;

                                   k=P3;

                                   k=k&0x0f;

                                   if(k!=0x0f)

                                   {     for(i=20;i>0;i--)

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

                                                 k=P3;

                                                 k=k&0x0f;

                                                 if(k!=0x0f)

                                                        {     switch(k)

                                                                      {     case 0x0e:

                                                                                    key=3;

                                                                                    break;

                                                                             case 0x0d:

                                                                                    key=7;

                                                                                    break;

                                                                             case 0x0b:

                                                                                    key=11;

                                                                                    break;

                                                                             case 0x07:

                                                                                    key=15;

                                                                                    break;

                                                                      }

                                                                      k=P3;

                                                                      k=k&0x0f;

                                                                      while(k!=0x0f)

                                                                      {     k=P3;

                                                                             k=k&0x0f;

                                                                      }

                                                                      CHULI(key);

                                                              

                                                        }

                                   }

}

/**************************************************

程序名称:主程序

功能:实现计算器加减乘除运算并显示

全局变量:CUNZHI、FLAG、SIGN

调用函数:disp()、JIANPAN()

返回值:无 

***************************************************/

void  main(void)

{    TMOD=0X02;

        ET0=1;

        EA=1;

     TR0=0;

        TH0=(256-200)%256;

        TL0=(256-200)/256;

        CUNZHI=0;

        FLAG=0;

        SIGN=0;

        WRONG=0;

        SIZE=0;

        XIAOSHU[0]=0;

        while(1)

        {         disp();

                   JIANPAN();

     }   

}    

/**************************************************

定时中断

***************************************************/

void t0(void)  interrupt 1 using 1

{   P0_0=~P0_0;

}

五、实验结果:

首先按复位键,输入想要计算的数,进行四则运算(+ - * /)操作,在显示屏上会出现对应的结果。运算错误则出现报鸣声。

相关推荐