利用c51单片机实现测频仪(基于proteus仿真)
主要使用了c51单片机内部的定时器计数器功能
最近在准备期末考试,就结合这个实验复习了一下TMOD,TCON, EA, IP的使用
还有就是今年的蓝桥杯单片机省赛的时候就考到了测频功能,当时还没有学习单片机,估计就是挂在了这里,现在学完了回过头来看一下, 原来这么简单,太可惜了。
TMOD, TCON, IE寄存器的主要功能
TMOD寄存器主要是对于定时器和计数器的模式控制
从高位到地位为GATE C/T M1 M0 GATE C/T M1 M0
第一位主要控制的是定时器的启动是否和外部信号有关INT0和INT1,不过基本上很少用到
第二位为定时器和计数器的选择,为1的时候是计数器, 为0的时候为定时器
第三位和第四位是控制定时器和计数器的模式选择的
- 模式0,使用THi的高八位和TLi的第五位(13位定时器/计数器)使用很少,一般使用模式1代替
- 模式1,使用16位定时器/计数器一次最多可以延时65536个机器周期,或者记65536个外部脉冲
- 模式2,自动填充八位定时器/计数器(当TLi达到溢出的时候,自动填充THi的初始值)
- 模式3,对于定时器/计数器1没有模式3,模式3直对定时器/计数器0有效(两个独立的八位定时器/计数器)
TCON控制定时器/计数器和外部中断
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TF1定时器/计数器1的溢出标志位
TR1为定时器/计数器1的开启控制位
IE1为外部中断1的标志位
IT1为外部中断方式的控制位
为1的时候为下降沿触发
为0的时候为低电平触发
IE寄存器主要是控制中断的开启
EA为是总中断位
EX0 ET0 EX1 ET1 ES 分别是四种中断的控制位
下面说一下思路
- 两个定时器计数器,应该一个作为定时器,定时1s,另一个作为计数器,来进行外部脉冲的计数
- 程序应该有四个模块主程序模块, 中断模块, 计算频率模块, 显示模块
- 细节的部分,应该考虑在计数器达到溢出的时候要有一个变量进行存储,进行频率计算的时候要计算到TL1和TH1中的个数,两个的单位是不统一,要进行转化
下面是程序
#include<reg51.h> //这里的晶体震荡频率为12MHz
#define uchar unsigned char
uchar Tcode[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x67 } ; //数码管共阴极的显示代码
int i = 0 , t = 0 ; //计数器溢出的存储变量
long frency = 0 ; //频率值void dispaly() ; //显示模块
void calculate() ; //计算频率模块void main()
{TMOD = 0X51; //设置为定时器计数器1为脉冲计数模式,定时器计数器0为定时模式TH1 = 0X00 ;TL1 = 0X00 ; TH0 = 0XB1 ;TL0 = 0XE0 ; //为定时器计数器赋初值TR1 = 1 ;TR0 = 1 ;EA = 1; ET0 = 1 ;ET1 = 1 ; //打开中断while(1){dispaly();} ;
}void time0() interrupt 1
{TH0 = 0XB1 ;TL0 = 0XE0 ; if( ++t >= 50 ) { //使用多次中断实现1s的延时TR1 = 0 ; //为了计数的准确性,在计算的时候将计数器1关闭calculate() ;t = 0 ; TH1 = 0 ; //清空计数器中的值,防止对下一个周期计数产生影响TL1 = 0 ;TR1 = 1 ; //最后打开中断}
}void time1() interrupt 3
{i++ ;
}void calculate()
{frency = i*65535 + TH1*256 + TL1 ; i = 0 ; //将溢出的次数清零,为下一次计数做准备
}void delay() //延时程序,使得数码管的显示达到稳定
{int i = 1000 ;for(;i>=0 ;i--) ;
}void dispaly()
{int show[6] ;int i = 0 ;int temp = 0x20 ; int six_number = frency/100000 ;int five_number = frency%100000/10000 ;int four_number = frency%100000/1000 ;int three_number = frency%1000/100 ;int two_number = frency%100/10 ; int one_number = frency%10 ;show[0] = one_number ; show[1] = two_number ; show[2] = three_number ; show[3] = four_number ; show[4] = five_number ;show[5] = six_number ;for(; i<6; i++){P2 = ~temp ; //利用循环结构,减少了大量重复代码temp = temp>>1 ; //每次将要显示的位置向右移动一位P1 = Tcode[show[i]] ; //显示对应的数值delay() ;}
}
如果大家有什么更好的方法欢迎交流啊,
如我有什么错误还望大家多多指出,交流一下哈
利用c51单片机实现测频仪(基于proteus仿真)相关推荐
- 基于51单片机的电子血压温度计(单片机健康检测系统设计)proteus仿真设计(仿真+程序+演示视频)
基于51单片机的电子血压温度计proteus仿真设计 (仿真+程序+演示视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:S0026 演示视频: 51单片机的 ...
- 基于Proteus仿真的交通信号灯设计——利用汇编语言实现
基于Proteus仿真的交通信号灯设计--利用汇编语言实现 文章目录 基于Proteus仿真的交通信号灯设计--利用汇编语言实现 设计要求 基本信息 交通状态 电路仿真原理图 电路总体布局 复位电路 ...
- 【011】基于51单片机的低频信号发生proteus仿真与实物设计
一.资料内容 (1).基于51单片机的低频信号发生proteus仿真设计一份: (2).基于51单片机的低频信号发生proteus仿真设计keli源代码一份: (3).基于51单片机的低频信号发生A ...
- 基于51单片机的八路电压表采集Proteus仿真(源码+仿真+原理图+全套资料)
资料编号:110 程序语言:C语言 仿真软件:Proteus8.9版本 功能讲解如下: 利用单片机及其外围器件(A/D转换器等)实现一款简易电压表,实现以下功能: 1 电压表能够进行8路模拟电压测 ...
- 0525基于单片机的智能宠物喂食器Proteus仿真
[前言] hello 大家好,今天给大家讲一讲基于单片机的智能宠物喂食器Proteus仿真.该项目的功能如下: 1.LCD1602实时显示当前时间和设定的喂食时间 2.当时间到达设定喂食时间,播放主人 ...
- 基于51单片机的LCD1602电子钟闹钟proteus仿真设计
本设计是基于51单片机的LCD1602电子钟闹钟proteus仿真设计 源码+仿真+原理图+器件清单 仿真软件版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编 ...
- 51单片机应用开发25例—基于Proteus仿真(电路图+程序)
51单片机应用开发25例-基于Proteus仿真(电路图+程序) 分享的51单片机应用开发25例-基于Proteus仿真非常全面,里面仿真工程文件和源程序都有. 目录: 应用实例1 呼吸灯\ 应用实 ...
- 【004】基于51单片机的音乐播放器proteus仿真设计
一.压缩包资料内容(私信获取) (1).基于51单片机的音乐播放器proteus仿真设计一份: (2).基于51单片机的音乐播放器proteus仿真设计keli源代码一份: (3).基于51单片机的音 ...
- 基于stm32单片机BMP180气压计海拔高度温度测量Proteus仿真
资料编号:149 下面是相关功能视频演示: 149-基于stm32单片机BMP180气压计海拔高度温度测量Proteus仿真(源码+仿真+全套资料) 本设计: 基于STM32的BMP180气压传感 ...
最新文章
- netstat常用命令
- 回顾 | 2018年十大AI新闻 中国继续占据主导优势
- 传清华应届生获Facebook offer
- C++ STL (四)set使用
- 【养成好习惯】使用pipreqs导出本项目使用的环境
- python中的递归函数是什么_Python中的递归函数
- 逻辑思维与C/C++解题
- jquery中ajax应用中的通用ajax()函数
- Linux批量清空当前目录中的日志文件
- LTP 语义依存分析
- C语言小案例_OA大典故障案例摘录【第1393篇】爱普生c5290 彩色喷墨打印机 打印横白道...
- 【Lua指南】lua脚本世界--快速入门
- 威伦触摸屏入门布局提升题
- 汽车电子(一)--- 整车CAN网络介绍
- ThinkPad E431 Bluetooth驱动
- 【转】乔布斯演讲黄金法则
- Browserslist: caniuse-lite is outdated. Please run the following command: `npm update`
- D. Good Triple
- Transformer对接公司需求的调研报告
- mysql8.0压缩包安装
热门文章
- HP EVA8400删除VDISK后数据恢复过程分步整理
- GIS空间分析(三)—— GIS环境下的空间分析
- js unescape java_java中对应javascript的escape和unescape的工具
- ubuntu安装和启动redis命令步骤及其配置文件redis.conf
- 《惢客创业日记》2018.12.27(周四)重要的事情说三遍 上篇
- 团队项目之选题报告和需求规格说明书
- Python的三种删除语句
- 离散度计算公式 python_Python中离散点的坡度计算
- 小戴门户站转来的mysql_fetch_array()运用
- 自动驾驶技术存在的难点