文档详情

单片机课程设计报告数字频率计

ch****o
实名认证
店铺
DOC
197.52KB
约16页
文档ID:157675396
单片机课程设计报告数字频率计_第1页
1/16

学号:1109141008 2013 - 2014学年 第2学期 《单片机应用技术》课 程 设 计 报 告题 目: 数字变频计 专 业: 电气工程及其自动化 班 级: 11级电气工程及其自动化(1)班 姓 名: 程汪锁 指导教师: 臧大进 宋鸿儒 成 绩: 电气工程学院2014年4月20日课 程 设 计 任 务 书学生班级:11级电气工程及其自动化(1)班 学生姓名: 程汪锁 学号: 1109141008 设计名称: 数字频率计 起止日期: 2014.05.19—2014.05.25 指导教师: 宋洪儒 臧大进 设计任务书:1 用proteus设计数字频率计的硬件电路 2 编写软件程序实现数字频率计的功能 3 用proteus仿真软件实现硬件电路的仿4 频率的测量:当测量的频率为10 Hz — 30 MHz时,“晶体”键弹出,将随机所配的测试线插入下面的插座中,按动“档位”按钮到“2”档或“3”档,按动“闸门”按钮,当测试频率为800 MHz以上时,可选用本机上面的插座,按动“档位”键到“0”档,当频率小于800 MHz时,请选用“1”档,同时选用适当的闸门时间,频率越低,选用的闸门时间越长,反之越短。

由于低频率时是高阻抗,而测试的频率为低阻抗(如测试50Hz交流电源),此时会产生阻抗严重失配,可在低频的探头上串接一个1MΩ的电阻5、晶体的测量:将“晶体”键按下,“档位”按钮到“2”档或“3”档6、计数:在10 Hz — 30 MC插口,接入电脉冲,“档位”选至“4”,即可计数 摘要设计以ATMEL单片机为核心,利用单片机的计数器和定时器的功能对被测信号进行计数编写相应的程序可以使单片机自动调节测量的量程,并把测出的频率数据送到显示电路显示本设计的目的是通过在对单片机原理及应用的学习,以及查阅资料,培养自学与动手能力,把学到的知识应用到日常生活当中在设计的过程中,不断的补充不知道的内容、巩固所学,和队友的分工合作、相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合关键词:单片机;数字频率计;设计;目录第 1 节 数字频率计(低频)的硬件结构设计………51.1 系统硬件的构成…………………………………51.2单片机最小系统设计……………………………71. 频率产生电路设计………………………………81.5 数据显示电路设计(8279)……………………81.6 电源设计………………………………………10第 2节 软件设计……………………………………112.1 程序图…………………………………………112.2 数据采集程序设计…………………………….11.2.3 显示子程序设计……………………………… 132.4 C语言程序清单………………………………….14第 3 节 结束语……………………………………….19.参考文献……………………………………………….19 第 1 节 数字频率计(低频)的硬件结构设计1.1 系统硬件的构成1.2 单片机最小系统设计1.时钟电路单片机的时钟一般需要多相时钟,所以时钟电路由振荡器和分频器组成。

AT8951内部有一个用于构成振荡器的可控高增益反向放大器两个引脚XTAL1和XTAL2分别是该放大器的输入端和输出端在片外跨接一晶振和两个匹配电容C1、C2如图4.3所示,就构成一个自激振荡器振荡频率根据实际要求的工作速度,从几百千赫至24MHz可适当选取某一频率匹配电容C1、C2要根据石英晶体振荡器的要求选取当晶振频率为12MHz时,C1C2一般选30pF左右上述电路是靠AT89C51单片机内部电路产生振荡的也可以由外部振荡器或时钟直接驱动AT89C51本设计采用内部电路产生振荡 2.复位电路RST引脚是复位端,高电平有效该引脚输入至少连续两个机器周期以上的高电平,单片机复位RST引脚内部有一个ST触发器以对输入信号整形,保证内部复位电路的可靠,所以外部输入信号不一定要求是数字波形使用时,一般在此引脚与VSS引脚之间接一个8.2kΩ的下拉电阻,与VCC引脚之间接一个约10μF的电解电容,即可保证上电自动复位1.3频率产生电路设计频率发生电路是由CD2040芯片产生150HZ,300HZ,600HZ,153.6KHZ,2.4KHZ 的频率,比较稳定1.频率产生电路2.频率产生电路的驱动电路1.4数据显示电路设计(8279)1.8279部分数码管显示电路由4位八段共阴数码及8279芯片及74HS138芯片组成,共阴数码管在应用时将公共极COM接到地,当某一字段发光二极管的阴极为高电平时,相应字段就点亮。

当某一字段的阴极为低电平时,相应字段就不亮通过数码管显示,可以简单而准确的实现显示频率2.数码管1.5 电源的设计本电源电路是通过变压器,把外部接入的22V电源转变为5V电源,采用7805使电源稳定第 2 节 软件设计2.1 程序流程图根据设计项目所需功能,我们先进行初始化,在待机状态下,采集频率然后检测是否有按钮按下,若按钮按下,则数码管显示所采集的频率,再按下键0时则不显示系统实现所有功能,其程序框图如图所示 开始采集频率(1s内)频率转换十进制转换数码管显示YN按钮按下?2.2 数据采集子程序的设计1. 设置T1为定时器,T0为计数器 ,并设置变量x,用来装1s时间内的计数数值unsigned char i; init8279(); //8279初始化 while(1) { TMOD=0x15;//T1, 设为方式1定时模式,TO设为方式1计数模式 TH0=0;//T0的16位计数器高八位清0 TL0=0;//T0的16位计数器低八位清0 /*经过测试,初值设为19466最佳,65536-46070*/ TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算公式(65536-定时器初值)/晶振频率*12=0.05 TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080 TR1=1;//启动定时器1 TR0=1;//启动计数器0 ET0=1;//开计数器0中断 ET1=1;//开定时器1中断 EA=1;//开CPU中断 while(1) { if(k==1)//开关设置 { C8279=0xd1; } while(k==1); if(flag==1)// 1s时间到? { if(x==0)//如果没有脉冲,数码管显示全0 { C8279=0x80; //置显示位置 D8279=ledseg[0];//显示 C8279=0x81; //置显示位置 D8279=ledseg[0];//显示 C8279=0x82; //置显示位置 D8279=ledseg[0];//显示 C8279=0x83; //置显示位置 D8279=ledseg[0];//显示 C8279=0x84; //置显示位置 D8279=ledseg[0];//显示 C8279=0x85; //置显示位置 D8279=ledseg[0];//显示 C8279=0x86; //置显示位置 D8279=ledseg[0];//显示 C8279=0x87; //置显示位置 D8279=ledseg[0];//显示 } flag=0; x=T0count*65536+TH0*256+TL0; //计算频率值 2. 计数器0中断设置变量T0count,防止20ms内计数器溢出造成的错误。

void to(void) interrupt 1 using 0 // 定时器0中断处理函数 { T0count++; // 16位计数器满,频率计最高八位计数变量加1 }3. 定时器1中断void t1(void) interrupt 3 using 0 { /*经过测试,初值设为19466最佳,65536-46070*/ TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*12=0.05 TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080 timecount++; // 50ms时间到,1s计数器加1 if(timecount==20) { TR0=0;//时间到,停止计数 TR1=0;//T1停止计时 timecount=0; //1s计数器变量清0 flag=1;//1s定时时间到标志状态变量置1 } } 2.3 显示子程序的设计 1.先初始化8279void init8279() { C8279=10; //置8279工作方式,8个字符显示,右入口 C8279=0xd1; //清除 LED 显示 delay();2.4 C语言程序清单 /*数字频率计数器设计 designed by 李众*//*利用单片机的T0,T1计数定时器功能,来完成对输入信号进行频率计数,计数结果通过8位动态数码管显示出来,能对0到250KHZ的信号频率进行准确计数*//* 特点1,由开关控制启动,关闭 特点2,无脉冲信号时,显示为0 特点3,可以多次测量,自动刷新 1s一次*///-----头文件引用------#include#include//-----宏声明-----#define D8279 XBYTE[0xF238] //8279 数据口地址#define C8279 XBYTE[0xF239] //8279 状态/命令口地址#define uchar unsigned char#define uint unsigned int//-----变量定义-----uchar code ledseg[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71};//LED显示常数表 unsigned char T0count ;//频率计最高八位计数变量unsigned char timecount;// 1s定时器计数变量unsigned long x;bit flag;//标志位sbit k=P1^0;//启动开关定义1//-----延时子程序-----void delay() { uint k,j; for(k=0;k<100;k++) { for(j=0;j<500;j++); }}//----8279初始化子程序-----void init8279() { C8279=10; //置8279工作方式,8个字符显示,右入口 C8279=0xd1; //清除 LED 显示 delay();}//-----主程序-----void main(){ unsigned char i; init8279(); //8279初始化 while(1) { TMOD=0x15;//T1, 设为方式1定时模式,TO设为方式1计数模式 TH0=0;//T0的16位计数器高八位清0 TL0=0;//T0的16位计数器低八位清0 /*经过测试,初值设为19466最佳,65536-46070*/ TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算公式(65536-定时器初值)/晶振频率*12=0.05 TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080 TR1=1;//启动定时器1 TR0=1;//启动计数器0 ET0=1;//开计数器0中断 ET1=1;//开定时器1中断 EA=1;//开CPU中断 while(1) { if(k==1)//开关设置 { C8279=0xd1;//清屏 } while(k==1); if(flag==1)// 1s时间到? { if(x==0)//如果没有脉冲,数码管显示全0 { C8279=0x80; //置显示位置 D8279=ledseg[0];//显示 C8279=0x81; //置显示位置 D8279=ledseg[0];//显示 C8279=0x82; //置显示位置 D8279=ledseg[0];//显示 C8279=0x83; //置显示位置 D8279=ledseg[0];//显示 C8279=0x84; //置显示位置 D8279=ledseg[0];//显示 C8279=0x85; //置显示位置 D8279=ledseg[0];//显示 C8279=0x86; //置显示位置 D8279=ledseg[0];//显示 C8279=0x87; //置显示位置 D8279=ledseg[0];//显示 } flag=0; x=T0count*65536+TH0*256+TL0; //计算频率值 while(x/10) { i=x%10; C8279=0x80; //置显示位置 D8279=ledseg[i];//显示 x=x/10;// 第二个 i=x%10; C8279=0x81; //置显示位置 D8279=ledseg[i];//显示 x=x/10;//第三个 i=x%10; C8279=0x82; //置显示位置 D8279=ledseg[i];//显示 x=x/10;// 第四个 i=x%10; C8279=0x83; //置显示位置 D8279=ledseg[i];//显示 x=x/10;// 第五个 i=x%10; C8279=0x84; //置显示位置 D8279=ledseg[i];//显示 x=x/10;// 第六个 i=x%10; C8279=0x85; //置显示位置 D8279=ledseg[i];//显示 x=x/10;// 第七个 i=x%10; C8279=0x86; //置显示位置 D8279=ledseg[i];//显示 x=x/10;// 第八个 i=x%10; C8279=0x87; //置显示位置 D8279=ledseg[x];//显示 x=x/10; } timecount=0;//1s定时计数器变量清0 T0count=0;//频率计最高八位计数变量清0 TH0=0;// T0的16位计数器高八位清0 TL0=0;// T0的16位计数器低八位清0 /*经过测试,初值设为19466最佳,65536-46070*/ TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*12=0.05 TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080 TR0=1;//计数器0 TR1=1;//定时器1 } } } } void to(void) interrupt 1 using 0 // 定时器0中断处理函数 { T0count++; // 16位计数器满,频率计最高八位计数变量加1 } void t1(void) interrupt 3 using 0 { /*经过测试,初值设为19466最佳,65536-46070*/ TH1=(65536-46070)/256; //T1定时50ms处置的高八位送TH1,计算的时候公式(65536-定时器初值)/晶振频率*12=0.05 TL1=(65536-46070)%256;//T1定时50ms处置的底八位送TL1,得出定时器初值为19456,应该减去46080 timecount++; // 50ms时间到,1s计数器加1 if(timecount==20) { TR0=0;//时间到,停止计数 TR1=0;//T1停止计时 timecount=0; //1s计数器变量清0 flag=1;//1s定时时间到标志状态变量置1 } }第 3 节 结束语 这次为期两周的课程设计让我受益匪浅。

以前只是对单片机更多的只是一些感性的,理论上的认识,自己真正动手的时候,才真正理解到其中的精华所在 频率计的设计让我更好的了解如何应用单片机的定时器计数器模块,灵活应用IO口和应用8279的部分功能其中最重要的是分析问题解决问题的能力,在我看来,写程序并不难,重要的是把程序优化,无论是在节省硬件资源,还是提高数据的准确度来看,都需要下一些功夫把它做到最好参考文献:【1】 杨恢先 黄辉先 《单片机原理及应用》人民邮电出版社【2】 大能 南光群 刘金华 《单片机课程设计指导书》 北京理工大学【3】 谭浩强 《C语言程序设计第二版》 清华大学。

下载提示
相关文档
正为您匹配相似的精品文档