计算机控制技术课程设计
题目:数字式秒表的设计
一、设计目的
(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 //此程序实现计时秒表功能,时钟显示范围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 因篇幅问题不能全部显示,请点此查看更多更全内容