原理图:
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;
}
}
原理图:
振动传感器引脚: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_();
原理图:
蜂鸣器引脚: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; //标志位翻转
}
}
}
}
工作原理:
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制,程序连续不停地在不同口送入脉冲信号,即可使步进电机旋转。
换相:通电换相这一过程称为脉冲分配,严格遵循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 !?