单片机学习笔记 —— 单片机常用器件的测试

一、霍尔传感器

原理图
单片机学习笔记 —— 单片机常用器件的测试_第1张图片
HALL引脚:P1.2
原理:当感应到磁场时,HALL引脚会产生一个高电平

测试HAL传感器

初始化:设置推挽输出和相关引脚电平

sbit sbtLedSel = P2 ^ 3;   	//led灯和数码管选择
sbit sbtHall = P1 ^ 2;     	//Hall传感器引脚

uchar ucLed;           	//用于接受Hall电平

void Init()
{
    P2M1 = 0x00;		//设置推挽输出
    P2M0 = 0xff;
    P0M1 = 0x00;
    P0M0 = 0xff;
    P1M1 = 0x00;
    P1M0 = 0xff;
    sbtLedSel = 1;		//选择led
}

主函数:将HALL引脚的值传递到发光二极管阳极

void main()
{
    Init();
    while( 1 )
    {
        ucLed = sbtHall;
        P0 = ucLed;
    }
}


二、振动传感器

原理图
单片机学习笔记 —— 单片机常用器件的测试_第2张图片
振动传感器引脚:P2.4
原理:当振动产生时,振动传感器内的细铁丝接触,电路接通,P2.4引脚接地,得到一个低电平

测试振动传感器
初始化:设置推挽输出

#define uchar unsigned char
#define uint unsigned int

uint value;
sbit sbtVib = P2 ^ 4;     //vibrate_pin
sbit sbtLedSel = P2 ^ 3;
void Init()
{
    P0M0 = 0xff;
    P0M1 = 0x00;
    P2M0 = 0x08;    //P2.3¿ÚÍÆÍìÊä³ö
    P2M1 = 0x00;
    sbtLedSel = 1;
}

主函数:判断振动发生,点亮led灯

void main()
{
    uchar i = 0;
    Init();
    sbtVib = 1;
    P0 = 0x00;                  //led灯初始化为暗的
    while( 1 )
    {
        if( sbtVib == 0 )      //若振动产生,得到一个低电平
        {
            i = 8;
			value = 0xff;
            while ( i-- )
            {
                P0 = (~value);
                Delay40ms();			//延时函数,由软件生成
				value = value << 1;		//左移
            }
        }
        else P0 = 0x00;
    }
}

注意,这里使用的延时函数含有-nop_()函数,需要包含头文件:

#include       //_nop_();


三、蜂鸣器

原理图
单片机学习笔记 —— 单片机常用器件的测试_第3张图片
蜂鸣器引脚:Bee = P3.4
KEY1引脚:KEY1 = P3.2

测试蜂鸣器
初始化:设置推挽输出,设置中断

void init()
{
    P3M1 = 0x00;
    P3M0 = 0x10;	//设置P3.4推挽输出

    TMOD = 0x00;
    TH0 = 0xff;		//设置定时器初始值
    TL0 = 0x03;
    EA = 1;			//打开总中断
    ET0 = 1;		//开启T0计时器中断
    TR0 = 1;		//开启计时器

    btBeepFlag = 0;	//标志位设为0
    P0 = 0x00;		//关闭P0端口
    sbtBeep = 0;	//蜂鸣器引脚设为0,保护蜂鸣器
}

中断函数:检测标志位是否为1,为1则发声

void T0_Process() interrupt 1
{
    if( btBeepFlag )
    {
        sbtBeep = ~sbtBeep;            //开始发声
    }
    else
    {
        sbtBeep = 0;                  //蹄子发声
    }
}

主函数:通过按键key1控制标志位

void main()
{
    init();
    while( 1 )
    {
        if( sbtKey1 == 0 )
        {
            delay( 10 );			//延时消抖
            if( sbtKey1 == 0 )
            {
                while( !sbtKey1 );
                btBeepFlag = ~btBeepFlag;	//标志位翻转
            }
        }
    }
}


四、步进电机

原理图
单片机学习笔记 —— 单片机常用器件的测试_第4张图片
四个引脚:Bee = P4.1 - P4.4

工作原理
  步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制,程序连续不停地在不同口送入脉冲信号,即可使步进电机旋转。

换相:通电换相这一过程称为脉冲分配,严格遵循a-b-c-d的顺序换相
角度:脉冲个数越多,转过的角度越大
转速:脉冲信号的频率越高,转速越快
转向:按正序换相通电,电机正转;按反序通电换相,电机反转。

控制程序
初始化:设置IO口、设置推挽输出、定时器和中断

sbit s1 =P4^1;												    //步进电机IO口
sbit s2 =P4^2;
sbit s3 =P4^3;
sbit s4 =P4^4;

void init_sys()			  
{																//设置推挽输出
    P4M0=0xff;
	P4M1=0x00;
	P4  =0x00;												    //P4口设置低电平,避免复位时影响电机

	TMOD = 0x00;		                                        //使用T0
	TH0  = (65536-10000)/256;	                                //定时10mss
	TL0  = (65536-10000)%256;
	TCON = 0X10;		                                        //TR0=0,计时器T0开始计时
	IE   = 0x82;				                                //开启CPU中断和T0中断
}

中断函数:为IO口分配脉冲序列,注意原理图中IO口后面有反相器

void time0() interrupt 1
{
	 switch(i++)												//控制电机IO口电平
	 {
	 case 1: s1=1;s2=0;s3=0;s4=0;break;
	 case 2: s1=0;s2=1;s3=0;s4=0;break;
	 case 3: s1=0;s2=0;s3=1;s4=0;break;
	 case 4: s1=0;s2=0;s3=0;s4=1;break;
	 }
	 if(i==5)
	 i=1;
}

主函数:调用初始化函数,空循环

void main()
{
	init_sys();
	while(1) {}
}

如果我们需要控制电机的转动方向,可以修改中断函数中的switch语句,修改case对应的结果;
如果我们需要控制点击的转动速度,可以修改初始化中T0的初始装载的数值,从而修改脉冲频率;


第六篇学习笔记完结 cheers !?

你可能感兴趣的:(单片机)