主要使用了c51单片机内部的定时器计数器功能

最近在准备期末考试,就结合这个实验复习了一下TMOD,TCON, EA, IP的使用
还有就是今年的蓝桥杯单片机省赛的时候就考到了测频功能,当时还没有学习单片机,估计就是挂在了这里,现在学完了回过头来看一下, 原来这么简单,太可惜了。

TMOD, TCON, IE寄存器的主要功能

TMOD寄存器主要是对于定时器和计数器的模式控制
从高位到地位为GATE C/T M1 M0 GATE C/T M1 M0
第一位主要控制的是定时器的启动是否和外部信号有关INT0和INT1,不过基本上很少用到
第二位为定时器和计数器的选择,为1的时候是计数器, 为0的时候为定时器
第三位和第四位是控制定时器和计数器的模式选择的

  1. 模式0,使用THi的高八位和TLi的第五位(13位定时器/计数器)使用很少,一般使用模式1代替
  2. 模式1,使用16位定时器/计数器一次最多可以延时65536个机器周期,或者记65536个外部脉冲
  3. 模式2,自动填充八位定时器/计数器(当TLi达到溢出的时候,自动填充THi的初始值)
  4. 模式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 分别是四种中断的控制位

下面说一下思路

  1. 两个定时器计数器,应该一个作为定时器,定时1s,另一个作为计数器,来进行外部脉冲的计数
  2. 程序应该有四个模块主程序模块, 中断模块, 计算频率模块, 显示模块
  3. 细节的部分,应该考虑在计数器达到溢出的时候要有一个变量进行存储,进行频率计算的时候要计算到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仿真)相关推荐

  1. 基于51单片机的电子血压温度计(单片机健康检测系统设计)proteus仿真设计(仿真+程序+演示视频)

    基于51单片机的电子血压温度计proteus仿真设计 (仿真+程序+演示视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:S0026 演示视频: 51单片机的 ...

  2. 基于Proteus仿真的交通信号灯设计——利用汇编语言实现

    基于Proteus仿真的交通信号灯设计--利用汇编语言实现 文章目录 基于Proteus仿真的交通信号灯设计--利用汇编语言实现 设计要求 基本信息 交通状态 电路仿真原理图 电路总体布局 复位电路 ...

  3. 【011】基于51单片机的低频信号发生proteus仿真与实物设计

    ​一.资料内容 (1).基于51单片机的低频信号发生proteus仿真设计一份: (2).基于51单片机的低频信号发生proteus仿真设计keli源代码一份: (3).基于51单片机的低频信号发生A ...

  4. 基于51单片机的八路电压表采集Proteus仿真(源码+仿真+原理图+全套资料)

    资料编号:110 程序语言:C语言 仿真软件:Proteus8.9版本 功能讲解如下: 利用单片机及其外围器件(A/D转换器等)实现一款简易电压表,实现以下功能: 1   电压表能够进行8路模拟电压测 ...

  5. 0525基于单片机的智能宠物喂食器Proteus仿真

    [前言] hello 大家好,今天给大家讲一讲基于单片机的智能宠物喂食器Proteus仿真.该项目的功能如下: 1.LCD1602实时显示当前时间和设定的喂食时间 2.当时间到达设定喂食时间,播放主人 ...

  6. 基于51单片机的LCD1602电子钟闹钟proteus仿真设计

    本设计是基于51单片机的LCD1602电子钟闹钟proteus仿真设计 源码+仿真+原理图+器件清单 仿真软件版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编 ...

  7. 51单片机应用开发25例—基于Proteus仿真(电路图+程序)

    51单片机应用开发25例-基于Proteus仿真(电路图+程序) 分享的51单片机应用开发25例-基于Proteus仿真非常全面,里面仿真工程文件和源程序都有. 目录: 应用实例1  呼吸灯\ 应用实 ...

  8. 【004】基于51单片机的音乐播放器proteus仿真设计

    一.压缩包资料内容(私信获取) (1).基于51单片机的音乐播放器proteus仿真设计一份: (2).基于51单片机的音乐播放器proteus仿真设计keli源代码一份: (3).基于51单片机的音 ...

  9. 基于stm32单片机BMP180气压计海拔高度温度测量Proteus仿真

    资料编号:149   下面是相关功能视频演示: 149-基于stm32单片机BMP180气压计海拔高度温度测量Proteus仿真(源码+仿真+全套资料) 本设计: 基于STM32的BMP180气压传感 ...

最新文章

  1. netstat常用命令
  2. 回顾 | 2018年十大AI新闻 中国继续占据主导优势
  3. 传清华应届生获Facebook offer
  4. C++ STL (四)set使用
  5. 【养成好习惯】使用pipreqs导出本项目使用的环境
  6. python中的递归函数是什么_Python中的递归函数
  7. 逻辑思维与C/C++解题
  8. jquery中ajax应用中的通用ajax()函数
  9. Linux批量清空当前目录中的日志文件
  10. LTP 语义依存分析
  11. C语言小案例_OA大典故障案例摘录【第1393篇】爱普生c5290 彩色喷墨打印机 打印横白道...
  12. 【Lua指南】lua脚本世界--快速入门
  13. 威伦触摸屏入门布局提升题
  14. 汽车电子(一)--- 整车CAN网络介绍
  15. ThinkPad E431 Bluetooth驱动
  16. 【转】乔布斯演讲黄金法则
  17. Browserslist: caniuse-lite is outdated. Please run the following command: `npm update`
  18. D. Good Triple
  19. Transformer对接公司需求的调研报告
  20. mysql8.0压缩包安装

热门文章

  1. HP EVA8400删除VDISK后数据恢复过程分步整理
  2. GIS空间分析(三)—— GIS环境下的空间分析
  3. js unescape java_java中对应javascript的escape和unescape的工具
  4. ubuntu安装和启动redis命令步骤及其配置文件redis.conf
  5. 《惢客创业日记》2018.12.27(周四)重要的事情说三遍 上篇
  6. 团队项目之选题报告和需求规格说明书
  7. Python的三种删除语句
  8. 离散度计算公式 python_Python中离散点的坡度计算
  9. 小戴门户站转来的mysql_fetch_array()运用
  10. 自动驾驶技术存在的难点