基于单片机的计数器设计资料.docx

上传人:b****2 文档编号:2096271 上传时间:2022-10-26 格式:DOCX 页数:15 大小:1.34MB
下载 相关 举报
基于单片机的计数器设计资料.docx_第1页
第1页 / 共15页
基于单片机的计数器设计资料.docx_第2页
第2页 / 共15页
基于单片机的计数器设计资料.docx_第3页
第3页 / 共15页
基于单片机的计数器设计资料.docx_第4页
第4页 / 共15页
基于单片机的计数器设计资料.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于单片机的计数器设计资料.docx

《基于单片机的计数器设计资料.docx》由会员分享,可在线阅读,更多相关《基于单片机的计数器设计资料.docx(15页珍藏版)》请在冰豆网上搜索。

基于单片机的计数器设计资料.docx

基于单片机的计数器设计资料

 

基于单片机的计数器设计

 

学校:

实习单位:

姓名:

摘要

计数器是通过对脉冲进行计数得到脉冲通过的个数,经过移位寄存器将得到的数值通过数码管显现,从而实现计数器的功能。

本次设计共分:

计数器、移位寄存器和显示器三部分,以单片机AT89s52为核心,用74LS164移位寄存器,4连排8段共阳极数码管来显示相应数字。

 

关键字:

计数器,移位寄存器,数码管

1.方案论证

1.1电路设计分析

经分析,此次设计可用软硬件结合,通过软件控制、硬件实现的方式实现。

1.2整体方案论证

整个课程设计要求我们设计三个部分:

计数器、BCD译码器、七段数码管,系统原理方框图如图1所示。

根据设计任务指出的要求,我们照旧设计出相应的3个基本原理图:

①计数部分原理图;

②译码部分原理图;

③显示部分电路图

计数器

移位寄存器

显示器

控制键

整个系统通过计算脉冲进入的个数,在计数器电路中进行计数,将得出的信息通过软件设计使所得的二进制数据转变为一个十进制的数字并传递给下一级电路移位寄存器,并驱动显示部分电路工作,即对七段数码管接通相应的管脚电流。

1.3设计步骤

①根据原理图焊接电路板;

②检测电路板焊接是否规范、电路能否导通、能否写进程序;

③软件编程设计,实现十进制计数;

④软件编译、调试、运行;

⑤观察分析结果,保存数据

2.硬件电路设计

2.1系统搭建

①单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。

②对51系列单片机来说,最小系统一般应该包括:

单片机、晶振电路、复位电路。

③单片机AT89s52原理图及各元件接法:

2.2计数器设计

2.2.1原理

89C51单片机有2个16位的定时/计数器,即定时器0(T0)和定时器1(T1)。

T0由2个特殊功能寄存器TH0和TL0构成,T1则由TH1和TL1构成。

这些功能都由特殊功能寄存器TMOD和TCON所控制。

当设置为定时工作方式时,定时器计数89C51片内振荡器输出经12分频后的脉冲,即每个机器周期使定时器(T0或T1)的数值加1直至计满溢出。

当89C51采用12MHz晶振时,一个机器周期为1μs,计数频率为1MHz。

当设置为计数工作方式时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数,当输入脉冲信号从1到0的下降沿时,定时器的值加1。

在每个机器周期的S5P2期间采样T0和T1引脚的输入电平,若前一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。

此后的机器周期S3P1期间,新的数值装入计数器。

所以,检测一个1至0的跳变需要二个机器周期,故最高计数频率为振荡频率的1/24。

对输入信号的占空比无特殊要求,但为了确保某个电平在变化之前至少被采样一次,要求电平保持时间至少是一个完整的机器周期,对输入脉冲的基本要求如下图所示,Tcy为机器周期。

>Tcy

>Tcy

对输入脉冲宽度的要求

2.3移位寄存器

2.3.1移位寄存器作用

 移位寄存器中的数据可以在移位脉冲作用下一次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,串行输入、并行输出,十分灵活,用途非常广泛。

2.3.274LS164

74LS164为8位移位寄存器,其主要电特性:

当清除端(CLEAR)为低电平时,输出端(QA-QH)均为低电平。

串行数据输入端(A,B)可控制数据。

当A、B任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下Q0为低电平。

当A、B有一个为高电平,则另一个就允许输入数据,并在CLOCK上升沿作用下决定Q0的状态。

引脚功能:

CLOCK:

时钟输入端

CLEAR:

同步清除输入端(低电平有效)

A,B:

串行数据输入端

QA-QH:

输出端

74LS164封装图

74LS164内部逻辑图

极限值

电源电压7V

输入电压………5.5V

工作环境温度

54164…………-55~125℃

74164…………-0~70℃

储存温度…… -65℃~150℃

真值表

H-高电平L-低电平X-任意电平

↑-低到高电平跳变

QA0,QB0,QH0-规定的稳态条件建立前的电平

QAn,QGn-时钟最近的↑前的电平 

时序图

2.4显示器设计

显示器工作原理:

数码管一种是半导体发光器件,其基本单元是发光二极管,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字,能够显示时间、日期、温度等所有可用数字表示的参数的器件。

七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。

LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表

数字对应数码管显示控制转换字节(共阴编码)

显示--HGFE,DCBA--编码

0--0011,1111--0x3F;

1--0000,0110--0x06;

2--0101,1011--0x5B;

3--0100,1111--0x4F;

4--0110,0110--0x66;

5--0110,1101--0x6D;

6--0111,1101--0x7D;

7--0000,0111--0x07;

8--0111,1111--0x7F;

9--0110,1111--0x6F;   

七段数码管驱动方式:

直流驱动,即每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。

优点是编程简单,显示亮度高,缺点是占用I/O端口多。

数码管结构:

数码管正面图

4连排8段数码管

2.5完整电路图

3.软件设计

#include

#defineuintunsignedint

#defineucharunsignedchar

//串行数据

sbitled1=P1^1;

sbitCLK=P2^0;

sbitAB=P2^1;

sbitc1=P2^2;

sbitc2=P2^3;

sbitc3=P2^4;

sbitc4=P2^5;

sbitfmq=P3^7;

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0--9

unsignedintnum,i,stt,g,s,h,m,i_g,i_s;i_h;i_m;

uchartime_s;

bitCrol;

voiddelay(unsignedintt)

{

unsignedintj;

for(;t>0;t--)

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

}

//实现一个字节的传送

voidByte(unsignedintt)

{

unsignedinti;

unsignedcharData;

Data=table[t];

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

{

CLK=0;//上升沿有效

AB=Data&0x01;//取最高位,移位寄存器,向右移动Q0,最先输出最低位

Data=Data>>1;

CLK=1;

}

}

main()

{

TMOD=0x59;

TH0=(65536-50000)/256;//高8位初始化

TL0=(65536-50000)%256;//低8位初始化

EA=1;//总中断允许

ET0=1;//定时器0允许

ET1=1;//定时器1允许

EX0=1;//外部中断允许

IT0=1;//边沿触发有效

TR0=1;//定时器0启动

TR1=1;//定时器1启动

while

(1)

{

if(i==9999)

i=0;

if(Crol)//判断是否翻转

{

i=time_s;//执行计数器

}

else

{

i=TL1;

}

i_s=i%10;

i_g=i/10%10;

i_h=i/100%10;

i_m=i/1000;

c1=0;c2=1;c3=1;c4=1;

Byte(i_s);delay

(1);

c1=1;c2=0;c3=1;c4=1;

Byte(i_g);delay

(1);

c1=1;c2=1;c3=0;c4=1;

Byte(i_h);delay

(1);

c1=1;c2=1;c3=1;c4=0;

Byte(i_m);delay

(1);

}

}

voidzd1(void)interrupt0//IT0中断

{

Crol=~Crol;//定时器翻转

}

voidT0_Timer()interrupt1//定时器中断

{

num++;

if(num==20)

{num=0;time_s++;}

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

4.项目测试

图表1实物图

图表2效果图

5.小结

这次实习设计使我懂得了理论知识和实践相结合的重要,光有理论知识是远远不够的,只有把理论知识和实践结合起来,用理论指导实践,用实践求证理论,才能真正做到学以致用、提升能力,为社会服务。

实际动手能力和独立思考不仅能够快速提高自己的知识水平还能极大促进学习的兴趣,看到自己亲手设计的作品真是一件令人愉悦的事。

在设计过程中遇到好多问题,同时发现了自己很多不足之处,对之前所学的理论知识掌握的不牢固或不完整。

通过这次设计弥补了我之前的不足,更找到了改变的方法,对我自身提高和发展有非常大的帮助!

最后,衷心感谢所有辛苦指导我们的老师!

感谢几位组员和所有帮助我的同学!

附录

程序代码:

#include

#defineuintunsignedint

#defineucharunsignedchar

//串行数据

sbitled1=P1^1;

sbitCLK=P2^0;

sbitAB=P2^1;

sbitc1=P2^2;

sbitc2=P2^3;

sbitc3=P2^4;

sbitc4=P2^5;

sbitfmq=P3^7;

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0--9

unsignedintnum,i,stt,g,s,h,m,i_g,i_s;i_h;i_m;

uchartime_s;

bitCrol;

voiddelay(unsignedintt)

{

unsignedintj;

for(;t>0;t--)

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

}

//实现一个字节的传送

voidByte(unsignedintt)

{

unsignedinti;

u

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1