#循循渐进学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,一经查实,立即删除!

相关文章

vue路由-两个树形结构数据-递归处理方法

1.vue静态路由 const dynamicRoutes [{path: /,name: /,component: () > import(//layout/index.vue),redirect: /home,meta: {isKeepAlive: true,},children: [{path: /home,name: home,component: () > import(//views/home/index.vue),meta: {title: 首页,isLink: ,…

链表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;二&…

idea搭建项目找不到Tomcat

idea搭建项目找不到Tomcat_idea没有tomcat配置项_ZYRL的博客-CSDN博客

【Spring事务底层实现原理】

Transactional注解 Spring使用了TransactionInterceptor拦截器&#xff0c;该拦截器主要负责事务的管理&#xff0c;包括开启、提交、回滚等操作。当在方法上添加Transactional注解时&#xff0c;Spring会在AOP框架中对该方法进行拦截&#xff0c;TransactionInterceptor会在该…

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

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

[JAVAee]Linux上的javax.mail报错

我们把在window写的项目部署到Linux上的Tomcat时,如果发现使用不了了,该如何找到错误呢?找到报错的地方在哪呢? 在Linux环境下来到Tomcat目录下的logs目录,输入: tail -f catalina.out -n 500 tail 就是把文件的末尾几行读取到终端上,并会持续刷新 -f 循环读取 catalina.ou…

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…

【css面试题】实现2栏布局 右侧自适应; 3栏布局 中间自适应

2栏布局 右侧自适应 flex grid table float <style >body{height: 400px;}.son1{width: 20%;height: 100%;float: left;}.son2{margin-left: 20%;height: 100%;}</style> <body> <div class"son1" style"background-color: #d2…

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

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

[DB]数据库--lowdb

[DB]数据库--lowdb lowdb基本应用获取数据数据变更写入文件 lodash的使用获取数据lodash方法使用数据变更写入文件 lowdb lowdb ,是一个基于文件存储的非关系型数据库 基于loadsh的轻量级数据库 可用于在json中存储数据&#xff0c;大小一般为0~200M的json文件 方便简单的数…

棒球教学知识架构·棒球1号位

棒球教学知识架构 1. 棒球运动的基本认知 棒球运动的起源和发展历程 棒球运动起源于19世纪中叶的美国&#xff0c;最初是一种儿童游戏&#xff0c;使用木棒和石头或木头制成的球进行比赛。后来&#xff0c;人们开始使用橡胶球和棒子&#xff0c;并规定了比赛规则和场地标准&a…

【Flowable】任务监听器(五)

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