单片机编程小错记录1:漏写串口中断服务函数

news2024/11/29 22:42:02

 

问题描述:

原本单独测试没问题的定时器程序,但在加上串口程序后出现了问题,发现定时器貌似没有在正常工作......

问题发现:

程序如下:

该程序主要想实现的功能是:

                1.串口在初始化时发送"welcome\r\n"

                2.后续定时器定时每1200ms让串口发送一次"666\r\n"

但最终这段代码只实现了功能1,并没有实现功能2

#include "stc15f2k60s2.h"
#include "stdio.h"


//蜂鸣器继电器引脚:
sbit buzz=P0^6;
sbit RELAY=P0^4;

typedef unsigned char u8;
typedef unsigned int u16;
typedef int u32;

bit print_flag;
u16 print_cnt;

void task_clock();         //模块时序安排 
void inint_all();          //初始化所有模块
void inint_port(u8 i);     //初始化74hc573芯片
void Timer0Init(void);		 //1毫秒@12.000MHz
void UartInit(void);		   //9600bps@11.0592MHz
void handle_printf_data(); //串口测试打印数据


void main()
{
	inint_all();
	while(1)
	{		
	if(print_flag==1)
	{
		print_flag=0;
		printf("666\r\n");
	}
	}
}

void inint_all()  //初始化所有模块
{
	inint_port(5);  //关闭外设
	buzz=0;
	inint_port(5);  //关闭外设
	RELAY=0;
	inint_port(4);
	P0=0XFF;
	
	Timer0Init();
	UartInit();
	printf("welcome\r\n");
}

void inint_port(u8 i)  //初始化74hc573芯片
{
	switch(i)
	{
		case 4:P2=(P2&0X1F)|0X80;break; //LED
		case 5:P2=(P2&0X1F)|0XA0;break; //BUZZ RELAY
		case 6:P2=(P2&0X1F)|0XC0;break; //数码管位选 
		case 7:P2=(P2&0X1F)|0XE0;break;	//数码管段选	
	}
}	

void Timer0Init(void)
{
	AUXR &= 0x7F;TMOD &= 0xF0;TL0 = 0x18;TH0 = 0xFC;
	TF0 = 0;TR0 = 1;EA=1;ET0=1;
}

void timer0_serv() interrupt 1
{
	if(++print_cnt==1200)//1200ms发送一次串口
	{print_cnt=0;print_flag=1;}
}

void UartInit(void)	//9600bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0xE0;		  //设置定时初始值
	T2H = 0xFE;		  //设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	
	REN=1;
	ES=1;
	EA=1;
}

void Uart_1_serv() interrupt 4
{if(RI){RI=0;}}


void send_date(unsigned char date)  {SBUF = date; while(!TI); TI = 0;}
char putchar (char ch){send_date(ch);return ch;}

问题解决:

在分析改正下,发现原来是串口中断服务函数没有编写导致了这个问题!

在文件中加上这个串口1中断服务函数就解决了:

void Uart_1_serv() interrupt 4
{if(RI){RI=0;}}

上位机测试也没问题了:

 

问题原理:

那为何会出现这样的BUG呢?

在单片机中,串口和定时器都可以使用中断,而中断服务函数是用来响应中断请求的,如果你没有定义好对应的中断服务函数,在产生中断请求时,系统就找不到对应的中断服务函数,无法处理中断请求。

在这种情况下,如果串口接收到数据时,因为没有定义串口接收中断服务函数,数据就不能被及时处理,从而导致数据丢失。同时,如果你没有定义定时器中断服务函数,当定时器计数到指定时间时,系统会无法响应中断请求,导致定时器无法正常工作。因此,在单片机中,使用中断来处理串口和定时器的数据会更加高效和稳定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

crossover软件2023跨电脑系统兼容工具好用吗?

CrossOver是一款系统兼容软件 让您可以在 Mac 和 Linux 系统上运行 Windows 应用,不必购买 Windows授权,不必重启系统,不必使用虚拟机。通过 CrossOver, 您可以从 dock 直接启动 Windows 应用,与您的 Mac 和 Linux 系统…

Java中this和super区别(面试题)

1.super 关键字可以理解为:父类的 2.可以用来调用的结构:属性、方法、构造器 3.super调用属性、方法: 3.1 我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声…

每日一练 | 华为认证真题练习Day54

1、现有一台交换机通过一个端口和对端设备的指定端口直连,但是该端口不转发任何报文,却可以通过接收BPDU来监听网络变化,那么该端口的角色应该是()。 A. Root端口 B. Designated端口 C. Alternate端口 D. Disable端…

day1 计算机硬件基础

目录 课程回顾 嵌入式系统分层 ARM体系结构与接口技术 计算的组成 总线 CPU工作概述 课程回顾 嵌入式系统分层 操作系统的作用: 向下管理硬件、向上提供接口(API) Linux子系统: 进程管理:管理进程的创建、调度…

【MySQL数据库 | 第二篇】 启动与停止

目录 ​编辑 🤔 启动与停止: 🙂1.WIN加R调用windows命令行,输入:services.msc 🙂2.可以在cmd(管理员模式)中输入以下指令: 🤔 启动MySQ后的操作步骤&…

Es elasticsearch 十九 kibana 可视化配置图表 及功能 集群部署

目录 Es kibana 可视化 下载zip 解压 bin/kibana.bat 启动 管理索引管理 吧logstash 存进来的数据 按照 xxx-* 方式 保存索引模式 通过 discove 配置可视化界面 图表数据实时刷新 时序图配置 饼图配置 表格数据配置 添加仪表盘 图表样例 使用后模拟绘制方法好看些 …

线程的相关函数pthread

一、线程相关函数 头文件&#xff1a;#include <pthread.h> 注意&#xff1a;在编译时注意加上-lpthread参数&#xff0c;以调用静态链接库。因为pthread并非linux系统的默认库。 1、pthread_create 函数声明&#xff1a;int pthread_create(pthread_t *thread, const…

这所院校复试只刷低分,有9人擦线竟直接放弃复试!

本期为大家整理唯一个处于东部发达地区入选“双一流建设”的原双非类的综合类大学-“宁波大学”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度…

kubelet源码分析 kuberuntime的syncpod、createSandbox/createContainer函数(三)

kubelet源码分析 kuberuntime的syncpod、createSandbox/createContainer函数&#xff08;三&#xff09; 上一篇介绍了killContainer容器部分。当kill后&#xff0c;就需要重新创建sandbox和container&#xff0c;今天介绍最后一部分&#xff0c;创建容器。 这篇也是整个上面的…

通达信自动包络线指标公式以及ATR通道指标

根据亚历山大埃尔德在其著作《以交易为生》中的描述&#xff0c;自动包络线的设计思路是将通道看作试穿衬衫一样&#xff0c;寻找那些穿起来既不过松也不过紧的衬衫&#xff0c;只让手腕和脖子露在外面。自动包络线能够适应最近的行情波动&#xff0c;只有在极端情况下&#xf…

修电脑屏幕记

21年的时候媳妇买了台联想小新16Pro&#xff0c;最近发现屏幕闪&#xff0c;查了查售后政策&#xff0c;好在屏幕质保两年。 找维修点 从高德地图里搜联想售后很正常吧&#xff01;看看图片带着Lenovo的图片&#xff0c;是不是感觉是官方售后&#xff1f;拨打电话打到的是总部…

AI生成的二维码,真的太好看了!

今天我们迫不及待要和大家分享一组图片。 这是一位二维码开发者——倪豪 Isle of Chaos&#xff0c;与几位同学和老师们一起&#xff0c;使用最新的AI技术生成的非常惊艳的图片。最重要的是&#xff0c;这些图片里面都暗藏了一个可识别的二维码&#xff01; 总之&#xff0c;…

回归分析处理

线性回归 最小二乘法 对于某数据量 有呈线性关系的输出量 &#xff0c;且 &#xff0c;现有对这些数据量的采集序列&#xff0c;这些采集量会存在随机误差&#xff0c;线性回归的目的便是找到保证使误差最小的情况下的回归系数 。 即通过下列方程组求 可利用最小二乘法&a…

SaaS行业的公司为什么都需要一个专业的知识库

随着云计算和人工智能技术的不断发展&#xff0c;SaaS&#xff08;Software as a Service&#xff09;模式已经成为了企业信息化转型的必备选择。SaaS 公司提供的服务可以帮助客户在不增加IT投资的情况下&#xff0c;获得更为高效灵活的IT解决方案。但随着客户数量和服务类型的…

Windows下的网络编程Winsock

文章目录 前言1、服务器下的Winsock1.1、构建编程环境:1.2、WSAData结构体1.3、WSAStartup初始化Winsock1.4、WSACleanup释放Winsock1.5、socket创建套接字1.6、bind绑定套接字&#xff0c;调用其分配IP地址和端口号1.7、listen监听套接字1.8、accept接受客户端连接请求1.9、cl…

k8s helm安装使用

1.前言 Helm 是一个 Kubernetes 包管理工具&#xff0c;它的作用是简化 Kubernetes 应用程序的部署和管理。Helm 允许您将 Kubernetes 应用程序打包为 chart&#xff0c;chart 是一组预定义的 Kubernetes 对象模板&#xff0c;包括 Deployment、Service、Ingress 等。使用 Hel…

python中文情感分析---基于包含分数的情感词典实现对于各语句的情感分析的方案

一、详情简介: 1.此文主要研究方向为:基于包含分数的情感词典实现对于各语句的情感分析&#xff1b; 2.情感分析主要基于文本数据&#xff0c;是自然语言处理&#xff08;NPL&#xff09;的主要内容。情感分析&#xff1a;又称意见挖掘、倾向性分析等。简单而言,是对带有情感…

Unity中的【Dropdown(包括TMP_Dropdown)下拉框当只有一个下拉值时多次点击 OnValueChange事件无效】的改进方法

Dropdown(包括TMP_Dropdown)下拉框当只有一个下拉值时&#xff0c;多次点击下拉框&#xff0c;并选择选项时&#xff0c; OnValueChange事件不响应 一、下拉框提供了一个【onValueChance】的事件接口 当下拉框值变化的时候&#xff0c;代表用户选择了新的值&#xff0c;于是执…

【高级篇】分布式缓存

分布式缓存 – 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xf…

计算机毕业论文内容参考|基于App的WiFi的网络定时开关的设计与实现

文章目录 导文文章重点前言课题内容、相关技术与方法介绍技术分析技术设计技术实现总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于App的WiFi的网络定时开关的设计与实现 文章重点 前言 随着智能化时代的到来,移动设备已经成为我们生活中不可或缺的一部分。…