您的当前位置:首页正文

数字电路课程设计

2020-12-10 来源:爱站旅游
导读数字电路课程设计


计算机控制技术课程设计

题目:数字式秒表的设计

一、设计目的

(1)熟练掌握计算机控制系统的设计方法。 (2)设计并实现一个简易数字秒表。 二、设计说明

1)秒表由6位7段LED显示器显示,其中2位显示分钟,4位显示秒,其中分辨率为 0.01秒。

2)计时最大值为99分钟59.99秒。 3)计时误差不得超过0.01秒。

4)具有清零、启动计时、暂停计时及继续计时功能。 三、设计要求 (1)方案论证

按系统功能实现要求,决定控制系统的实现方案,选择芯片,作出系统框图。 (2)硬件电路设计。

按控制系统的实现方案,做出硬件原理图。 (3)系统程序设计。

对系统内存进行划分,采用模块化设计方法,作出初始化程序、主程序、显示子程序和模/数转换子程序。 (4)调试及仿真。

(5)用Keil+Proteus进行软件、硬件联合仿真和调试。 四、具体设计过程。 1、系统实现方案

本系统设计采用自顶向下的设计方案,系统的整体组装设计原理图框图如图4-1所示,它主要由控制模块、时基分频模块,计时模块和显示模块四部分组成。各模块分别完成计时过程的控制功能、计时功能与显示功能。

计时控制电路 数字秒表 计时电路 显示电路 控制状态机 时基分频电路 计数器 扫描电路 七段译码器 前2位显示分钟 图 4-1 系统组成框图

后4位显示秒 方案说明:利用一块芯片完成除时钟源,按键和显示器之外的所有数字电路功能。所有数字逻辑功能都在CPLD器件上用VHDL语言实现。这样设计具有体积小,设

1

计周期短,调试方便,故障率地和修改升级容易等特点,本设计采用自顶向下,混合输入方式(原理图输入——顶层文件链接和VHDL语言输入——各模块程序设计)实现数字秒表的设计,下载和调试。 系统的工作过程为:由频率信号输出端输出频率为100HZ的时钟信号,输入到微妙模块的时钟端clk,微妙模块为100进制的计数器,产生的进位信号co输入到下一级秒模块的时钟端,以此类推,直到分模块计数到59进60时,产生的进位信号不输出,计数清零。将微妙、秒、分产生的计数通过置数/位选再通过显示模块实时显示。

2、硬件原理图

图4-2为电子秒表的硬件原理图,按功能可分为5个单元电路进行分析。

1)基本RS触发器;2)单稳态触发器;3)时钟发生器; 4)计数器和分频器; 5)译码显示单元。

2

图4-2 硬件原理图

3、系统各模块设计。

(1)CMOS七段显示译码器74HC4511 1)七段显示译码器74HC4511框图

2)七段显示译码器74HC4511功能表

输入 | 输出 | 显示 L\\E\\ | B\\I\\ | L\\T\\ | D C B A | a b c d e f g | | L | H | H | L L L L | H H H H H H L | 0 | L | H | H | L L L H | L H H L L L L | 1 | L | H | H | L L H L | H H L H H L H | 2 | L | H | H | L L H H | H H H H L L H | 3 | L | H | H | L H L L | L H H L L H H | 4 | L | H | H | L H L H | H L H H L H H | 5 | L | H | H | L H H L | L L H H H H H | 6 | L | H | H | L H H H | H H H L L L L | 7 | L | H | H | H L L L | H H H H H H H | 8 | L | H | H | H L L H | H H H L L H H | 9 |

(2) 555定时器

3

a b c d e f g 74HC4511 LE BL LT D3 D2 D1 D0

555定时器是一种中规模集成电路,只要在外部配上适当阻容元件,就可以方便地构成脉冲产生和整形电路。 555集成定时器由五个部分组成:

1、 基本RS触发器:由两个“与非”门组成 2、 比较器:C1、C2是两个电压比较器

3、 分压器:阻值均为5千欧的电阻串联起来构成分压器,为比较器C1和C2提供参考电压。

4、 晶体管开卷和输出缓冲器:晶体管VT构成开关,其状态受Q端控制。输出缓冲器就是接在输出端的反相器G3,其作用是提高定时器的带负载能力和隔离负载对定时器的影响。 其逻辑框图如下:

逻辑符号如下:

(3)74L161管脚 1)管脚介绍

时钟CP和四个数据输入端P0~P3

清零/MR

使能CEP,CET 置数PE

数据输出端Q0~Q3

以及进位输出TC. (TC=Q0•Q1•Q2•Q3•CET)

4

74L161管脚图 2)74L161功能实现

当清零端CR=“0”,计数器输出Q3、Q2、Q1、Q0立即为全“0”,这个时候为异步复位功能。当CR=“1”且LD=“0”时,在CP信号上升沿作用后,74LS161输出端Q3、Q2、Q1、Q0的状态分别与并行数据输入端D3,D2,D1,D0的状态一样,为同步置数功能。而只有当CR=LD=EP=ET=“1”、CP脉冲上升沿作用后,计数器加1。74LS161还有一个进位输出端CO,其逻辑关系是CO= Q0•Q1•Q2•Q3•CET。合理应用计数器的清零功能和置数功能,一片74LS161可以组成16进制以下的任意进制分频器。 (4)数字显示单元:

本LED是发光二极管Light Emitting Diode的英文缩写,它采用低电压扫描驱动,具有:耗电少、使用寿命长、成本低、亮度高、故障少、视角大、可视距离远、规格品种全等特点。本部分由cc4511译码器和七段显示共阴极数码管构成。在其引脚当中A、B、C、D为BCD码输入端,a、b、c、d、e、f、g为译码输出端,输出“1”有效,用来驱动LED数码管。

4、程序模块设计 5、#include #include

//此程序实现计时秒表功能,时钟显示范围00.00~99.99秒,分辨度:0.01秒 unsigned char s0,s1,s2,s3; //定义0.01 秒、0.1 秒、1秒、10秒计时器 unsigned char s[4];

unsigned char k ,data ,sreg; unsigned int i;

const table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90}; //不带小数点的显示段码表

const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10}; //带小数点的显示段码表 //TMR0初始化子程序 void tmint() {

5

T0CS=0; //TMR0工作于定时器方式 PSA=1; //TMR0不用分频

T0IF=0; //清除TMR0的中断标志 T0IE=1; //TMR0中断允许 }

//spi显示初始化子程序 void SPIINIT() {

PIR1=0;

SSPCON=0x30; SSPSTAT=0xC0;

//设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送。与\"74HC4511,当其 //SCLK从低到高跳变时,串行输入寄存器\"的特点相对应

TRISC=0xD7; //SDO引脚为输出,SCK引脚为输出 TRISA5=0; //RA5引脚置为输出,输出显示锁存信号 }

//系统其它部分初始化子程序 void initial() {

TRISB1=0; TRISB2=0; TRISB4=1;

TRISB5=1; //设置与键盘有关的各口的输入输出方式 RB1=0;

RB2=0; //建立键盘扫描的初始条件 }

//SPI传输数据子程序 void SPILED(data) {

SSPBUF=data; //启动发送 do {

}while(SSPIF==0); SSPIF=0; }

//显示子程序,显示4位数 void dispaly() {

RA5=0; //准备锁存 for(k=4;k>0;k--) {

data=s[k-1];

if(k==3) data=table0[data];//第二位需要显示小数点 else data=table[data];

6

SPILED(data); //发送显示段码 }

for(k=0;k<4;k++) {

data=0xFF;

SPILED(data); //连续发送4个DARK,使显示好看一些 }

RA5=1; //最后给锁存信号,代表显示任务完成 }

//软件延时子程序

void DELAY() {

for(i = 3553; --i ;) continue; }

//键扫描子程序

void KEYSCAN() {

while(1){ while(1) {

dispaly(); //调用一次显示子程序 if ((RB5==0)||(RB4==0)) break; }

DELAY(); //若有键按下,则软件延时

if ((RB5==0)||(RB4==0)) break;//若还有键按下,则终止循环扫描,返回 } }

//等键松开子程序 void keyrelax() {

while(1){

dispaly(); //调用一次显示子程序 if ((RB5==1)&&(RB4==1)) break;

} //为防止按键过于灵敏,每次等键松开才返回 }

//系统赋值初始化子程序 void inizhi() {

s0=0x00; s[0]=s0; s1=0x00; s[1]=s1; s2=0x00; s[2]=s2;

7

s3=0x00;

s[3]=s3; //s0=s1=s2=s3=0,并放入显示缓冲数组中 sreg=0x00; //tmr0中断次数寄存器清0 }

//中断服务程序

void interrupt clkint(void) {

TMR0=0X13; //对TMR0写入一个调整值。因为写入TMR0后接着的

//两个周期不能增量,中断需要3个周期的响应时间, //以及C语言自动进行现场保护要消耗周期

T0IF=0; //清除中断标志 CLRWDT();

sreg=sreg+1; //中断计数器加1

if(sreg==40) //中断次数为40后,才对S0,S1,S2,S3 操作 {

sreg=0; s0=s0+1; if(s0==10){ s0=0 ; s1=s1+1; if(s1==10){ s1=0 ; s2=s2+1; if(s2==10){ s2=0; s3=s3+1;

if(s3==10) s3=0 ; } } } }

s[0]=s0; s[1]=s1; s[2]=s2; s[3]=s3; }

//主程序 main() {

OPTION=0XFF;

tmint(); //TMR0初始化 SPIINIT(); //spi显示初始化

initial(); //系统其它部分初始化 di(); //总中断禁止

8

while(1) {

inizhi(); //系统赋值初始化

KEYSCAN(); //键扫描,直到开始键按下 keyrelax(); //等键松开 ei(); //总中断允许

KEYSCAN(); //键扫描直到停止键按下,在键扫描时有显示 keyrelax() ; //等键松开 di(); //总中断禁止

KEYSCAN(); //键扫描到清0键按下,在键扫描时有显示 keyrelax() ; //等键松开 } }

5、调试及仿真

五、总结报告

实验开始时查阅了很多有关数字秒表有关的资料,也翻看了往年学哥学姐的课程设计,但是他们的设计要求和本次设计的要求有很大的出入,参照他们的设计过程,确定了本次设计所需的管脚与芯片,画出了硬件原理图,然后根据设计要求做出了系统框图。再设计系统程序作出了初始化程序、主程序、显示子程序和模/数转换子程序等,完成了系统程序设计,最后运用Keil和Proteus进行了调试及仿真, 在调试过程中,我发现我的显示器只显示

到79,之后的数字不在显示,于是我检查了74LS161的QD端,发现与它旁边的引脚连在了一起,解决这个问题后,我自己制作的数字式电子秒表终于完成了。 通过本次的课程设计让我明白了理论知识终和实践能力相差甚远,在实践面前一系列的问题会突发出现,但是没有扎实的理论知识,实践能力又无从存在,二者可谓缺一不可,所以在以后的学习工作中要同时培养自己的学习和动手能力。

9

因篇幅问题不能全部显示,请点此查看更多更全内容