当前位置: 首页 > news >正文

《嵌入式硬件(二):中断》

1.独立按键

        按下之后,原理图网络编号变为低电平(经过初始化后为高电平的情况下)

        tips:==的运算级比&高

        用按键控制晶体数码管的数字->按k几,数码管就亮几

        main.c

#include <reg52.h>
#include "digiter.h"
#include "key.h"
#include "delay.h"int main(void)
{init_key();init_key_P3();while(1){  show_number(key_pressed());}
}

        digiter.c

#include <reg52.h>
#include "delay.h"
#include "digiter.h"void bit_select(int n)
{P1 &= ~(0x0F << 0);P1 |= (1 << n);
}void seqment_select(int n)
{unsigned char t[10] = {0X3F, 0X06, 0X5B, 0X4F, 0x66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F};P0 = t[n];delay(100);P0 = 0;delay(100);
}void show_number(int n)
{	if(n > 9999){return;}else if(n == 0){bit_select(0);seqment_select(0);}else{int t = 0;while(n){bit_select(t++);seqment_select(n % 10);n /= 10;}}
}

        key.c

#include <reg52.h>
#include "key.h"void init_key(void)
{P1 |= (0x0F << 4);
}
void init_key_P3(void)
{P3 |= (0x0F << 4);
}
int key_pressed(void)
{static int ret = 0;if((P1 & (1 << 4)) == 0)		 //0000 0001{ret = 1;}				   else if((P2 & (1 << 5)) == 0){ret = 2;}else if((P1 & (1 << 6)) == 0){ret = 3;}else if((P1 & (1 << 7)) == 0){ret = 4;}else if((P3 & (1 << 5)) == 0){ret = 5;}return ret;	
}

        delay.c

#include <reg52.h>
#include "delay.h"void delay(unsigned int n)
{while(n--);
}

2.中断系统

        中断:当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。

        中断源:实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。

        中断嵌套:当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。(51单片机最多俩层)

        八种中断

中断执行流程

        1)中断源发出中断请求        

        2)内核(cpu)检查是否响应相应中断以及该中断是否被屏蔽

        3)内核会检查中断的中断的优先级

        4)保护现场

        5)执行中断服务函数

        6)恢复现场

中断向量表:函数的指针的数组

中断向量:interr_table

中断的中断向量:interr_table[]

中断结构

3.中断寄存器

下面是详细介绍:

1)IE

2)TCON

利用中断,控制数码管,灯

        main.c

#include <reg52.h>
#include "delay.h"
#include "digiter.h"void init_enit0(void)
{IE |= (1 << 7)  | (1 << 0);TCON |= (1 << 0) | (1 << 1);	//下降沿P3 |= (1 << 2);	
}void init_enit1(void)
{IE |= (1 << 7) | (1 << 2);TCON |= (1 << 3);TCON &= ~(1 << 2);	 //低电平P3 |= (1 << 3);		
}
int num = 0;		
void enit0_handler(void) interrupt 0
{P2 ^= 0xFF;++num;if(num > 9999){num = 0;}
}void enit1_handler(void) interrupt 2
{//P2 ^= 0xFF;--num;if(num < 0){num = 9999;}
}int main(void)
{//P2 = 0;init_enit0();init_enit1();while(1){show_number(num);}
}

        delay.c

#include <reg52.h>
#include "delay.h"void delay(unsigned int n)
{while(n--);
}

        digiter.c

#include <reg52.h>
#include "delay.h"
#include "digiter"void bit_select(int n)
{P1 &= ~(0x0F << 0);P1 |= (1 << n);
}void seqment_select(int n)
{unsigned char t[10] = {0X3F, 0X06, 0X5B, 0X4F, 0x66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F};P0 = t[n];delay(100);P0 = 0;delay(100);
}void show_number(int n)
{	if(n > 9999){return;}else if(n == 0){bit_select(0);seqment_select(0);}else{int t = 0;while(n){bit_select(t++);seqment_select(n % 10);n /= 10;}}
}

4.定时器

        unsigned short    范围0~0xFFFF

        counter计数器,会自动往上加,52单片机是加计数器

        Clock时钟

        晶振:12Mhz     11.0592Mhz,实际工作为1/12,10^6

        计数器加一,用时1us(微秒)

        1)TCON

                

2)TMOD工作模式

16位定时器:TL0存储低位,TL0存储高位,大小都是一字节。

定时器控制灯开关,一秒一次

#include <reg52.h>void init_time0(void)
{TMOD &= ~(3 << 2);TMOD &= ~(3 << 0);TMOD |= (1 << 0);TCON |= (1 << 4); IE |= (1 << 7) | (1 << 1);TH0 = 64535 >> 8;TL0 = 64535;
}void timer0_handler(void)  interrupt 1
{static int t = 0;if(t >= 500){P2 ^= 0xFF;t = 0;}++t;TH0 = 64535 >> 8;TL0 = 64535;
}int main(void)
{init_time0();while(1){}
}

5.PWM

PWM是 脉冲宽度调制(Pulse Width Modulation),用 “占空比” 控制 “平均输出”

1.周期    

2.占空比:一个周期内高电平的时间

有源蜂鸣器    无源蜂鸣器     源->震荡源        有源,固定频率的响;无源,传方波

        蜂鸣器

#include <reg52.h>
#include "key.h"
#define Hz200 64285
#define Hz400 63035
#define Hz600 64535unsigned short n = Hz200;
void init_time0(void)
{TMOD &= ~(3 << 2);TMOD &= ~(3 << 0);TMOD |= (1 << 0);TCON |= (1 << 4); IE |= (1 << 7) | (1 << 1);TH0 = n >> 8;TL0 = n;
}void timer0_handler(void)  interrupt 1
{P2 ^= 1 << 1;TH0 = n >> 8;TL0 = n;
}int main(void)
{init_time0();init_key();init_key_P3();while(1){if((P1 & (1 << 4)) == 0)		 //0000 0001{n = Hz200;}				   else if((P1 & (1 << 6)) == 0){n = Hz400;}else if((P1 & (1 << 7)) == 0){n = Hz600;}}
}

文章转载自:

http://3dDoEn7Z.ryfqj.cn
http://Q6xX6Hqc.ryfqj.cn
http://W5QCDQbr.ryfqj.cn
http://2f84cAYw.ryfqj.cn
http://ely6LdnA.ryfqj.cn
http://C8Ku5NlV.ryfqj.cn
http://Svvg4yhY.ryfqj.cn
http://RwN7vYXQ.ryfqj.cn
http://VRLQowpO.ryfqj.cn
http://t3JG6xU3.ryfqj.cn
http://0FAWsese.ryfqj.cn
http://vv7UCAXi.ryfqj.cn
http://lMGsPU4P.ryfqj.cn
http://Cwqn2zo0.ryfqj.cn
http://K4YTSuea.ryfqj.cn
http://43HdhLtv.ryfqj.cn
http://ZGwW6DpR.ryfqj.cn
http://JxfsbvW9.ryfqj.cn
http://Eh73o5p1.ryfqj.cn
http://ZsoH84Lo.ryfqj.cn
http://uZFIT6nO.ryfqj.cn
http://gdnBCYYJ.ryfqj.cn
http://Rjg8d78d.ryfqj.cn
http://Ljxz9gjV.ryfqj.cn
http://F2UAinIj.ryfqj.cn
http://NeqKhtlu.ryfqj.cn
http://5MOhOEGi.ryfqj.cn
http://MAxSFTPW.ryfqj.cn
http://dmrN0LiI.ryfqj.cn
http://PAVJJYOl.ryfqj.cn
http://www.dtcms.com/a/366580.html

相关文章:

  • 多Agent协作案例:用AutoGen实现“写代码+测Bug”的自动开发流程
  • 【mysql】SQL自连接实战:查询温度升高的日期
  • 一键成文,标准随行——文思助手智能写作助力政务提效
  • PostgreSQL18-FDW连接的 SCRAM 直通身份验证
  • 金贝 KA Box 1.18T:一款高效能矿机的深度解析
  • 解锁桐果云零代码数据平台能力矩阵——赋能零售行业数字化转型新动能
  • 分布式电源接入电网进行潮流计算
  • 【C++详解】异常概念、抛出捕获与处理机制全解析
  • 当数据库宕机时,PostgreSQL 高可用在背后做了什么?
  • SQLynx 3.7 发布:数据库管理工具的性能与交互双重进化
  • 【系统架构设计(15)】软件架构设计一:软件架构概念与基于架构的软件开发
  • 安装与配置Jenkins(小白的”升级打怪“成长之路)
  • 整理3维4点结构加法
  • 处理省市区excel数据加工成SQL
  • AI+ 行动意见解读:音视频直播SDK如何加速行业智能化
  • 2025 全国大学生数学建模竞赛题目-B 题 碳化硅外延层厚度的确定 问题二完整思路
  • 51单片机------中断系统
  • iOS 抓包工具怎么选?开发者的实战经验与选择指南
  • 缓存雪崩、穿透、击穿解决方案
  • 【数据可视化-107】2025年1-7月全国出口总额Top 10省市数据分析:用Python和Pyecharts打造炫酷可视化大屏
  • NV 工具metrics分析(ncu, nsys/torch profiler)
  • 水下管道巡检机器人结构设cad+三维图+设计说明书
  • 阿里云轻量应用服务器部署WordPress与配置SSL 证书
  • 【mmcv自己理解】
  • 解密llama.cpp:从Prompt到Response的完整技术流程剖析
  • Python基础(①⑤heapq模块)
  • 大数据工程师认证推荐项目:基于Spark+Django的学生创业分析可视化系统技术价值解析
  • 出海马来西亚,九识智能携手ALS共同启动首个自动驾驶物流车公开道路试运行
  • AIcoding- Aider项目架构概览学习笔记
  • vue3 + vite + Element Plus项目中 SCSS 预处理器完整配置指南