#循循渐进学51单片机#步进电机与蜂鸣器#not.8

1、能够理解清楚单片机IO口的结构。

2)t1相当于PnP三级管,t2相当于npn三极管

3) 强推挽io具有较强的驱动能力,电流输出能力很强。


2、能够看懂上下拉电阻的电路应用,并且熟练使用上下拉电阻。


3、理解28BYJ-48减速步进电机的工作原理。


4、能够熟练编写步进电机正反转任意角度的程序。

#include <REGX52.H>
sbit MC0 = P1^0;
sbit MC1 = P1^1;
sbit MC2 = P1^2;
sbit MC3 = P1^3;
sbit MC4 = P1^4;sbit KeyIn1 = P2^4;
sbit KeyIn2 = P2^5;
sbit KeyIn3 = P2^6;
sbit KeyIn4 = P2^7;sbit KeyOut1 = P2^3;
sbit KeyOut2 = P2^2;
sbit KeyOut3 = P2^1;
sbit KeyOut4 = P2^0;static unsigned long a;
unsigned char KeySta[4][4] = { {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}
};
unsigned char code KeyCodeMap[4][4] = { { 0x31, 0x32, 0x33, 0x26 }, { 0x34, 0x35, 0x36, 0x25 }, { 0x37, 0x38, 0x39, 0x28 }, { 0x30, 0x1B, 0x0D, 0x27 }  
};
void KeyDriver();
void main()
{EA = 1;       TMOD = 0x01;  TH0  = 0xFC;  TL0  = 0x67;ET0  = 1;     TR0  = 1;     while(1)KeyDriver();
}
void StartMotor(signed long angle)
{EA = 0;a = angle*4076/360;EA = 1;
}
void StopMotor()
{EA = 0;a = 0;EA = 1;}
void KeyAction(unsigned char keycode)
{bit arr;if(keycode >= 0x30 && keycode <= 0x39){if(arr == 0)	StartMotor(360*(int)(keycode-0x30));elseStartMotor(-360*(int)(keycode-0x30));}else if(keycode == 0x26){arr = 0;}else if(keycode == 0x28){arr = 1;}else if (keycode == 0x25) {StartMotor(90);}else if (keycode == 0x27)  {StartMotor(-90);}else if (keycode == 0x1B) {StopMotor();}}
void KeyDriver()
{unsigned char i, j;static unsigned char backup[4][4] = {  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}};for (i=0; i<4; i++)  {for (j=0; j<4; j++){if (backup[i][j] != KeySta[i][j])  {if (backup[i][j] != 0)           {KeyAction(KeyCodeMap[i][j]); }backup[i][j] = KeySta[i][j];     }}}
}void KeyScan()
{static	unsigned char add = 0;unsigned char j ;static unsigned char keybuf[4][4] = {  {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}};keybuf[add][0] = (keybuf[add][0] << 1) | KeyIn1;keybuf[add][1] = (keybuf[add][1] << 1) | KeyIn2;keybuf[add][2] = (keybuf[add][2] << 1) | KeyIn3;keybuf[add][3] = (keybuf[add][3] << 1) | KeyIn4;for(j = 0;j <4;j++){if( (keybuf[add][j] & 0x0F) == 0x00 ){KeySta[add][j] = 0;}else if((keybuf[add][j] & 0x0F) == 0x0f){KeySta[add][j] = 1;}}add++;add = add & 0x03;switch(add){case 0:KeyOut4 = 1;KeyOut1 = 0;break;case 1:KeyOut1 = 1;KeyOut2 = 0;break;case 2:KeyOut2 = 1;KeyOut3 = 0;break;case 3:KeyOut3 = 1;KeyOut4 = 0;break;default:break;}
}void TurnMotor()
{static unsigned char index = 0;  static unsigned char tmp = 0;  unsigned char code BeatCode[8] = {  0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6};if(a != 0){if(a > 0){index++;index =  index & 0x07;a--;	}else{index--;index =  index & 0x07;a++;	}tmp = P1;tmp =  tmp & 0xF0;tmp = tmp | BeatCode[index];P1  = tmp;}else {P1 = P1 | 0x0F;}
}
void InterruptTimer0() interrupt 1
{bit biv = 0;TH0 = 0xFC;  TL0 = 0x67;   KeyScan();  biv = ~biv;if (biv == 1){TurnMotor();}
}


5、学会蜂鸣器发声的方法。

#include <REGX52.H>
sbit BUZZ = P1^6;
void openbuzz(unsigned char arr);
void stopbuzz();
unsigned int TORH;
unsigned int TORL;
void main()
{unsigned int i;EA = 1;TMOD = 0x01;while(1){openbuzz(4000);for(i = 0;i <= 40000;i++);stopbuzz();for(i = 0;i <= 20000;i++);openbuzz(1000);for(i = 0;i <= 40000;i++);stopbuzz();for(i = 0;i <= 20000;i++);}
}
void openbuzz(unsigned char arr)
{unsigned int reload;reload = (65536)- (11059200/12)/(arr*2);TORH = (unsigned int)(reload >> 8);TORL = (unsigned int)reload;TH0  = 0xFF;  TL0  = 0xFE;ET0 = 1;TR0 = 1;
}
void stopbuzz()
{ET0 = 0;TR0 = 0;
}
void InterruptTimer0() interrupt 1
{TH0 = TORH;  TL0 = TORL;BUZZ = ~BUZZ; 
}

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

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

相关文章

链表oj题 链表与LinkedList 栈的概念 队列的概念 树和二叉树

第 1 题&#xff08;编程题&#xff09; 题目名称&#xff1a; 求环的入口点 题目内容&#xff1a; 求环的入口点https://leetcode-cn.com/problems/linked-list-cycle-ii/description/ 第 2 题&#xff08;编程题&#xff09; 题目名称&#xff1a; 判断链表带环 题目…

软件设计模式(二):工厂、门面、调停者和装饰器模式

前言 在这篇文章中&#xff0c;荔枝将会梳理软件设计模式中的四种&#xff1a;工厂模式、Facade模式、Mediator模式和装饰器Decorator模式。其中比较重要的就是工厂模式和装饰器模式&#xff0c;工厂模式在开发中使用的频数比较高。希望荔枝的这篇文章能讲清楚哈哈哈哈&#xf…

Ceph入门到精通-ceph对于长文件名如何处理

RADOS object with short name 上一篇博文&#xff0c;我们将介绍了对象相关的数据结构ghobject_t&#xff0c;以及对象在底层文件系统存储的文件名&#xff0c;以及如何从文件名对应到 ghobject_t对象。 映射关系如下图所示&#xff1a; 这里面有一个漏洞&#xff0c;即obje…

【栈与队列面试题】有效的括号(动图演示)

leetcode20.括号匹配问题 前言&#xff1a; &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上栈与队列的面试OJ题目 目录 leetcode20.括号匹配问题 1.问题描…

华硕电脑怎么录屏?分享实用录制经验!

“华硕电脑怎么录屏呀&#xff0c;刚买的笔记本电脑&#xff0c;是华硕的&#xff0c;自我感觉挺好用的&#xff0c;但是不知道怎么录屏&#xff0c;最近刚好要录一个教程&#xff0c;怎么都找不到在哪里录制&#xff0c;有人能教教我吗&#xff1f;” 随着电脑技术的不断发展…

低代码开源项目整理

低代码是基于可视化和模型驱动理念&#xff0c;结合云原生与多端体验技术&#xff0c;它能够在多数业务场景下实现大幅度的提效降本&#xff0c;为专业开发者提供了一种全新的高生产力开发范式。下面就来分享几个值得学习和使用的前端低代码开源项目&#xff0c;更深入地了解什…

如何实现微服务

一、问题拆解 1.1、客户端如何访问这些服务 原来的Monolithic方式开发&#xff0c;所有的服务都是本地的&#xff0c;UI可以直接调用&#xff1b;现在按功能拆分成独立的服务&#xff0c;跑在独立的虚拟机上的Java进程了。客户端UI如何访问他的&#xff1f; 后台有N个服务&a…

CSS - 鼠标移入整行高亮显示,适用于会员套餐各参数对比页面(display: table,div 转表格形式)

效果图 可根据基础示例和进阶示例&#xff0c;复制进行改造样式。 如下图所示&#xff0c;本文提供 2 个示例。 基础示例 找个 HTML 页面&#xff0c;一键复制运行。 <body><h1 style"text-align: center;">基础示例</h1><section class"…

初试小程序轮播组件

文章目录 一、轮播组件&#xff08;一&#xff09;swiper组件1、功能描述2、属性说明 &#xff08;二&#xff09;swiper-item组件1、功能描述2、属性说明 &#xff08;三&#xff09;轮播组件使用基本语法 二、案例演示&#xff08;一&#xff09;运行效果&#xff08;二&…

JavaEE初阶(5)多线程案例(定时器、标准库中的定时器、实现定时器、线程池、标准库中的线程池、实现线程池)

接上次博客&#xff1a;JavaEE初阶&#xff08;4&#xff09;&#xff08;线程的状态、线程安全、synchronized、volatile、wait 和 notify、多线程的代码案例&#xff1a;单例模式——饿汉懒汉、阻塞队列&#xff09;_di-Dora的博客-CSDN博客 目录 多线程案例 定时器 标准…

9.19-21,openEuler与您相约2023欧洲开源峰会

2023年9月19日-21日&#xff0c;openEuler将参加在西班牙毕尔巴鄂举办的 OSSUMMIT 2023&#xff08;Open Source Summit Europe 2023&#xff09;&#xff0c;这是openEuler继去年正式亮相后的第二次全面参加该峰会。 Open Source Summit Europe是由Linux基金会主办&#xff0…

verdi dump状态机的波形时直接显示状态名

前段时间看到别人用verdi看状态机的波形时&#xff0c;可以显示定义的状态参数&#xff0c;觉得很有意思&#xff0c;特地学习了一下 通常拉出状态机信号的波形是下面这样的 这种信号&#xff0c;我们要想知道每个数值代表的状态&#xff0c;还需要跟定义的parameter比对 像这…

【Flowable】任务监听器(五)

前言 之前有需要使用到Flowable&#xff0c;鉴于网上的资料不是很多也不是很全也是捣鼓了半天&#xff0c;因此争取能在这里简单分享一下经验&#xff0c;帮助有需要的朋友&#xff0c;也非常欢迎大家指出不足的地方。 一、监听器 在Flowable中&#xff0c;我们可以使用监听…

Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅

一、项目概述 欢迎来到创意之源&#xff01;我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界。通过使用Android Studio&#xff0c;我们实现了绘制贝塞尔曲线的功能&#xff0c;让你能够轻松创作出令人惊叹的艺术作品。不论你是热爱绘画的大学生还是渴望学习…

elementui el-dialog 动态生成多个,点击按钮打开对应的 dialog

业务场景&#xff1a; 根据后端返回的数据&#xff0c;动态生成表单&#xff0c;返回的数据中会有表单字段的类型&#xff0c;如果单选、多选、富文本&#xff0c;其它的属性还好说&#xff0c;重点说在富文本&#xff0c;因为我想通过 dialog 弹窗的方式&#xff0c;进行富文…

Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例

Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例 点击封面跳转到Unity国际版下载页面 简介 在Unity中&#xff0c;性能优化是游戏开发过程中非常重要的一环。其中&#xff0c;Shader的优化对于游戏的性能提升起着至关重要的作用。…

VS2015+opencv 3.4.6开发环境

VS2015+opencv 3.4.6开发环境 一、安装包下载二、安装过程三、VS环境配置四、测试一、安装包下载 这里提供两种下载方法:   1. opencv官网   2. csdn资源下载 二、安装过程 2.1 下载opencv-3.4.6 安装包 2.2 双击开始安装,选择要安装目录,点击Extract。  2.3 等待解…

基于SSM的化妆品配方及工艺管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

69、Spring Data JPA 的 @Query查询 和 命名查询

Query查询 和 命名查询的区别&#xff1a; 命名查询与直接用Query来定义查询的本质是一样&#xff0c;只不过它们定义SQL或JPQL语句的位置不同。 直接用 Query来定义查询 &#xff0c;写SQL或JPQL语句的位置在 DAO 组件&#xff0c; 命名查询&#xff0c;写SQL或JPQL语句的位置…

神经网络与强化学习:揭示AI的超能力

文章目录 神经网络&#xff1a;模拟人脑的工具强化学习&#xff1a;通过试错学习结合神经网络和强化学习价值网络策略网络结合训练 应用领域游戏机器人控制金融交易 未来趋势自动化和自主系统个性化和自适应系统跨学科研究 结论 &#x1f389;欢迎来到AIGC人工智能专栏~神经网络…