51单片机-单独文件封装

发布者:正在搬砖的河马71最新更新时间:2021-08-25 来源: eefocus关键字:51单片机 手机看文章 扫描二维码
随时随地手机看文章

1.再遇多文件编程

因为定时器经常在后面的教程中使用到,所以我们也把这部分功能代码单独使用文件封装起来。


在第六章的教程中已经教过大家多文件创建,这里点到为止。


创建好“timer.c”和“timer.h”

8.6.png


添加进工程中

8.7.png


2.timer.c的代码

#include  

#include //详见第六章第8讲

   

u8 T0RH,T0RL,T1RH,T1RL;

   

void TIM0_Init(u32 us,int trim)//trim:微调

{

    u32 tmp;  //临时变量

     

    tmp = 11059200 / 12;            //定时器计数频率

    tmp = ( tmp * (us/100) )/10000; //计算所需的计数值

    tmp = 65536 - tmp;              //计算定时器重载值

    tmp = tmp+trim;                 //微调计数值使其定时更精确到我们想要的定时时间

    T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节  

    T0RL = (unsigned char)tmp;

    TMOD &= 0xF0; //清0低四位 

    TMOD |= 0x01; //设置定时器0为工作模式1   

    TH0 = T0RH;   //加载T0重载值   

    TL0 = T0RL;

    ET0 = 1;      //闭合定时器0中断的开关        

    TR0 = 1;      //启动定时器0         

}  

  

void TIM1_Init(u32 us,int trim)//trim:微调

{

    u32 tmp;  //临时变量

     

    tmp = 11059200 / 12;            //定时器计数频率

    tmp = ( tmp * (us/100) )/10000; //计算所需的计数值

    tmp = 65536 - tmp;              //计算定时器重载值

    tmp = tmp+trim;                 //微调计数值使其定时更精确到我们想要的定时时间

    T1RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节    

    T1RL = (unsigned char)tmp;

    TMOD&=0x0F;//清0高四位

    TMOD|=0x10;//设置定时器1为工作模式1 

    TH1 = T1RH;//加载T1重载值     

    TL1 = T1RL;

    ET1 = 1;   //闭合定时器1中断的开关        

    TR1 = 1;   //启动定时器1         

}


“TMOD&=0xF0;”的作用跟数码管显示小数点的代码技巧一样,保持前面4位的值不变,清0后四位,然后“TMOD|=0x01;”就是不改变原来高四位的值,然后把低四位设成 0001。


如果在TIM0_Init()函数中只写“TMOD=0x01;”


在TIM1_Init()函数中只写“TMOD=0x10;”


然后初始化时像这样按顺序来写


TIM0_Init(20000,20);//定时20ms,20微调使定时精度更高


TIM1_Init(50000,20);//定时50ms,20微调使定时精度更高


那么执行TIM1_Init()的函数内容时就会执行“TMOD=0x10;”把人家低四位给清0了,原本想让定时器0工作在模式1,现在低2位的值变了也就不是工作在模式1了。


所以“TMOD&=0x0F; TMOD|=0x10;”的写法是不干涉互相的位。


我们定义了“T0RH,T0RL,T1RH,T1RL”四个8位的全局变量(R:reload)用来在中断函数里重新赋值。


因为工作模式1都是需要在中断函数中重新赋初值,所以这四个变量是存取初始化时给THx和TLx的初值。


3.timer.h的代码


#ifndef __TIMER_H__

#define __TIMER_H__

   

extern u8 T0RH,T0RL,T1RH,T1RL;

  

void TIM0_Init(u32 us,int trim);//trim:微调 

void TIM1_Init(u32 us,int trim);//trim:微调 

 

#endif


4.main.c的代码


这样,实现间隔50ms的流水灯在书写上就相当简洁了


#include  

#include //详见第六章第8讲

#include

 

void main()

{

    LED_Init();         //初始化LED硬件模块

    EA = 1;             //闭合总中断开关

    TIM0_Init(50000,20);//用定时器0定时50ms,20是微调使中断函数里的i均匀地50.00ms后自加,精度更高

    while(1);

}

 

void TIM0_IRQHandler() interrupt 1

{

    static u8 i; 

    TH0 = T0RH;  //重新加载重载值

    TL0 = T0RL;

 

    P0=~(0x01<    i++;

    if(i>=8)i=0; 

}


关键字:51单片机 引用地址:51单片机-单独文件封装

上一篇:51单片机-微调定时精确时间
下一篇:51单片机-输入捕获

推荐阅读最新更新时间:2024-11-06 10:18

51单片机使用一个IO口做RC充放电来模拟ADC
AUXR DATA 08EH ;Auxiliary register P1M1 DATA 091H ;P1M1.N,P1M0.N =00--- Standard, 01--- push-pull P1M0 DATA 092H ; =10--- pure input, 11--- open drain P_RC BIT P1.0 ;RC port DLY_H DATA 30H ;Delay high byte DLY_M DATA 31H ;delay mid
[单片机]
基于51单片机霍尔测速仪表测转速调速系统方案原理图设计
硬件分析 原理框图 原理图: 系统功能分析 本设计由STC89C52单片机电路+液晶LCD1602显示电路+霍尔测速电路+电源电路组成。 1、通过霍尔传感器测速,霍尔传感器检测轮盘上的磁铁进而知道轮盘转了多少周,从而计算出转速。 2、LCD1602液晶实时显示转速。 3、可以通过电位器调节电机的转速。 A3144霍尔传感器模块电路设计 本霍尔传感器模块是基于霍尔元件A3144设计制作的模块,A3144芯片是一种磁传感器,其应用霍尔效应原理,采用半导体集成技术制造的磁敏电路,它是由电压调整器、霍尔电压发生器、差分放大器、史密特触发器,温度补偿电路和集电极开路的输出级组成的磁敏传感电路,其输入为磁感应强度,输出是一个数
[单片机]
基于<font color='red'>51单片机</font>霍尔测速仪表测转速调速系统方案原理图设计
基于51单片机多机通信的交通灯控制网络设计
由于微机技术的飞速发展和控制系统的复杂化,多机通信的应用越来越广泛,特别在一些对工业过程的控制中,多机通信已经成为通信控制领域的主流通信方式。 本文针对目前单片机书籍(包括教材)很少介绍多机通信的实现技术的情况,在交通灯控制系统的基础上设计了一个交通灯控制网络系统,以此为实例给出了单片机多机通信的解决方案。 1 单片机多机通信的基本原理 计算机之间的通信除了点对点通信外,还有一机对多机或多机之间的通信,构成计算机网络,其中主从式多机通信是比较常用的一种方式。在主从式多机通信系统中,只有一台主机,但可以有多台从机。主机发送的信息可以传送到各个从机或指定从机,从机发送的信息只能为主机所接收,各从机之间不能直接通信。主机通常由
[单片机]
基于<font color='red'>51单片机</font>多机通信的交通灯控制网络设计
基于51单片机数控恒流源
电路原理图如下: 该项设计的主要目的是设计一种数控稳压电源。它利用单片机STC89C51作为主控芯片,控制数字/模拟转换器(TLC5615)的输出电压的大小,经过运算放大器LM358与IRF9Z24N构成负反馈系统,从而输出恒定电压。最后通过电位器分压将输出信号反馈到运算放大器LM358上,使输出准确度可以调节。此设计通过键盘电路与单片机连接,读入控制数据,利用软件进行判断,从而起到控制电源输出的作用。通过LCD1602(或LED数码管)显示数控电源的输出电压,实现简单的人机对话。该项设计具有设计简单,控制灵活,调节方便,携带方便、成本低等优势,具有较强的实用性。 下图是为了了解整个电路如何工作的,把整个电路拆开。 二
[单片机]
基于<font color='red'>51单片机</font>数控恒流源
51单片机在微型打印机中的应用
1 引 言      由于单片机具有简单实用、高可靠性、良好的性能价格比以及体积小等优点,已经在各个技术领域得到了迅猛发展。本文着重介绍89C52对并行接口的微型打印机的控制,以便更好地了解和掌握单片机对外部接口的一般和一些特殊功能的应用。 2 控制打印原理      89C52单片机执行程序存贮器中的程序,控制电机带动滑槽轮及蜗杆转动[1],使打印机的机头滑架左右移动,从而不断改变同一点行上的打点位置。蜗杆的转动一方面通过凸轮带动走纸机构实行走纸,另一方面驱动色带移动。电机转动时感应线圈有一个3 V的正弦信号,经过整形电路后成为方波,此方波输入到89C52,经过89C52相应的指令检测此方波的变化时刻(从上升沿变到下降沿或者从
[单片机]
<font color='red'>51单片机</font>在微型打印机中的应用
C51单片机数据类型范围
C51单片机(宏晶科技STC11L32/48/60XE)编程中数据类型范围: 如下图:
[单片机]
如何自学51单片机
我是学软件工程的,学习单片机完全是出于兴趣。我厌倦了编写纯粹软件的虚无感,只能在屏幕上显示一句“hello,world!”,而单片机能实实在在的点亮一个LED灯,这种成就感是无法相提并论的。到现在51单片机我基本学完了,用了两个礼拜左右,个人觉得不是太难,下面就说说我的经验吧~~ 1.开发板 要学会单片机一定要有一块51单片机开发板,网上确实也有模拟单片机的软件,我负责任的说一句用模拟软件是学不会的。为什么?我也不知道,哈哈。开发板的话淘宝上种类很多,价格质量也都还行,我个人入手了一块200大洋左右的板子,还不错,功能外设都很全。我觉得150以上的都能满足学习的需要了。 2.有了板子了,怎么学呢? 我自己是边看视频边看
[单片机]
如何自学<font color='red'>51单片机</font>?
51单片机-实际LED硬件连接
1.三极管认识 假如我们的开发板的硬件连接有如下情况,我们需要点亮LED,需要怎么做? 先看左图,要想点亮LED,根据本章第一讲知识,只需“+5”与R1是短接状态即可,那么PNP型三极管就是起到被单片机IO端口控制是否允许此处短接的作用,也叫三极管是否导通。 如果单片机IO端口输出的是低电平(0V),此时我们可以直观的认为“+5”那端与单片机IO端口形成压差有电流通过,而电流流向正如箭头所示,则表明此时“+5”与R1是短接状态,三极管导通,灯就被点亮了。 那单片机IO端口输出的是高电平(5V)时,则没有形成压差也就产生不了电流,那么箭头不能代表此时有电流流向这个方向,所以“+5”与R1是断开状态,灯没
[单片机]
<font color='red'>51单片机</font>-实际LED硬件连接
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved