电子测量与仪器课程设计报告

        电子测量与仪器课程设计报告

    

               设计题目:简单的秒表计数器设计         

                   生:                      

    号:101103084                   

    系:物理与电气工程学院           

    级:10级自动化                  

指导教师:                      

    间:2013/12 /10                  

简单的秒表计数器设计

(安阳师范学院  物理与电气工程学院  河南  安阳  455000)

摘要:本系统采用振荡器、计数器、译码器、显示器组成。由LED七段数码管来显示译码器所输出 的信号。采用了74LS系列中小规模集成芯片。其中主体电路完成秒表的基本功能。

关键词:振荡器;计数器;译码器;LED七段数码管

1引言

在日常生活和工作中,我们常常用到定时控制,如扩印过程中的曝光定时等。早期常用的一些时间控制单元都使用模拟电路设计制作的,其定时准确性和重复精度都不是很理想,现在基本上都是基于数字技术的新一代产品,随着数字集成电路性能价格比的不断提高,新一代产品的应用也越来越广泛,大可构成复杂的工业过程控制系统,完成复杂的控制功能。小则可以用于家电控制,甚至可以用于儿童电子玩具。它功能强大,体积小,质量轻,灵活好用,配以适当的接口芯片,可以构造各种各样、功能各异的微电子产品。秒表计数器在生活中经常被用到,如:比赛记时,试验及记时等。

2设计任务与要求

2.1 基本要求

首先要能直接显示秒的计数器,要求六十、十为一计数周期。然后要求电路主要采用中规模集成电路。且电路输入电压为+5伏— +10伏。

2.2 方案选择

一个基本的秒表电路主要由译码显示器,“秒”,“毫秒”计数器和定时器组成。干电路系统由秒信号发生器“秒”、“毫秒”计数器、译码器及显示器电路组成。

首先构成一个NE555定时器和分频器产生震荡周期为一秒的标准“秒”脉冲信号,由74LS160采用清零法分别组成六十进制的“秒”计数器、十进制“毫秒”计数器。清零法适用于有异步置零输入端的集成计数器。原理是不管输出处于哪种状态,只要在清零输入端加一个有效电平电压,输出会立即从那个状态回到“0000”状态。清零信号消失后,计数器又可以从“0000”状态开始重新计数。使用NE555定时器的输出作为“秒”计数器的CP脉冲,把秒计数器的进位输出作为“分”计数器地CP脉冲,分计数器的进位输出作为“时”计数器的CP脉冲。使用74LS48为驱动器,共阴极七段数码管作为显示器。

3 设计任务分析

3.1设计要点

●设计一个标准秒脉冲信号发生电路

●设计60进制、十进制计数器(秒计数电路)

●设计译码显示电路

●设计操作方面的校时电路

3.2原理框图

图1.秒表计数器原理框图

4电路设计部分

4.1 秒脉冲信号发生器

秒脉冲信号发生器是数字电子钟的核心部分,它的精度和稳定度决定了数字钟的质量。由振荡器与分频器组合产生秒脉冲信号。

4.1.1振荡器设计

一般说来,振荡器的频率越高,计时精度越高。本设计中采用由集成定时器555与RC组成的多谐振荡器,经过调整输出1Hz脉冲。电路图如下图所示:

图2  555定时器振荡电路

4.1.2 振荡器参数确定

 555定时器的脉冲时间是由于RC充放电确定的。根据三要素公式:

                              (1)

    

 充电过程的方程式:

                    (2)

 充电时间为:

               (3)

 放电过程的方程式:

                       (4)

  放电时间为:

                         (5)

  总时间为:

                                          (6)

  频率为:

            (7)

首先确定C1=0.1uf,R2=4.1K?,需要输出频率f=10HZ,将充放电时间算出,确定电阻R1。通过确定R1=510K?。

4.2秒计时器电路设计

秒计数器为60进制计数器。实现这种模数的计数器采用中规模集成计数器74LS160D构成。

4.2.1秒、计数部分设计

采用60进制计数,本设计选74LS160D作为计数器,将一片74LS160D设计成10进制加法计数器,另一片设置6进制加法计数器。两片74LS160D按反馈清零法串接而成。秒计数器的十位和个位,输出脉冲除用作自身清零外,同时还作为分计数器的输入脉冲CP1。当分(秒)计数部分的个位接受秒计数部分的信号(秒计数接受的信号为振荡器经分频后输出的1HZ的标准脉冲),计数满60后向时计数部分的十位给出一个进位信号。秒十位计数部分接受个位的进位信号并进行计数,计满6就想前一级给出进位信号。当十位和个位计满60个数后计数器清零。计数规律是从00——59——00。设计电路图如图3。

  

图3  秒计数器

74LS48D是BCD-7段译码器/驱动器,输出高电平有效,专用于驱动LED七段共阳极显示数码管。若将秒、分、时计数器的每位输出分别送到相应七段译码管的输入端,便可以进行不同数字的显示。在译码管输出与数码管之间串联电阻R=510?作为限流电阻。如图4所示

图4   译码显示电路

5 元器件使用说明

5.1 振荡器

5.1.1 NE555的特点

 ●只需简单的电阻器、电容器,即可完成特定的振荡延时作用。其延时范围极广,可由几微秒至几小时之久。

 ●它的操作电源范围极大,可与TTL,CMOS等逻辑闸配合,也就是它的输出准位及输入触发准位,均能与这些逻辑系列的高、低态组合。

 ●其输出端的供给电流大,可直接推动多种自动控制的负载。

 ●它的计时精确度高、温度稳定度佳,且价格便宜。

5.1.2 NE555引脚位配置说明如右图 NE555接脚图

Pin 1 (接地) -地线(或共同接地) ,通常被连接到电路共同接地。

Pin 2 (触发点) -这个脚位是触发NE555使其启动它的时间周期。触发信号上缘电压须大于2/3 VCC,下缘须低于1/3 VCC 。

 Pin 3 (输出) -当时间周期开始555的输出输出脚位,移至比电源电压少1.7伏的高电位。周期的结束输出回到O伏左右的低电位。于高电位时的最大输出电流大约200 mA 。

Pin 4 (重置) -一个低逻辑电位送至这个脚位时会重置定时器和使输出回到一个低电位。它通常被接到正电源或忽略不用。

Pin 5 (控制) -这个接脚准许由外部电压改变触发和闸限电压。当计时器经营在稳定或振荡的运作方式下,这输入能用来改变或调整输出频率。

Pin 6 (重置锁定) - Pin 6重置锁定并使输出呈低态。当这个接脚的电压从1/3 VCC电压以下移至2/3 VCC以上时启动这个动作。

Pin 7 (放电) -这个接脚和主要的输出接脚有相同的电流输出能力,当输出为ON时为LOW,对地为低阻抗,当输出为OFF时为HIGH,对地为高阻抗。

Pin 8 (V +) -这是555个计时器IC的正电源电压端。供应电压的范围是+4.5伏特(最小值)至+16伏特(最大值)。

 参数功能特性:

 ?供应电压4.5-18V

 ?供应电?3-6 mA

 ?输出电?225mA (max)

 ?上升/下?时间100 ns

 NE555的相关应用:

NE555的作用范围很广,但一般多应用于单稳态多谐振荡器(Monostable Mutlivibrator)及无稳态多谐振荡器(Astable Multivibrator)。

5.2 计数器74LS160D

74LS160D计数器是一种中规模二一五-十进制计数器,下降沿触发,R0(1),R0(2)是清零端,R9(1),R9(2)是置9端,CPA和QA可组成一个二进制计数器,CPB和QBQCQD组成五进制计数器;若把QA和CPB相连,脉冲从CPA输入,则构成8421BCD码十进制计数器。由74LS160D的truth table可以看出,选择74LS160D可以在数字钟进位和清零上有极大的方便,不需要其他门电路辅助就能自己完成进位和清零。

表1  74LS160D计数/复位真

5.3 译码器74LS48

 74LS48芯片是一种常用的七段数码管译码器驱动器,下面是74LS48的引脚图和功能表。

图5 74LS48引脚图

                     

                         表2 74LS48功能表

6 电路仿真

随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。仿真软件有很多,multisim、protues等都可以电路仿真。本设计仿真过程是在multisim平台上完成的。课程设计、毕业设计是学生走向就业的重要实践环节。由于MULTISIM提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台。555定时器产生的秒脉冲如图7所示。

7 总结与说明

设计电路过程中,在multisim软件中出现了许多各种各样的错误,虽然最后经过不断的修改以及和同学的讨论得到了比较好的解决,但从中却让我弄明白了很多东西,很好的理解那句“失败乃成功之母”的含义。其中有一个问题弄的我是焦头烂额,就是连接好译码显示电路后LED却不能显示出数字,最后查出原来所选用的译码器型号不同连接方式也不同,74LS48D需要用共阴极接法。还有就是设计六十进制计数器和二十四进制计数器是各个计数器之间的连接、秒到分间的进位问题、分到时之间的进位连接方式等等问题。另外在焊接好后发现仿真与实际还是有一定出入的。例如在仿真过程中触发160时不需要经过一个非门,而实际芯片必须有低电平触发,在实际焊接过程需要加一个非门。

这次电子电路课程设计,也对电子电路设计的知识有了更深一步的了解,熟悉了更多不同的数字芯片,比如74LS00,74LS48,74LS160,数码管等,这为我以后的电路设计打了一定的基础。在连接六进制,十进制,六十进制的进位及二十四进制的接法中,要求熟悉逻辑电路及其芯片各引脚的功能,那么在电路出错时便能准确地找出错误所在并及时纠正了。在这次的设计中,我考虑了许多不同的方案,做出过不同的选择,从理论上细致的比较各个方案的好坏,同时又充分的考虑实际情况,以实际情况为主要,在此过程中学会了把理论和实际充分结合起来的思维方式。在设计的过程中我采用了MULTISIM仿真软件和PROTEL等软件,通过这次的课程设计使我对这个仿真软件的使用更加的熟练。

               

参考文献:

[1] 毛期俭. 数字电路与逻辑设计实验及应用. 北京: 人民邮电出版社,2005

[2] 吕思忠,施齐云. 数字电路实验与课程设计. 哈尔滨: 哈尔滨工程大学出版社,2003

[3] 邓勇,周铎,邓斌. 数字电路设计完全手册. 北京: 国防科技大学出版社,2004.6

[4] 赵淑范. 数字电子钟的设计. 长春大学学报,2004.8,14,4:26-40

[5] 梁明理,邓仁清. 电子线路. 北京: 高等教育出版社,第四版,1999.6

[6] 于勤科,赵志杰,岳应娟. Protel电子设计实用指南. 西安: 西安电子科技大学出版社,1990.1

[7] 梁廷贵,王裕深. 计数器 分频器 锁存器 驱动器分册. 北京: 科学技术文献出版社,2002.2

[8] 常华,袁刚. 仿真软件教程—Multisim和MATLAB. 北京: 清华大学出版社,2006

[9] 阎石. 数字电子技术基础. 北京:高等教育出版社, 1998.12

[10] 集成电路手册分编委会编. 中外集成电路简明速查手册,TTL、COMS电路. 北京: 电子工业出版社,1997

 

第二篇:C课程设计报告

报告内容

一、程序功能 二、课题分析

三、设计中的问题与解决方法 四、感想和心得

五、源程序代码(含注释)

六、典型测试数据组(含输入数据和输出结果)

#include<stdlib.h> #include<ctype.h> #include<string.h> #include<conio.h>

struct student /*定义结构体*/ { };

int menu_select(); /*菜单*/ struct student *Creat();

void Display(struct student *head);

struct student *Insert(struct student *head,struct student *p); struct student *Delete(struct student *head,char a[20]); struct student *Query(struct student *head,char a[20]); struct student *Addfromtext(struct student *head); void writetotext(struct student *head);

struct student *Reserverse(struct student *head); struct student *Deletesame(struct student *head); void quit(struct student *head);

void main() {

struct student *head=NULL,*p; char a[20],m;

for(;;)

switch(menu_select()) char name[20]; /*姓名*/ char sex[10]; /*性别*/ char telnumber[15]; /*电话号码*/ char email[80]; /*电子邮箱*/

struct student *next; /*指向下一节点的指针*/

(一)程序功能

1. 2. 3. 4. 5. 6. 7. 8. 9.

创建电话薄

分屏显示电话薄中的所有记录 先电话薄中插入一条记录 删除一条已经存在的记录项

根据用户输入的属性查找符合条件的记录项

可以从文件读入已有电话薄,也可以将通讯录信息输出到文件 把目前的记录存入一个正文文本 逆序存放

删除姓名、电话、电子邮件均相同的记录

(二)课题分析

本课程设计的数据有每个人的姓名,电话号码和Email地址等信息,并且所有人的数据以姓名为关键字英文字母按升序排放,存在前后关系,考虑到要增加或删除记录用链表较为方便。

(三)设计中遇到的问题及解决办法

不少函数都存在多种情况要分类讨论,解决办法:一遍遍的修改

(四)感想和心得

编一个有用的程序是非常麻烦的,但是完成后非常有成就感。课设的题目可以更多一点更加贴近生活这样学编程才有意义。

(五)源程序代码(含注释)

#include<stdio.h>

{

case 1:

{

printf("创建新记录\n"); system("pause"); break; }

printf("显示所有记录\n"); system("pause"); break;

break;

printf("查找记录\n"); scanf("%s",&a); p=Query(head,a); if(p!=NULL)

case 5:

printf("输入要查找的姓名\n");

head=Creat();

printf("%s\t%s\t%s\t%s\n",p->name,p->sex,p->telnumber,p->email);

else

printf("未找到该记录\n");

case 2:

Display(head);

system("pause");

break;

printf("从文件读入记录\n"); if(head)

case 3:

p=(struct student *)malloc(sizeof(struct student));

printf("插入新记录\n");

printf("输入姓名、性别、电话、邮箱地址\n");

scanf("%s%s%s%s",p->name,p->sex,p->telnumber,p->email); head=Insert(head,p); printf("插入新记录成功!\n");

case 4:

printf("删除已有记录\n");

printf("输入要删除记录的姓名\n"); scanf("%s",&a);

printf("确定要删除该记录?\nY\tN\n"); scanf("%s",&m);

system("pause"); break;

case 6:

head=Addfromtext(head);

printf("文件已载入!\n");

system("pause");

break;

printf("将记录写入文件\n"); system("pause"); break;

printf("将记录逆序存放\n"); system("pause"); break;

printf("删除同名记录\n");

case 7:

writetotext(head);

case 8:

head=Reserverse(head);

if(m=='Y'||m=='y') head=Delete(head,a);

system("pause");

case 9:

head=Deletesame(head);

system("pause"); break;

{

struct student *p,*head=NULL;

char a='Y'; /*确认新建联系人用的变量*/

case 0:

printf("EXIT!\n");

head=NULL;

while(a=='Y'||a=='y')

{

printf("输入姓名、性别、电话、邮箱地址\n");

system("pause"); quit(head); }

int menu_select() {

char c; /*选择执行那个功能的变量*/ {

system("cls");

printf("1.创建新记录\n");

do

exit(0);

}

p=(struct student *)malloc(sizeof(struct student)); scanf("%s%s%s%s",p->name,p->sex,p->telnumber,p->email); }

void Display(struct student *head) /*功能:显示结点记录*/ {

struct student *p; /*遍历链表用的指针*/ ;

}

system("pause");

p=p->next;

if(p==NULL)break;

int i; /*计数器*/ p=head;

while(p!=NULL) {

for(i=1;i<=10;i++) /*一页显示10个*/ {

printf("%s\t%s\t%s\t%s\n",p->name,p->sex,p->telnumber,p->email)return(head); /*返回链表首指针*/ head=Insert(head,p); printf("创建新记录成功!");

printf("继续创建新联系人?\nY\tN\n"); scanf("%s",&a); }

printf("2.显示所有记录\n"); printf("3.插入一条记录\n"); printf("4.删除一条记录\n"); printf("5.查找一条记录\n"); printf("6.从文件读入记录\n"); printf("7.将通讯录输出到文件\n"); printf("8.逆序存放记录\n"); printf("9.删除同名记录\n"); printf("0.EXIT\n"); }

struct student *Creat() /*功能:建立有序链表*/

}

while(c<'0'||c>'9'); return(c-'0');

c=getchar();

system("cls"); }

struct student *Insert(struct student *head,struct student *p) /*功}

printf("显示完毕\n");

}

struct student *Delete(struct student *head,char a[20]) /*功能:删除一条记录*/ {

能:插入一条记录*/ {

struct student *p1,*p2; /*定义插入结点用的指针*/ if(head==NULL) /*遍历链表寻找插入点*/ { /*空链表时*/ head=p; p->next=NULL; return(head); }

else{ /*非空链表*/ p2=p1=head;

while(strcmp((p->name),(p1->name))>0&&p1->next!=NULL) { p2=p1;p1=p1->next; } if(strcmp((p->name),(p1->name))<=0)

{ p->next=p1;

if(head==p1) head=p; else p2->next=p; } else { p1->next=p; p->next=NULL; }

return(head);} /*返回链表首指针*/

struct student *p1,*p2; /*定义删除结点时用的指针*/ if(head==NULL) /*遍历链表寻找要删除的结点*//*空链表*/ { printf("无记录\n"); return(head);

}

p1=head;

while(strcmp(p1->name,a)!=0&&p1->next!=NULL)/*非空链表*/ { p2=p1; p1=p1->next; }

if(strcmp(p1->name,a)==0) { if(p1==head) head=p1->next; else

p2->next=p1->next; printf("删除成功!\n"); free(p1); } else

printf("未找到该记录\n");

return(head); /*返回链表首指针*/

}

struct student *Query(struct student *head,char a[20]) /*功能:查找结点记录*/ {

}

struct student *p; /*定义遍历链表查找结点用的指针*/ p=head;

while(p!=NULL) {

p=p->next; }

return NULL; /*返回空指针*/

}

} { {

return(head); /*返回链表首指针*/

else

p=head;

if(strcmp(p->name,a)==0) return p;

while(p!=NULL)

p1=p->next; p2=p;

while(p1!=NULL)

if(strcmp(p1->name,p->name)==0) { if(p1->next!=NULL) } {

p2->next=p1; p2=p1; p1=p1->next; }

p2->next=p1->next; printf("删除成功!\n"); break;

else p2->next=NULL;

struct student *Reserverse(struct student *head) /*功能:逆序存放*/ { }

struct student *Deletesame(struct student *head) /*功能:删除同名结点*/ {

struct student *p1,*p2,*p; /*定义用来寻找内容相同的结点的指针*/

if(head==NULL) {

printf("记录为空\n");

struct student *newhead=NULL,*p; /*定义新的首指针以及逆if(head==NULL) { }

printf("逆序存放成功!\n");

return newhead; /*返回首的头指针*/

p=head;

head=head->next; p->next=newhead; newhead=p;

printf("记录为空\n"); while(head) 置链表所用指针*/

{

else

}

p=p->next; } }

return(head); /*返回链表首指针*/

void quit(struct student *head) /*功能:退出并释放内存*/ { }

struct student *Addfromtext(struct student *head) /*功能:载入文件*/ {

FILE *fp; /*定义指向文件的指针*/ struct student *p; /*遍历链表用指针*/ if((fp=fopen("data.txt","r"))==NULL) /*只读方式打开文件*/ {

printf("\nSorry,the file doesn't exist\n"); exit(1); }

while(!feof(fp))

{p=(struct student *)malloc(sizeof(struct student));

fscanf(fp,"%s%s%s%s",p->name,p->sex,p->telnumber,p->email); head=Insert(head,p); }

return(head); /*返回头指针*/ fclose(fp); /*关闭文件*/ }

void writetotext(struct student *head) /*功能:改写文件*/ {

FILE *fp; /*定义指向文件的指针*/ struct student *p; /*定义遍历链表的指针*/ while(head!=NULL) { }

p=head;

head=head->next; free(p);

struct student *p; /*遍历链表用指针*/ { }

printf("无法打开文件\n"); exit(0);

if((fp=fopen("result.txt","w"))==NULL) /*只写方式打开文件*/

p=head;

while(p!=NULL) {

fprintf(fp,"%s\t%s\t%s\t%s\n",p->name,p->sex,p->telnumber,p->email);

p=p->next; }

fclose(fp); /*关闭文件*/ }

(六)函数关系调用图

C课程设计报告

注:F为Function缩写

(七)测试流程

运行程序

输入:1 enter

输入姓名、性别、电话、电子邮箱

例如:小明 男 12345678901 flkgvnslk@qq.com enter N enter 输入:2 enter

显示记录

Enter

输入:6 enter

输入:2 enter

显示电话簿中的记录

输入:3 enter

输入:小明 男 12345678901 flkgvnslk@qq.com enter N enter 输入:2 enter

查看插入新纪录后的电话簿

输入:5 enter

输入:小明 enter

查找小明的联系方式

输入:7 enter

可在data.txt中查看修改后的电话簿

输入:4 enter

输入:小明 enter

输入:Y enter

输入:2 enter

查看删除记录后的电话薄

输入:8 enter

输入:2 enter

查看逆序存放后的通讯录

输入:3 enter

输入:小明 男 12345678901 flkgvnslk@qq.com enter 输入:3 enter 输入:小明 男 12345678901 flkgvnslk@qq.com enter 输入:2 enter 查看重复的记录 输入:9 enter 输入:2 enter 确认已消除重复记录 输入:0 enter 退出 第 7 页 共 7 页

相关推荐