IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 飞思卡尔智能车招新 -> 正文阅读

[嵌入式]飞思卡尔智能车招新

飞思卡尔智能车招新

内容:定时器数码管矩阵键盘

定时器

什么是定时器

  • 定时器或计数器实质是加一计数器(16位)(其输入脉冲有两个来源,一是由系统时钟振荡器输出脉冲经过十二分频后送来;另外是T0或T1引脚输入的外部脉冲源,每来一个脉冲计数器加1,当加到计数器全为1时,在输入一个脉冲就可使计数器回零,计数器的溢出是的TCON寄存器中TF0或TF1置1向CPU发出中断请求,如果定时或计数器工作于定时模式,则表示定时时间到了,如果是计数则表示计数值已满)由高八位和低八位两个寄存器组成。
  • 看着感觉听不懂吧,那就看下图,手把手教你定时器的原理:
    1.定时器工作原理:
    在这里插入图片描述
    2.定时器和计数频率的关系
    在这里插入图片描述

定时器中断配置+1s点亮1次LED灯

寄存器配置

  • TMOD定时器/计数器工作方式寄存器
D7D6D5D4D3D2D1D0
TMODGATEC/TM1M0GATEC/TM1M0
T1T1T1T1T0T0T0T0

GATE:门控位
GATE=0,定时器/计数器是否计数,仅由控制位TR1或TR0控制。
GATE=1,定时器/计数器是否计数,由外中断引脚(P3.2或者P3.3)上的电平与TRx共同控制。
C/T:计数模式(Count)和定时器(Timer)模式选择位
C/T = 0,为定时器工作模式,对系统时钟12分频后的内部脉冲进行计数
C/T = 1,为计数器工作模式,计数器对外部输入引脚T0(p3.4)或者T1(p3.5)的外部脉冲(负跳变)计数
M1,M0:工作方式选择位
M1,M0的4中编码,对应于4中工作方式的选择

M1 M0工作方式
0 0方式0,为13位定时器/计数器
0 1方式1,为16位定时器/计数器
1 0方式2,为8位的常数自动重新装载的定时器/计数器
1 1方式3,仅适用于T0,此时T0分成2个8位计数器,T1停止计数

TMOD代码配置:GATE=0 - 由TR0控制是否计数。C/T=0 - 定时模式。M0,M1=0,1 - 方式1 16位
定时器

TMOD=0X01;//0000 0001;
//低四位GATE=0,C/T=0,M0=1,M1=0;
  • TCON中断请求标志寄存器
D7D6D5D4D3D2D1D0
TCONTF1TR1TF0TR0IE1IT1IE0IT0

TF1:定时器/计数器T1的溢出中断请求标志位。
当启动T1后,T1从初值开始加1计数,当计数溢出时,由硬件自动置TF1为“1”,向CPU申请中断。CPU响应TF1中断时,TF1标志1由硬件自动清零,TF1也可由软件清零。
TF0:定时器/计数器T0的溢出中断请求标志位。功能与TF1相同
TR1、TR0:计数运行控制位
TR1、TR0=1时,启动定时器/计数器的必要条件
TR1、TR0=0时,停止定时器/计数器
低四位不用管,那四个是外部中断的

代码配置配置TR0或者TR1=0或者1即可,这里我们用定时器0,TR0=1使能定时器,让定时器启动计数.

TR0=1;//启动定时器
  • 中断允许寄存器IE
D7D6D5D4D3D2D1D0
IEEAESET1EX1ET0EX0

EA:中断允许总开关控制位。置1所有中断请求被允许,置零所有中断请求被屏蔽。
ES:串行口中断允许控制位。置1允许串行口中断,置0禁止
ETI:定时器/计数器T1的溢出中断允许控制位。置1允许,置0禁止
ET0:定时器/计数器T0的溢出中断允许控制位。置1允许,置0禁止
EX1:外部中断1中断允许位。置1允许,置0禁止
EX0:外部中断0中断允许位。置1允许,置0禁止
我们只关注EA位和ET0/ET1位

定时器中断代码配置配置EA=1或者ET1=1或者ET0=1,这里我们用定时器0,EA=1,ET0=1使能总中断,使能定时器中断.

EA=1;//使能总中断
ET0=1;//使能定时器0中断
TF0=0;//清除中断请求标志,这个是TCON寄存器里面的,
//就是中断发生一次,TF0就会置一,
//但是我们初始化时要将他配置成0,表示还没有发生过中断
  • 定时器初值配置
初值寄存器TH1TL1TH0TL0

初值代码配置因为我们想要中断1ms响应一次,由于计一个数为1us,则计1000个数就是1ms,所以配置初值为65536-1000=64536(十六进制为FC18)
这里我们配置定时器1初值为F81C

TH0=0XFC;//FC18的高4位
TL0=0X18;//FC18的低4位

至此:定时器中断配置完毕,接下来开始总体配置代码
定时器和定时器中断初始化 -中断1ms发生一次

void Timer0Init(void)
{
	TMOD=0X01;//0000 0001;
    //低四位GATE=0,C/T=0,M0=1,M1=0;
	TH0=0XFC;//FC18的高4位
    TL0=0X18;//FC18的低4位
	TF0 = 0;		//清除TF0标志
    TR0=1;//启动定时器
    ET0=1;//使能定时器0中断
    EA=1;//使能总中断
}

定时器代码

main.c

#include <REGX52.H>
#include <Timer0.h>
#include <Delay.h>
extern  int a;

//数码管两个段码,数码管为共阴数码管
void Dispaly(int num)
{
  int i;
  int s=num;
for(i=0;i<2;i++)
  {
    //每次循环将两个数码管熄灭
    P2_0=1;
    P2_1=1;
    P1=0X00;
    switch (i)//循环两次,每次点亮一个数码管
    {
      case 0:P2_0=0,P2_1=1;break;
      case 1:P2_1=0,P2_0=1;break;
    }
    switch(s%10)//显示段码数字,这个是共阴码
    {
      case 0:P1=0X3F;break;
      case 1:P1=0X06;break;
      case 2:P1=0X5b;break;
      case 3:P1=0X4f;break;
      case 4:P1=0X66;break;
      case 5:P1=0X6d;break;
      case 6:P1=0X7d;break;
      case 7:P1=0X07;break;
      case 8:P1=0X7f;break;
      case 9:P1=0X6f;break;
    }
    Delay(10);//延时5ms
    s=s/10;//个位变十位
  }
}
//假如显示159
//显示第一个数个位:s%10=9;
//显示第二个数十位:s/10%10=9;
//显示第三个数十位:s/10/10%10=1;
void main()
{ 
  P3_0=1;  
	Timer0Init();//开启定时器,1ms进入中断服务函数,然后进入1000次后才会点灯,就是1000*1ms=1s
	while(1)
	{
  //P1=0X7F;//0X06-0000 0110 1-B,1-C
  //Dispaly(58);
	}
}

Timer0.c

#include <REGX52.H>
#include <Timer0.h>

void Timer0Init(void)
{
	  TMOD=0X01;//0000 0001;
    //低四位GATE=0,C/T=0,M0=1,M1=0;
	  TH0=0XFC;//FC18的高4位
      TL0=0X18;//FC18的低4位
	  TF0 = 0;		//清除TF0标志
      TR0=1;//启动定时器
      ET0=1;//使能定时器0中断
      EA=1;//使能总中断
}
//定时器中断函数模板
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
  
  //选取晶振为12Mhz,意味着计一个数的时间为1us
  //设初值为64536对应十六进制为FC18,从FC18开始计时,计到65536对应十六禁止0XFFFF,后响应中断
  //65536-64536为1000,然后呢就是计1000个数响应一次中断,刚才说了1us计一个数,所以1000个数就是计1000us=1ms
  //所以就是1ms响应一次中断,但是我们想要1s后处理某个事情,那我们就给他个条件,响应1000次中断我们才执行我们想做的事情
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=1000)//响应1000次后,我们就处理自己想做的事
	{
		T0Count=0;//清零就是为了下一次再来执行,count再次大于1000后
    
    P3_0=!P3_0;//点灯,1s翻转一次电平
	}
}

Timer0.h

#ifndef __TIMER0_H__
#define __TIMER0_H__

void Timer0Init(void);
#endif

Delay.c

#include <Delay.h>
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

数码管代码

//数码管两个段码,数码管为共阴数码管
void Dispaly(int num)
{
  int i;
  int s=num;
for(i=0;i<2;i++)
  {
    //每次循环将两个数码管熄灭
    P2_0=1;
    P2_1=1;
    P1=0X00;
    switch (i)//循环两次,每次点亮一个数码管
    {
      case 0:P2_0=0,P2_1=1;break;
      case 1:P2_1=0,P2_0=1;break;
    }
    switch(s%10)//显示段码数字,这个是共阴码
    {
      case 0:P1=0X3F;break;
      case 1:P1=0X06;break;
      case 2:P1=0X5b;break;
      case 3:P1=0X4f;break;
      case 4:P1=0X66;break;
      case 5:P1=0X6d;break;
      case 6:P1=0X7d;break;
      case 7:P1=0X07;break;
      case 8:P1=0X7f;break;
      case 9:P1=0X6f;break;
    }
    Delay(5);//延时5ms
    s=s/10;//个位变十位
  }
}
  • 假如显示159
  • 显示第一个数个位:s%10=9;
  • 显示第二个数十位:s/10%10=9;
  • 显示第三个数十位:s/10/10%10=1;

矩阵键盘代码

#include <REGX52.H>
#include <Delay.h>
int MatrixKey()
{
	int KeyNumber=0;
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=2;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=3;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=4;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=5;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=7;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=8;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=9;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=10;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=12;}
	
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=13;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=14;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=15;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
	
	return KeyNumber;
}

							   


void main()
{   
	while(1)
	{
    switch( MatrixKey())
    {
      //case 0:P2=0X3f;break;
      case 1:P2=0X06;break;
      case 2:P2=0X5b;break;
      case 3:P2=0X4f;break;
      case 4:P2=0X66;break;
      case 5:P2=0X6d;break;
      case 6:P2=0X7d;break;
      case 7:P2=0X07;break;
      case 8:P2=0X7f;break;
      case 9:P2=0X6f;break;
      //default :P2=0X6F;
    }
	}
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:58:04  更:2022-10-08 21:01:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:15:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码