单片机本科生专业课程设计1频率计数字时钟.docx
- 文档编号:4472316
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:304.84KB
单片机本科生专业课程设计1频率计数字时钟.docx
《单片机本科生专业课程设计1频率计数字时钟.docx》由会员分享,可在线阅读,更多相关《单片机本科生专业课程设计1频率计数字时钟.docx(15页珍藏版)》请在冰豆网上搜索。
单片机本科生专业课程设计1频率计数字时钟
本科生专业课程设计1
题目:
数字频率计,数字时钟
学院
专业
学号
姓名
成绩
年月日
一、实验目的
1、掌握单片机STC89C52RC的结构和编程方法;
2、了解单片机的串行口通信;
3、熟悉频率计算法原理;
4、知道烧录软件及操作方法;
5、熟悉动态输出显示原理、及编程方法。
二、实验要求
通过硬件设计、焊接、调试,软件编程、调试,程序固化,软硬件系统调试,最终制作一个数字频率计实物,并且能够通过数码管实时显示被测频率。
二、硬件电路设计
包括:
电路框图或原理图,简要说明工作原理
电路工作原理MCU
电路工作原理数码管驱动电路
电路工作原理显示电路
电路工作原理电源及功能指示电路
电路工作原理信号处理电路
电路工作原理串口通信电路
电路工作原理按键控制电路
实验原理:
频率计系统总体框图:
频率计原理
频率的测量实际上就是在1s时间内对信号进行计数,计数值就是信号频率。
用单片机设计频率计通常采用的办法是使用单片机自带的计数器对输入脉冲进行计数;好处是设计出的频率计系统结构和程序编写简单,成本低廉,不需要外部计数器,直接利用所给的单片机最小系统就可以实现。
缺陷是受限于单片机计数的晶振频率,输入的时钟频率通常是单片机晶振频率的几分之一甚至是几十分之一,在本次设计使用的STCAT89C52单片机,由于检测一个由“1”到“0”的跳变需要两个机器周期,前一个机器周期测出“1”,后一个周期测出“0”。
故输入时钟信号的最高频率不得超过单片机晶振频率的二十四分之一。
根据频率检测的原理,很容易想到利用51单片机的T0、T1两个定时/计数器,一个用来定时,另一个用来计数,两者均应该工作在中断方式,一个中断用于1s时间的中断处理,一个中断用于对频率脉冲的计数溢出处理。
三、程序设计
包括:
程序流程、实验程序及分析
/**********************************************************************
综合实习--频率计(测量频率和周期)的程序
**********************************************************************/
#pragmadboe
#include
#include
#include
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineulongunsignedlong
#defineCHANGSHU0.65536
#defineCHANGSHU11e-6
voiddisplay(void);
voidinitsiu(void);
voiddelay(void);
voidccll(void);
voidjsdat(void);
voidkeyin(void);
ucharinkey(void);
uchardisdat[6];
ucharcodetab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};
uintcount,count1;
ucharxsd,diszq,dzt;
floatjsjg;
intjs;
sbitjskz=P3^3;
sbitzsd=P1^0;
main()
{
uchari;
for(i=0;i<6;i++)
{
disdat[i]=0;//将显示缓存清零
}
initsiu();//初始化单片机
TR1=0;//关闭计数器1
dzt=0;
do
{
ccll();//进行测量频率合周期
for(i=0;i<50;i++)
{
keyin();//根据按键改变显示内容
display();//显示
}
if(dzt==0)
{
dzt=1;
zsd=0;
}
else
{
dzt=0;
zsd=1;
}
_nop_();
}
while
(1);
}
voiddisplay(void)//六位数码管显示程序,disdat[]是要显示的内容(是0~9的数字),xsd是在那一位显示小数点
{
uchari,disa,disb,disc;
disb=0x00;//显示第n位
for(i=0;i<6;i++)//共显示6个数据
{
disa=disdat[i];//显示数据
if(disa<10)
{
P2=disb;
disc=tab[disa];//显示段码
if((xsd!
=5)&&(xsd==i))
disc=disc|0x80;//增加小数点显示
P0=disc;//送显示
delay();//延时
P0=0x0;
disb++;//下一个要显示的位置
}
}
P2=0xff;
}
voidkeyin(void)//1号键显示频率,2号键显示周期
{
uchari;
i=inkey();//读入键值
if(i==0x70)//1号键
diszq=0;
elseif(i==0xb0)//2号键
diszq=1;
else
_nop_();
}
voiddelay(void)//延时程序
{
uchari;
for(i=0;i<201;i++)
_nop_();
}
voidjsdat(void)//将测量结果jsjg整理,送到disdat[]中,并将小数点加到适当的位置
{
ulongbb;
if(jsjg>1000000.0)//超过6位数,结果除10,小数点显示在第1位,表示Mhz(或千秒)
{
bb=jsjg/10;
xsd=1;
}
elseif((jsjg<1000000.0)&&(jsjg>100000.0))//6位数,小数点不显示
{
bb=jsjg*1;
xsd=5;
}
elseif((jsjg<100000.0)&&(jsjg>10000.0))//5位数,结果乘10,小数点在第5位
{
bb=jsjg*10;
xsd=4;
}
elseif((jsjg<10000.0)&&(jsjg>1000.0))//4位数,结果乘100,小数点在第4位
{
bb=jsjg*100;
xsd=3;
}
elseif((jsjg<1000.0)&&(jsjg>100.0))//3位数,结果乘1000,小数点在第3位
{
bb=jsjg*1000;
xsd=2;
}
elseif((jsjg<100.0)&&(jsjg>10.0))//2位数,结果乘10000,小数点在第2位
{
bb=jsjg*10000;
xsd=1;
}
else
{
bb=jsjg*100000;//1位数,结果乘100000,小数点在第1位
xsd=0;
}
disdat[0]=bb/100000;//将结果分解到disdat[]
bb=bb%100000;
disdat[1]=bb/10000;
bb=bb%10000;
disdat[2]=bb/1000;
bb=bb%1000;
disdat[3]=bb/100;
bb=bb%100;
disdat[4]=bb/10;
bb=bb%10;
disdat[5]=bb;
}
voidccll(void)//测量频率和方波程序
{
count1=0;//计数结果超过65536后的溢出次数
TR1=0;//关闭计数器1
js=-1;//外部中断次数,从EX1=1开始后的两个中断间的时间为周期
IE1=0;//清外部中断1的中断标志
TH1=0;//定时器1的计数值清零
TL1=0;
EX1=1;//开外部中断1
while(js!
=1)
_nop_();//当js=1时,测量结束
EX1=0;//关外部中断1
TR1=0;//关定时器1,停止计数
count=TH1*256+TL1;//定时器1的计数结果
jsjg=count1*0.065536;//计数溢出多少时间
jsjg=jsjg+count*1.0e-6;//周期
if(diszq==0)
jsjg=1.0/jsjg;//频率
else
jsjg=jsjg*1000;//周期单位为ms
jsdat();//调整显示结果
}
voidinitsiu(void)//初始化单片机
{
TMOD=0x15;//定时器1:
gate=0->TR1=1开始计数,C/T=0->对内部计数,模式1->16位计数
TR0=0;//关闭计数器0
TR1=0;//关闭计数器1
ET0=0;//关闭定时器0中断
ET1=1;//打开定时器1中断
IT1=1;//外部中断1下降沿触发
EX1=0;//开外部中断1
EA=1;//总中断允许
}
voidintex1(void)interrupt2using2
{
TR1=!
TR1;//第1次中断允许定时器1计数,第2次中断关闭定时器1计数
js=js+1;//第2次中断js=1,测量完。
}
voidinttime1(void)interrupt3using1
{
count1++;//定时器1溢出次数计数
}
/**********************************************************
键盘输入程序1:
0x702:
0xb03:
0xd0
4:
0xe0
**********************************************************/
ucharinkey(void)
{
ucharjjj,keydat;
P2=0xff;//P2准备读入
keydat=P2;//读入键值
keydat=keydat&0xf0;//找出四个键的值
if(keydat!
=0xf0)//有键输入
{
_nop_();
_nop_();
jjj=P2;//再读,去抖动
jjj=jjj&0xf0;
if(jjj!
=keydat)
keydat=0xf0;
do
{
jjj=P2;
jjj=jjj&0xf0;
}//等待键松手
while(jjj!
=0xf0);
}
return(keydat);
}
四、调试
包括:
故障现象及排除最终结果。
本次课程设计使用的单片机系统是根据老师提供的系统原件,自己焊接而成。
焊接完成以后,首先烧写控制LED发光二极管闪烁的程序后,发现发光二极管是根据自己的设计而闪烁,烧写程序控制发光数码管显示时,数码管同样是根据自己的设计而显示的字符,说明本次52单片机的硬件焊接取得成功。
5、总结
包括:
收获、体会、感想等。
我在这次课程设计中所做的课题是《频率计,数字时钟》经过了几天的努力,在老师的精心辅导下,还有同组人员的相互帮助,使得设计得已顺利完成。
随着时代的发展,数字电子技术已经普及到我们生活,工作,科研,各个领域,本文将介绍一种数控直流稳压电源,本电源由模拟电源、显示电路、控制电路、数模转换电路、放大电路四部分组成.准确说就是模拟电源提供各个芯片电源、数码管、放大器所需电压;显示电路用于显示电源输出电压的大小。
同时分析了数字技术和模拟技术相互转换的概念。
与传统的稳压电源相比具有操作方便,电源稳定性高以及其输出电压大小采用数码显示的特点。
同时,通过本次课程设计,巩固了我们学习过的专业知识,也使我们把理论与实践从真正意义上相结合了起来;考验了我们借助互联网络搜集、查阅相关文献资料,和组织材料的综合能力;也使我在口述和语言表达方面得到了锻炼。
从中可以自我测验,认识到自己哪方面有欠缺、不足,以便于在日后的学习中得以改进、提高。
此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,终于游逆而解。
经过本次设计使我对大学四年期间所学习到的知识得以进一步的实践,这将对我走出校园走上工作岗位奠定坚实的基础
在此,感谢于老师的细心指导,也同样谢谢其他各组同学的无私帮助!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 本科生 专业课程 设计 频率计 数字 时钟