基于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.测量 ...
最新文章
- python学习第19天
- 解决 idea 中 jsp 修改后页面不生效
- 选课网站html源码,选课系统网页制作(26页)-原创力文档
- 对互联网海量数据实时计算的理解
- 大一python考试知识点_Python基础知识点(精心整理)
- DupeString 与 StringOfChar 的区别 - 回复 鹰@长空
- java bitset xor_java中的BitSet
- POJ2074 Line of Sight
- 中国创新“先锋”企业系列报道
- 武汉理工大学2019计算机考研专业课题目(回忆版)
- mplayer - Linux下的电影播放器
- 修改Unity3d Asset Store 默认下载文件位置?
- ERROR tool.ExportTool: Error during export: Export job failed!错误解析
- [.NET基础]走进各种位运算
- java生成图片二维码
- b级车里有比迈腾空间更大的车吗?
- 静态成员变量和静态成员函数
- 矩阵博弈及其纳什均衡
- 牛客挑战赛42 B.小睿睿的伤害(树上启发式合并)
- 在win7下配置Geany,使其使用 Python 3
热门文章
- Python人脸识别项目-人脸检测
- Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能
- 多角度解析特斯拉电动车技术到底领先了多少?|厚势
- (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(printf)
- 如何将两列数据转为一列数据
- C++11 整型转字符串
- Java利用JNA调用C#的dll
- 宠物经济:吃、用、病、葬都是生意
- [Nowcoder] [Wannafly26A] 御坂网络 [模拟]
- 全球都在建智慧城市,智慧城市究竟什么样?中通服创立科技告诉你