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

news2024/9/25 11:21:25

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));
		else
		   StartMotor(-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.coloradmin.cn/o/1014055.html

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

相关文章

Android 官方屏幕适配之ScreenMatch

背景&#xff1a; Android 项目的一个app需要适配手机平板&#xff0c;为了一套UI和可以适配2个不同屏幕&#xff0c;记录一个适配的技巧&#xff1a; 前提&#xff0c;使用这个框架&#xff1a;GitHub - wildma/ScreenAdaptation: :fire:一种非常好用的 Android 屏幕适配——…

#循循渐进学51单片机#c语言基础和流水灯实现#not.3

1、熟练掌握二进制、十进制和十六进制的转换方法。 多少进制就是多少之间相加&#xff0c;比如十六进制就是十六一次一加&#xff1b;二进制转化十六进制&#xff0c;分成四个一组。 2、C语言变量类型与取值范围&#xff0c;for、while等基本语句的用法。 for、while等基本语句…

基于Y向连贯性算法的多边形扫描线生成(适用于凸多边形和凹多边形)【原理+java实现】

问题介绍 给定一个多边形&#xff0c;可能是凸多边形&#xff0c;也可能是凹多边形&#xff0c;现需要生成一系列线条将多边形描述出来&#xff0c;示例如下图 原始方法 遇到这个问题&#xff0c;大家首先想到的方法可能是&#xff1a;使用一系列的竖线来和多边形进行相交&…

Java入坑之语法糖

一、for和for-each 1.1for和for-each概念 for 循环是一种常用的循环结构&#xff0c;它可以通过一个变量&#xff08;通常是 i&#xff09;来控制循环的次数和范围。for 循环的语法格式如下&#xff1a; for (初始化; 布尔表达式; 更新) {//代码语句 }for-each 循环是 Java …

数据库系统的三级模式和二级映射

数据库系统的三级模式结构基本概念模式&#xff08;schema&#xff09;外模式&#xff08;external schema&#xff09;内模式 (Internal Schema&#xff09; 数据库系统的二级映射外模式/模式映象模式/内模式映象 总结感谢 &#x1f496; 数据库系统的三级模式结构 数据库系统…

Web安全与攻防

Web安全概述 在Internet大众化及Web技术飞速演变的今天&#xff0c;在线安全所面临的挑战日益严峻。伴随着在线信息和服务的可用性的提升&#xff0c;以及基于Web的攻击和破坏的增长&#xff0c;安全风险达到了前所未有的高度。Web安全可以从以下三个方面进行考虑&#xff1a;…

Matlab图像处理-从RGB转换为HSV

从RGB转换为HSV HSV彩色系统基于圆柱坐标系。从RGB转换为HSV需要开发将(笛卡儿坐标系中的)RGB值映射到圆柱坐标系的公式。多数计算机图形学教材中已详细推导了这一公式&#xff0c;故此处从略。 从RGB转换为HSV的MATLAB函数是rgb2hsv&#xff0c;其语法为&#xff1a; hsv_imag…

商业综合体AI+视频安防监控与智能监管解决方案

一、方案背景 商业综合体需要具备更好的品质和环境才能吸引更多客流&#xff0c;如何有效地进行内部管理、外部引流&#xff0c;是综合体管理人员思考的重点。 传统的视频监控需要靠人盯牢屏幕或者发生报警后通过查看录像&#xff0c;才能找到意外事件相关人员与起因&#xf…

VMware启用共享文件夹

1. 启用 编辑虚拟机设置 - 选项 - 共享文件夹 - 总是启用 - 添加 2. 启动Ubuntu查看 正常情况/mnt目录会出现文件夹hgfs 如果不存在&#xff0c;可参考 这篇文章 操作 如果安装VMWare tools后/mnt中有hgfs但没共享文件&#xff0c;可参考 这篇文章 如果出现 mount: unkno…

Mac 安装软件各种报错解决方案

Mac 安装软件各种报错解决方案 文章目录 Mac 安装软件各种报错解决方案一. 打开允许“允许任何来源”二. 无法打开"xxx"&#xff0c;因为它不是从App Store下载三. 无法打开"xxx"&#xff0c;因为 Apple无法检查其是否包含恶意软件。四. "xxx"已…

执行 git remote add github git@github.com:xxxx/testGit.git时,git内部做了啥?

git remote add 往 .git/config 中写入了一个叫 [remote "origin"] 配置 url → 表示该远程名称对应的远程仓库地址fetch 参数分为两部分&#xff0c;以冒号 : 进行分割冒号左边 ☞ 本地仓库文件夹冒号右边 ☞ 远程仓库在本地的副本文件夹 ☞ 往里面添加数据的意思 可…

pgzrun 拼图游戏制作过程详解(6,7)

6. 检查拼图完成 初始化标记成功的变量Is_Win Is_WinFalse 当鼠标点击小拼图时&#xff0c;判断所有小拼图是否都在正确的位置&#xff0c;并更新Is_Win。 def on_mouse_down(pos,button): # 当鼠标被点击时# 略is_win Truefor i in range(6):for j in range(4):Square S…

今天早上在使用Layui的时候,排查出了自己的BUG

昨天使用的时候&#xff0c;一直渲染不出来&#xff0c;今天&#xff0c;翻看了文档找到了问题特意&#xff0c;留了一个&#xff0c;field写成了filed&#xff0c;辛辛苦找了半天 ... /委屈差点错怪了Layui

【Transformer系列】深入浅出理解Tokenization分词技术

一、参考资料 NLP技术中的Tokenization是什么&#xff1f;核心任务是什么&#xff1f; 二、Tokenization相关介绍 1. Tokenization的概念 NLP技术中Tokenization被称作是“word segmentation”&#xff0c;直译为分词。具体来说&#xff0c;分词是NLP的基础任务&#xff0c…

如何优化你的Vue.js应用以获得最佳性能

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

C++版本的OpenCV实现二维图像的卷积定理(通过傅里叶变换实现二维图像的卷积过程,附代码!!)

C版本的OpenCV库实现二维图像的卷积定理过程详解 前言一、卷积定理简单介绍二、不同卷积过程对应的傅里叶变换过程1、“Same”卷积2、“Full”卷积3、“Valid”卷积 三、基于OpenCV库实现的二维图像卷积定理四、基于FFTW库实现的二维图像卷积定理五、总结与讨论 前言 工作中用…

基于matlab实现的弹簧振动系统模型程序(动态模型)

完整代码&#xff1a; clear all; %System data m1.0; zeta0.01; omega01.0; Dt1.0; f01.0; x00.0; dotx00.0; xmaxsqrt(x0^2(dotx0/omega0)^2)min([0.5*abs(f0)*Dt/(m*omega0) f0/omega0^2]); omegadomega0*sqrt(1-zeta^2); dt00.1*pi/omega0; nstep500; a0.70; b0.…

Python爬虫(二十)_动态爬取影评信息

本案例介绍从JavaScript中采集加载的数据。更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import time import json#数据下载器 class HtmlDownloader(object):def download(self, url, paramsNone):if url is None:return Noneuser_agent …

Echarts 雷达图的详细配置过程

文章目录 雷达图 简介配置步骤简易示例 雷达图 简介 Echarts雷达图是一种常用的数据可视化图表类型&#xff0c;用于展示多个维度的数据在同一坐标系下的分布情况。雷达图通过不同的坐标轴表示不同的维度&#xff0c;数据点的位置表示了各个维度的数值大小。 Echarts雷达图的…

035:vue项目中 radio和checkbox美化方法

第035个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…