- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于51系列单片机的频率计
中北大学
课 程 设 计 说 明 书
?
?
?
学生姓名: ?金博楠 学 号: ? 学 院: ?电子与计算机科学技术学院 专 业: ??微电子学 题 目: 基于51系列单片机的频率计
?
指导教师: 苏淑靖 职称: 副教授
?
?
?
?
2012 年 1 月 4 日
目录
1.课程设计目的………………………………………………………3
2. 课程设计内容要求……………………………………………1、………………………………………………………… 3
2.2、………………………………………………………… 3
3、?设计方案…………………………………………………………、设计思路…………………………………………………………2、工作原理及硬件图………………………………………………3.3、硬件电路图……………………………………………………4、……………………………………………………… 9
4、………………………………………………………10
5、参考文献……………………………………………………………、设计内容要求:1、2.2、
(2)电路原理图和印刷板图;
(3)仿真图形和仿真结果。
3、?设计方案、设计思路2、工作原理及硬件图图1 硬件框图
前级放大整形电路
考虑到被测信号通常为低压小信号,需要进行放大整形成单片机可以识别的0-5V的脉冲信号。放大部分运用三极管的共射电路将信号由mV电压变为V级电压,放大倍数A=βRc/[r+(1+β)Re]≈Rc/Re=15K/10=1500。整个系统均采用5V供电,放大电路在5V下发生饱和失真,截止失真,刚好使输出波形为近矩形波。为使脉冲波形更好,在接入单片机前再加一个施密特触发器,使脉冲边沿更加陡峭。
图3 波形从上到下依次为:被测波,放大后,施密特触发器整形后
单片机定时,计数
在每个机器周期的S5P2期间,CPU采样引脚的输入电平。若前一机器周期采样值为1,下一个机器周期采样值为0,则计数器增1,此后的机器周期S3P1期间,新的计数值装入计数器,所以检测一个1到0的跳变需要两个机器周期,外部脉冲频率不超过振荡频率的1/24。
本次单片机采用12MHz的石英晶振提供单片机的时钟信号,所以被测信号频率上限为500KHz,刚好满足题意。若要求测量更高频率的信号脉冲,则需要外加计数器分频后给单片机计数。
单片机初始化后启动两计数/定时器T1,T0。T1工作在定时模式,T0工作在计数模式。T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。计数器T0每测到一个下降沿计一个数,当定时器计满1s后中断,读取计数值N,则所测频率为N Hz。
程序如下:
#include reg51.H
#define uchar unsigned char
#define uint unsigned int
unsigned char code displaybit[]={0,1,2,3};//四位选择
unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x00}; //0,1,2,3,4,5,6,7,8,9,0.,无
unsigned char temp[4]; //显示速度分成显示字符的缓冲区
unsigned char dispcount; //显示位数的定位
unsigned char T0count; //to计数器的溢出次数
unsigned char timecount; //定时的次数
bit flag;
unsigned long x;
uint m;
void Delay(unsigned int i)
{
unsigned char x,j;
for(j=0;ji;j++);
for(x=0;x=148;x++);
}
void main(void)
{
TMOD=0x15; //设置定时器启动模式
TH0=0;
TL0=0;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
TR0=1; // 启动定时器
ET0=1;
ET1=1; //启动两个中断
EA=1; //开中断
while(1)
{
if(flag==1) //如果一次检测完成才赋值
{
flag=0;
x=T0count*65536+TH0*256+TL0;//显示初始化 0
if(x1000)//判断所测频率大于1000还是小于1000
{
m = x;
temp[3] =
文档评论(0)