基于STC8单片机的频率计
基于STC8的频率计
测频原理:计数法测频率。
实现方法:利用51单片机定时器可作为外部脉冲计数器的特点,可实现频率计数。具体使用两个定时器,本例中,使用定时器0作为外部脉冲计数器,用于对外部脉进行捕获(下降沿触发),定时器3产生1s定时,用于提取计数频率。
代码如下
//系统时钟频率 24MHz
#include "STC8.H"bit send_flag = 0;
unsigned int freq = 0; //频率计数
unsigned long cont_freq = 0; //频率计数溢出
unsigned char res[6]; //频率转换结果void TM0_Init();
void TM3_Init();
void UartSend(unsigned char dat);
void UartInit(void);
void UartSendStr(unsigned char *p);
void Num_Cut(unsigned long num);
void Uart_Send_Str(unsigned char str[],unsigned char len,bit mode);void main ()
{TM0_Init(); TM3_Init(); UartInit(); while(1){ if(send_flag){Num_Cut(cont_freq+(unsigned long)freq); //频率值等于溢出值加当前值send_flag = 0;UartSendStr("Freq: ");Uart_Send_Str(res,6,1);Uart_Send_Str(res,6,0);UartSendStr(" Hz\n");}}
}
/******************************************************************************* 描 述 : 定时器3初始化函数,定时时间1ms* 入 参 : 无* 返回值 : 无******************************************************************************/
void TM3_Init()
{T3L = 0x35; //设置定时初值,1msT3H = 0xA2; //设置定时初值T4T3M |= 0x08; //启动定时器T4T3M |= 0x02; //定时器时钟1T模式IE2 |= ET3; //使能定时器中断EA = 1; //开总中断
}
/******************************************************************************* 描 述 : 定时器0初始化函数,外部计数模式* 入 参 : 无* 返回值 : 无******************************************************************************/
void TM0_Init()
{TMOD |= 0x04; //设置外部计数模式TMOD |= 0x01; //工作模式1,16位不自动重载TR0 = 1; //打开计数器TH0 = 0x00; //计数器复位TL0 = 0x00; ET0 = 1; //开计数器中断
}
/******************************************************************************* 描 述 : 定时器0中断服务函数 * 入 参 : 无* 返回值 : 无******************************************************************************/
void TM0_Isr() interrupt 1
{ cont_freq += 65536; //溢出计数,每溢出一次,计数次数为TH0<<8|TL0 = 0xffff,经调试结果加1TH0 = 0x00; //复位计数器TL0 = 0x00; //复位计数器
}
/******************************************************************************* 描 述 : 定时器3中断服务函数* 入 参 : 无* 返回值 : 无******************************************************************************/
void TM3_Isr() interrupt 19
{ static unsigned int ms_flag = 0; //1s计数标志if(ms_flag++ == 1000){freq = (TH0<<8|TL0); //获取当前计数器计数值 ms_flag = 0; //1s计数标志复位send_flag = 1; //串口发送标志位置位TH0 = 0x00; //复位计数器TL0 = 0x00; //复位计数器 }AUXINTIF &= ~T3IF; //清中断标志
}
/******************************************************************************* 描 述 : 串口1初始化函数,波特率9600 * 入 参 : 无* 返回值 : 无******************************************************************************/
void UartInit(void) //9600bps@24.000MHz
{SCON |= 0x50; //8位数据,可变波特率AUXR |= 0x01; //串口1选择定时器2为波特率发生器AUXR |= 0x04; //定时器2时钟为Fosc,即1TT2L = 0x8F; //设定定时初值T2H = 0xFD; //设定定时初值AUXR |= 0x10; //启动定时器2
}
/******************************************************************************
* 描 述 : 串口字符发送和函数
* 入 参 : 发送字符
* 返回值 : 无
******************************************************************************/
void UartSend(unsigned char dat)
{SBUF =dat; while(!TI); TI=0;
}
/******************************************************************************
* 描 述 : 串口字符串发送函数
* 入 参 : 发送字符串
* 返回值 : 无
******************************************************************************/
void UartSendStr(unsigned char *p)
{while (*p){UartSend(*p++);}
}/******************************************************************************* 描 述 : 数字拆分函数* 入 参 : 拆分数字* 返回值 : 无******************************************************************************/
void Num_Cut(unsigned long num)
{ unsigned long temp = num; unsigned char cont = 5;while(temp != 0){res[cont--] = (unsigned char)(temp % 10);temp /= 10;}cont_freq = 0;
}
/******************************************************************************
* 描 述 : 串口数字数组发送函数
* 入 参 : str:数组,len:数组长度或者要发送数据长度,mode:1发送,0清零数组
* 返回值 :
******************************************************************************/
void Uart_Send_Str(unsigned char str[],unsigned char len,bit mode)
{unsigned char k;if(mode == 1){for(k = 0;k < len; k++){UartSend(48 + str[k]);} }else{for(k = 0;k < len; k++){str[k] = 0;}}
}
测试结果分析如下:
基于STC8单片机的频率计相关推荐
- 基于51单片机的频率计
前言:设计一个能产生固定频率的电路,然后经过单片机处理后显示该固定频率的系统. 1.指标以及功能要求 指标:该系统要能够产生一个31KHz的方波,进过单片机脉冲采集后能够在液晶上显示出该频率.要求:所 ...
- 51单片机频率计c语言程序,基于51单片机的频率计程序
这个是电路原理图 *********************************************** **************入门级频率计设计****************** ** ...
- c语言之判断电压最大值最小值,基于单片机的频率计的C语言源代码
描述 本文是基于AT89C51单片机的频率计的C源程序.该频率计主要实现的功能有如下几个: 1. 测试功能 它表明数字频率计所具备的全部测试功能,一般包括测频,周期,累计脉冲数,频率比,时间间隔及自较 ...
- SI4702 驱动 基于STC单片机
基于STC8单片机的Si4702驱动 简介 某宝随便买的,以为开发起来会很顺利没想到还是掉坑了,主要是因为没有详细阅读其数据手册导致. 没有示例代码也只有这么一张图,通过比对数据手册猜测这是一个2线通 ...
- 【C51】基于51单片机的简易频率计(附代码、无需外设、小白简单易上手)
基于51单片机的简易频率计(无需外设.小白简单易上手) 代码较为简单,大概思路是通过定时器单位时间内外部中断上升沿触发的次数来计算实际频率. /基于51单片机的简易频率计#include<r ...
- B005 – 基于STC8的单片机智能路灯控制系统
任务详情 基于单片机的智能路灯控制系统 非节能模式下LED灯同时亮灭,凌晨0点--6点为节能模式,该模式下只亮LED灯 中的一部分.当有声响时则开启全部LED灯,延迟1分钟后重新变为一半LED灯处于点 ...
- STC8单片机基于开源库读取mpu6050数据
STC8单片机基于开源库读取mpu6050数据
- B47 - 基于51单片机的RFID停车计费系统
任务摘要 当今社会,交通压力不断增加,智能停车场管理系统是人们对便捷高效交通的一种追求.本智能停车场管理系统运用RFID技术,采用STC8H8K64U单片机.RC522.串口屏.光电传感器实现系统设计 ...
- AT89C52单片机的频率计(1HZ~20MHZ)设计,LCD1602显示,含仿真、原理图、PCB与代码等
设计要求 1.以MCS-51系列单片机为控制器件,用C语言进行程序开发,结合外围电子电路,设计一款数字频率计: 2.能够对1HZ-20MHZ正弦波.三角波.方波信号等周期信号的频率进行测量: 3.测量 ...
最新文章
- 【怎样写代码】偷窥高手 -- 反射技术(六):深入窥视DLL内部
- pandas使用groupby函数对dataframe进行分组统计、使用as_index参数设置分组聚合的结果中分组变量不是dataframe的索引(index)
- 调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件。的解决方案
- svn中出现各种感叹号说明
- Protocol Buffer技术详解(语言规范)
- 2.6 谷歌 Inception 网络简介-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- 《编写可测试的JavaScript代码》——1.4 小结
- 阿里巴巴产品实习生N天
- FFMPEG结构体分析:AVCodecContext(转)
- clr 面试_Java中高级面试题及答案
- 申明 csdn的博客wjszf 也是本人的
- 【视频教程】利用Excel轻松爬取网页上的数据
- 信息竞赛进阶指南--单调队列模板
- 关于爬虫中遇到的问题
- 高职计算机专业用什么软件,【计算机专业论文】高职计算机专业CAD软件教学思考(共4772字)...
- 极光推送指定用户推送_干货|SpringBoot集成极光推送完整实现代码(建议收藏)...
- Python创建空DataFrame及添加行数据
- 微型计算机原理与接口技术第六版,微型计算机原理与接口技术(第6版)
- 黑暗传说作弊工具的IOS安卓
- I2C协议关于ack和nack的思考
热门文章
- CoreImage核心图像图像处理
- Baxter实战——执行双臂机器人通过rviz打开嵌入式视觉
- 播放器地址抓取 php,从优酷土豆视频地址中获取swf播放器分享地址 - PHP示例代码...
- 《2015互联网安全年报》,移动端成重灾区,黑灰产日益成熟
- linux下c使用lzma_使用 LZMA SDK
- python判断特殊字符的函数,python学习--quote()函数,,屏蔽特殊的字符、比如
- CI框架中表单取值 $this-input-post('city');
- bind server.c
- TOP 1比不加TOP慢的疑惑
- STC51-Keil使用及流水灯设计