单片机--第六章中断系统--例6-3学习

news2024/11/25 4:33:55

单片机--第六章中断系统--例6-3学习

同6-2图,要求:使用定时器T0中断实现流水灯操作,流水频率为每0.5s更替一次(假设单片机外接11.0592MHZ的晶振)。

这个代码实现的是流水灯的效果,即将多个 LED 灯依次点亮并在一定时间内熄灭。下面是整个程序的实现过程:

  1. 在 main 函数中,首先设置了定时器 TMOD 的值为 0x01,表示使用定时器 0 并采用工作方式 1,即 16 位定时器。

  2. 然后初始化了定时器 0 的高位和低位,使其每 0.05 秒产生一个中断,并且开启了总中断和定时器 0 的中断。

  3. while(1) 表示程序在这里无限循环,等待定时器产生中断。

  4. 当定时器产生中断后,会进入中断处理程序 T0_int()。在该中断处理程序中,首先 cnt 自增 1,当其等于10时,也就是经过了 10 次中断之后,也就是 0.05 * 10s = 0.5s 这段时间到了,就需要让流水灯更新,此时流水灯 led 向左移位一位,并将一个二进制的 1 加到最右边。继续判断 led 是否等于 0xFF,如果等于说明所有的 LED 灯都亮起来了,需要重新开始,此时将 led 设置成 0xFE,也就是最右边的灯灭了,其余灯亮起来了。

  5. 最后将更新后的流水灯 led 显示在 P0 引脚上,P0 是 8051 芯片的一个 I/O 引脚,通过程序控制其输出高低电平,就可以控制连接在该引脚上的 LED 灯的亮灭。重新设置 TH0 和 TL0 寄存器,使定时器继续计数,从而达到流水灯效果。

代码:

#include<reg51.h>

unsigned char cnt=0;//用于中断次数计数
unsigned char led=0xfe;	//初始化流水灯,即1111 1110	只有一个灯是点亮的

int main(void){
	TMOD=0x01; //16位定时方式,即方式1
	TH0=(65536-46083)/256;		//初始化T0的高8位
	TL0=(65536-46083)%256;		//初始化T0的低8位

	EA=1;
	ET0=1;	 //开中断
	TR0=1;	//启动T0工作

	while(1);	//等待中断
}

void T0_int(void) interrupt 1{
	cnt++;
	if(cnt==10)	//0.5s时间到了
	{
		cnt=0;//次数清除统计
		led=(led<<1)|1;//更新流水灯数据
		if(led==0xff)
		{
			led=0xfe;
		}
		P0=led;		//显示流水灯
	}

	TH0=(65536-46083)/256;		//初始化T0的高8位
	TL0=(65536-46083)%256;		//初始化T0的低8位

}

Ai改进:

这个代码已经是一个很简单的流水灯程序,但是还可以进一步改进。以下是一些可能的改进点:

  1. 减少中断次数的判断:在这个程序中,每次中断都会增加 cnt 的值,并且在 cnt 达到 10 的时候才会更新流水灯。我们可以将 cnt 的范围缩小一些,比如设置 cnt 的最大值为 4,这样可以每 0.2s 更新一次流水灯,也就是 LED 灯闪动的频率更快。而且,在更新流水灯时,我们可以使用位运算来代替除法和取模运算,这样可以减少 CPU 的负担。

  2. 显示流水灯的方式:在这个程序中,我们每次都是将流水灯的值赋给 P0 引脚,然后通过 P0 引脚控制 LED 灯的亮灭。但是这种方法有一个问题:如果 P0 引脚上有其他设备连接,可能会影响其它设备的工作,而且如果需要控制多个 LED 灯组成的矩阵,这种方法就不可行了。因此,我们可以考虑采用移位寄存器来控制 LED 灯的亮灭,这样不仅能够实现流水灯效果,而且可以有效地控制 LED 灯的数量和排列方式。

  3. 优化定时器的配置:在这个程序中,我们使用的是方式 1,即 16 位定时器。但是,在实际应用中,我们可以根据需要选择不同的定时器方式来适应不同的应用场景。比如,如果我们只需要 8 位定时器,那么可以使用方式 0;如果需要同时控制多个定时器,那么可以使用方式 2;如果需要高精度计时器,那么可以使用方式 3。

下面是改进后的代码:

#include <reg51.h>

sbit LED = P2 ^ 0;      // 用 P2.0 控制 LED

unsigned char led_group = 0x7f;     // 定义一个 8 位的 LED 灯组
unsigned char shift_register = 0x01;       // 初始化移位寄存器

void delay(unsigned int t)
{
    unsigned int i, j;
    for (i = 0; i < t; i++)
    {
        for (j = 0; j < 125; j++);      // 延时函数,每次循环大约延时 1ms
    }
}

void main()
{
    TMOD = 0x01;        // 设置定时器 0 的工作方式为 16 位定时器
    TH0 = 0xB1;         // 装载定时器初值,计算公式:65536 - (50000 / 12) = 44536,即 0xB1D0
    TL0 = 0xD0;
    ET0 = 1;        // 打开定时器 0 中断
    EA = 1;         // 打开总中断
    TR0 = 1;        // 启动定时器 0

    while (1)
    {
        shift_register <<= 1;       // 使移位寄存器向左移动一位
        if (shift_register == 0x00)     // 如果移位寄存器的值变成了 0,则将其重新设为 0x01
        {
            shift_register = 0x01;
        }
        led_group = ~shift_register;        // 根据移位寄存器的值,计算出 LED 灯组需要显示的值(取反)
        delay(5);       // 停留一段时间,防止 LED 灯过快闪烁,造成视觉疲劳
    }
}

void timer0() interrupt 1
{
    TH0 = 0xB1;     // 重新设置定时器初值
    TL0 = 0xD0;
    LED = ~LED;     // 每次定时器中断时将 LED 灯取反,达到闪烁的效果
}

改进后的程序采用移位寄存器控制 LED 灯的亮灭,而不是直接控制 I/O 引脚。程序还加入了一个延时函数,使 LED 灯的闪烁频率更慢,避免用户视觉疲劳。程序使用了定时器 0 产生中断,每次中断时将 LED 灯的状态取反,以达到闪烁效果。由于程序只需要控制一个 LED 灯,因此将其连接到了 P2.0 引脚上,而不是 P0 引脚上,这样可以避免影响其他设备的工作。


仿真:

 

 

 仿真视频;

第六章例6-3

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

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

相关文章

.net6 Program.cs 文件解析

Program.cs 是整个Web应用程序的入口文件&#xff0c;.NET6 用了极简单的风格搞定了很多事情。 Program.cs中首先注意的是&#xff1a; 1.builder.Services.AddXXX是用来添加服务的&#xff0c;builder是WebApplicationBuilder对象&#xff1b; 2.builder.Services.Configure&…

【C++】判断语句中对变量的合理定义

先总结一下这篇博客的核心&#xff1a; C中&#xff0c;不允许重复定义同一个变量&#xff0c;否则保留的初次定义的值&#xff08;虽然编译能通过&#xff09;涉及到判断的多分支时&#xff0c;应在进判断分支之前定义好变量&#xff0c;如果在分支中分别定义会出现编译错误&…

基于HashData的湖仓一体解决方案的探索与实践

2023年4月7日&#xff0c;由中国DBA联盟&#xff08;ACDU&#xff09;和墨天轮社区联合主办的第十二届『数据技术嘉年华』(DTC 2023) 在北京新云南皇冠假日酒店盛大开启。HashData资深解决方案架构师李俊在4月8号专题会场6-“融合应用&#xff1a;湖仓技术创新”上发表了《基于…

从零开始学JAVA(05):面向对象编程--04

一、StringBuilder StringBuilder是一个非常方便的用来处理和拼接字符串的类&#xff0c;它和string不同的是&#xff0c;它是可变的 package com.lcy.learn;public class LearnStringBuilder {public static void main(String[] args) {// StringBuilder首先是可变的// 而且对…

牛客网算法八股刷题系列(九)训练过程损失函数不下降问题

牛客网算法八股刷题系列——训练过程损失函数不下降问题题目描述正确答案&#xff1a;D\mathcal DD题目解析延伸&#xff1a;训练过程损失函数不下降的其他情况题目描述 在训练神经网络时&#xff0c;损失函数(Loss)(\text{Loss})(Loss)在最初的几个Epoch\text{Epoch}Epoch时没…

delphi 实现Ribbon风格的窗体

随着office2007的兴起&#xff0c;微软让我们看到了Ribbon风格的窗体&#xff0c;现在很多软件也都开始使用Ribbon风格。 那么我们如果要自己开发&#xff0c;应当怎么做呢&#xff1f;本文就是为大家解开这个疑团的。 首先&#xff0c;Delphi本身并没有Ribbon风格的窗口可以直…

epoll为什么用红黑树?

网络编程的时候有没有碰到过 Socket 对象&#xff1f;或者在配置代理的时候&#xff0c;有没有碰到配置 Socket 地址&#xff1f;当你看到服务端 Socket、客户端 Socket 等名词时&#xff0c;是否可以明确理解这些概念&#xff1f; 学习好这些知识有一条主线&#xff0c;就是抓…

Dockerfile构建镜像缓慢解决方案总结

分几种不同的情况&#xff0c;不断更新中 1、Dockerfile apk add 下载更新软件时&#xff0c;比较慢&#xff0c;如何解决 例子如下&#xff1a; 更好一下仓库源 RUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories或者改成科大的镜像 RUN…

android核心架构Framework组件介绍

作为一个android开发者&#xff0c;核心架构是必须要了解的。只有了解每个核心层的作用&#xff0c;才能更深入的理解和学习。本篇主要讲解Java Framework层核心代码流程。 文章目录一&#xff0c;Android系统架构1.System Apps2.Java Framework3.系统运行库层4.硬件抽象层&…

Matplotlib库的简单用法

Matplotlib库的简单用法 Matplotlib是python科学计算中最基础、最重要的绘图库&#xff0c;是Python中最流行的数据可视化库之一&#xff0c;它提供了大量的绘图函数和工具&#xff0c;可以让用户创建各种类型的图表和图形&#xff0c;一般使用matpltlib完全可以满足我们绘图需…

“成功学大师”杨涛鸣被抓

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 4月15日&#xff0c;号称帮助一百多位草根开上劳斯莱斯&#xff0c;“成功学大师”杨涛鸣机其团队30多人已被刑事拘留&#xff0c;培训课程涉嫌精神传销&#xff0c;警方以诈骗案进行立案调查。 …

基于4412的dm9000驱动移植

1 概述 以太网高速稳定的特性比Wifi无线传输有一定的优势&#xff0c;当无线传输无法满足一些智能设备&#xff0c;需要开发设计以太网模块。Linux支持以太网系统&#xff0c;结合4412开发板&#xff0c;重点学习dm9000驱动的设计与实现。 2 硬件资源分析 2.1 4412开发板以太网…

【Python】Python中的列表,元组,字典

文章目录列表创建列表获取元素修改元素添加元素查找元素删除元素列表拼接遍历列表切片操作元组创建元组元组中的操作字典创建字典添加/修改元素删除元素查找字典的遍历合法的key类型列表 列表是一种批量保存数据的方式&#xff0c;列表使用[]表示 创建列表 创建两个空列表 …

nginx优化及配置

nginx隐藏版本号 查看方法 浏览器F12 看network头部看server curl -i 192.168.232.7 获取头部&#xff08;查版本号&#xff09; 配置文件改 添加server_tokens off 改源码 cd /src/core vim nginx.h 修改 修改的IIS为window常用的软件服务 重新编译安装 cd nginx_1.2…

【C++】while 循环应用案例 - 猜数字游戏

目录 1、缘起 2、案例描述 3、代码 4、相关知识点 4.1、rand() 函数 4.2、srand() 函数 5、总结 1、缘起 猜数字游戏是一种简单而又有趣的游戏&#xff0c;在这个游戏中&#xff0c;计算机会生成一个随机数字&#xff0c;玩家需要通过不断猜测来猜出这个数字。在本篇博…

使用docker搭建lnmp环境+redis服务

lnmp搭建过程&#xff0c;前文已经写了传送门&#xff0c;本文主要写一下运行redis容器和php-fpm容器内安装redis扩展 redis 1.创建宿主机配置和数据文件夹 [rootlocalhost ~] mkdir -p /lnmp/redis/{data,conf}2.放置/lnmp/redis/conf/redis.conf文件 点我下载 3.启动容器 …

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

最近在学习边缘计算要用到kubeedge&#xff0c;安装了好多次总会遇到各种各样的问题&#xff0c;因此在这里一一列出&#xff0c;以方便下次安装。则里面可能出错的地方太多&#xff0c;如果有问题&#xff0c;请私信联系。 一、环境准备 节点IP环境软件云端节点172.23.70.23…

Python|矿产卫片Excel经纬度坐标数据转换为shp点数据——OGR库实现

1.实验需求 基于Excel表格里面的经纬度坐标数据,自动生成点shp矢量文件,并添加属性信息。 2.编程思路详解 ①使用Pandas库读取原始矿产图斑列表表格; xlsx_path = uC:\\Users\\YaoJun\\Desktop\\矿产图斑列表.xlsx #sheet_name默认为0,即读取第一个sheet的数据 df = pd.…

TPM管理工作应该如何开展?

在制造行业&#xff0c;Total Productive Maintenance&#xff08;TPM&#xff09;管理被广泛认为是提高生产效率和设备可靠性的有效方式。然而&#xff0c;实施TPM管理需要深入的专业知识和经验。本文将探讨如何开展TPM管理工作&#xff0c;以确保制造企业的生产效率和设备可靠…

2023-Python实现烯牛数据采集

文章目录&#x1f449;1、目标网址&#x1f449;2、接口分析&#x1f449;3、代码实现【JS 逆向百例】 1/100 学习记录&#xff1a;哈喽~ 前面我们接触了一些JS逆向的数据获取&#xff0c;如果前面的百度&#xff0c;有道翻译和正方教务系统的登录加密你已掌握&#xff0c;说明…