HMC1022电子指南针模块51代码IIC
MC51 AVR MCU 的I2C、SPI、232、485、IO的使用
MC51\AVR MCU 的I2C\SPI\232\485\IO的使用首先:AVR的IO口操作玉日信有三个寄存器:DDR xn PORTxn PINxnDD Rxn(方向选择):1为输出0为输入PORTxn:在引脚为输入的前提下,为1上啦电阻使能0不使能在引脚为输出的前提下,为1输出高电平0输出低电平PINxn:通过读取PINxn来得到该引脚的状态,他不会所存状态,他读到的只是当前管脚的电平状态。
注意:xn是 A B CD..口管脚设置PA口的第一个脚为输出:DDRA|=0x01;51单片机的IO口操作比如现让P1.7为输出,其余为输入,P2=0x0111 1111B,也就是0x7F。
=============================================================一、模拟SPI的使用时钟是100KHZ这样延时3微妙一周期6微妙这样最大传输速度为输入时钟频率的1/8CS输出低电平→MOSI与1向与→CLK输出一个脉冲→MOSI的数据右移动一位与1相与→ CLK输出一个脉冲……输出够8位(一个字节了)再下一个字节或者停止→停止之后CS拉高CS输出低电平→ CLK输出一个脉冲→MISO管脚取数据→ CLK输出一个脉冲→MISO管脚取数据→ CLK输出一个脉冲……输入够8位(一个字节了)再下一个字节或者停止→停止之后CS拉高3、一个主机和多个从器件的通信系统。
(2)3个既可以当做主机也可以当做从机的单片机组成的系统。
特点:SPI是一位一位发送的,并允许暂停,发多少位都行,不用寻址操作AVR有SPI功能接口的单片机SPI操作时钟是最大1/4 FOSC 最小1/128 FOSC把数据写到数据寄存器→CS拉低(启动一次通信)→再把数据写到数据寄存器→CS拉低(启动一次通信)→CS拉高结束通信注意:是时钟的上升沿还是下降沿有效时可以设置的---CPHA为1上升沿采样数据,为0下降沿采样数据,传输结束了SPIF会置位高位还是地位先发送是可以设置的----DORD为1地位先发送为0高位先发送数据寄存器SPFR是可读可写的—写数据进去就启动数据传输,读数据将读取数据的接收缓存区在主模式下,时钟信号的1次作用对应一位数据的发送(MOSI)和另一位数据的接收(MISO)。
GY-26电子指南针51代码串口
void InitLcd();
void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
SeriPushSend(0XC0); //发送校准命令。
display();
while(KEY_1==0); //等待按键放开
// GY-26电子指南针模块测试程序
// 使用单片机:STC89C52
// 晶振: 11.0592 M
// 液晶屏:LCD1602
#include<REG52.H>
#include<math.h> //Keil library
#include<stdio.h> //Keil library
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //LCD1602 数据端口
sbit LCM_RS=P2^0; //LCD1602 控制端口
{
for(j=0;j<121;j++)
{;}
}
}
//*********串口数据发送******************
void SeriPushSend(uchar send_data)
{
51单片机实现对24C02进行页写、顺序读取并显示验证(带详细注释)
0xe0,0xc0,0x80,0x00 }; //写入24C02的一组数据,8个字节对应24C02的一页(共32页),这里把这些要验证的常数放到程序 存储区 uchar ReceivedData[8];//用于存储接收的8个字节数据(1页)的数组
//本例51为单主机,24C02为从机,不需要总线裁决
为高就将SDA拉低;如果最后一位是0,24C02没能力拉高! if (!ChkAck()){ for(i = 0;i < 8;i++){ ReceivedData[i] = ReadI2CByte(); AckAsMaster(0); //51此时接收数据,调用应答的函数(置SDA为0) }
//发送方在发完一个字节后检测接收方有没有应答。返回应答成功否。 bit ChkAck(void) {
bit SDAtemp; SDA = 1; //释放SDA(置1),然后等待接收方应答将它拉低。确切的说,应是24C02发送字节最后一 位的第8个时钟周期下降沿后经tAA //(SCL变低到SDA OUT有效的时间)约0.1-4.5us后拉低SDA,并随第9个时钟后结束。所以24C02正常时,SDA 为1并不体现 //(第8脉冲后马上被拉低了),但若器件坏了,就需要靠这个置1后不变来判断!(若不置1而上次发的数据 最后一位为0就不好判断了) //从24C02的Block Diagram看,它只能在SDA为1时通过控制内部的Dout来把SDA拉低,但不能在SDA为0时将其 置高!故主机要常将SDA置1,而SCl置0。 SCL = 1; //WriteI2CByte中写完一字节后又将SCL拉低,这里拉高产生第9个时钟上升沿,然后在SCL 为高期间对SDA进行检测 delay5us(); SDAtemp = SDA; //如果不用暂存变量,直接return SDA,就不会执行后面的SCL = 0,检测期间的第9个时钟 就不完整了 SCL = 0; delay5us(); return SDAtemp;
基于磁传感器MMC212的电子指南针
基于磁传感器MMC212的电子指南针封维忠;杨丽;何君君【摘要】设计了基于各相异性磁阻传感器芯片MMC212xMG的高精度电子指南针. 由于该芯片是带有片上信号处理并集成了I2C总线的完整的传感系统,允许设备直接与微处理器相连而不需要A/D转换器或定时器,所以用该电路制作的电子指南针具有外围电路简单、功耗低、体积小的特点.【期刊名称】《物理实验》【年(卷),期】2010(030)003【总页数】4页(P16-18,28)【关键词】磁阻传感器;电子指南针;单片机【作者】封维忠;杨丽;何君君【作者单位】南京林业大学,信息与科学技术学院,江苏,南京210037;南京林业大学,信息与科学技术学院,江苏,南京210037;南京林业大学,信息与科学技术学院,江苏,南京210037【正文语种】中文【中图分类】O4-39;O4411 引言地磁场成形于地球内部的磁物质.地磁场的强度根据位置的不同而在0.4×10-4~0.6×10-4T之间变动.它的分布状态类似于棒磁铁,磁场线从地球南极指向北极.磁极与地理极不一致,磁极根据地轴旋转来定义,磁极与地轴间的角度大约为11.5°.电子指南针被广泛的运用于导航设备中,所以寻求集成度高、且在地磁场强度范围敏感的传感器一直是设计高精度、使用方便的电子指南针需要解决的问题.近年来,国际上许多公司相继推出了基于磁阻效应(MR)[1-2]和巨磁效应(GMR)[3]的磁敏传感器芯片,本文采用无锡美新公司生产的MMC212xMG双轴磁传感器设计了高精度电子指南针.由于该芯片是带有片上信号处理并集成了I2C总线的完整的传感系统,允许设备直接与微处理器相连而不需要A/D转换器或定时器.它可以测量±2×10-4T 的磁场范围,用MMC212xMG双轴磁传感器设计的电子指南针具有芯片外围电路简单、功耗低、体积小的特点.2 各向异性磁传感器MMC212xMG各向异性磁阻传感器[4](AMR)是一种由沉淀在硅晶片上的导磁合金薄膜制成的特殊电阻.在制造过程中,用一强磁场施加在薄膜上,使得其磁畴与外磁场在同一方向上,建立磁化矢量.当被测磁场垂直地加在薄膜的边缘上导致磁畴旋转和改变角度,这个改变又导致薄膜的电阻发生变化.该AMR传感器被包含在惠斯登电桥中,这样电阻的变化可由差动电压的变化检测,并且可以测量所加磁场的强度.然而沿晶片磁化轴大于5.5×10-4T的外磁场可能会使磁畴倒置,从而改变传感器特性.所以这时必须使用一个瞬时的强大修复磁场来恢复传感器特性.该MEMSIC磁传感器有一个片上的磁耦合线圈用来提供修复磁场.各向异性磁阻传感器MMC212xMG是双轴磁传感器,其结构见图1[1],是带有片上信号处理并集成了I2C总线的完整的传感系统,允许设备直接与微处理器相连而不需要A/D转换器或定时器.它可以测量±2×10-4T的磁场范围,并在25℃,3 V时灵敏度为512×104计数/T.图1 MMC212xMG结构框图3 电子指南针的基本原理图2是地球某一点的地球磁场向量He的三维图[5](X Y平面与地球表面平行,Z轴垂直向下),电子指南针的基本任务就是测量He在X Y平面的投影Heh与HeX的夹角,即方位角α.从图2可知α=arctan(HeY/HeX),因此,用磁敏传感器分别测出HeY和HeX,就可以由上式算出方位角α,整个系统的方案设计图如图2所示.图2 地球磁场向量4 电子指南针的硬件实现I2C是一个工业标准双向双线接口总线,总线上的每个外围设备都有一个设备地址,主I2C器件通过设备地址可以对外围设备进行读写操作.I2C总线是由数据线SDA 和时钟线SCL构成的串行总线,可发送和接收数据.开始数据传送时,总线必须是空闲的,此时2条总线是一个高电平状态.I2C电路从属模式已经被植入此MEMSIC传感器,并作为标准接口被客户应用.使用AT89C52单片机作为主控制器[6],由于此单片机本身没有I2C总线接口,所以采用I/O口P1.0和P1.1来分别虚拟I2C总线的数据线SDA和时钟线SCL.采用MMC2120M082858磁传感器芯片,对应的7位设备地址为0110000.为了避免地址冲突,在同一总线上的磁传感器设备在出厂时就有4种可编程地址(0110**0).硬件电路如图3所示.磁传感器3脚VDA为电路和传感器提供输入电压,直流电压应该在2.7~5.25 V之间;7脚VDD为I2C总线提供输入电压,通常为1.8 V并可兼容1.62~5.25 V.C2和C3为外加陶瓷电容,用于磁传感器的置位/复位操作.R1和R2为上拉电阻结构,实现与运算.注意I2C总线的频率一定要小于400 kHz.数据传送开始时有开始信号,结束时有结束信号.开始信号定义为当SCL为高电平时,SDA 由高电平向低电平跳变,开始传送数据.结束信号定义为当SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据.在I2C系统中所有传送的数据都是8位的,每个字节后必须跟上一个确认位,每个数据的传送需要9个时钟周期.数据传送开始于MSB,在开始信号后,单片机通过7位设备地址0110000调用磁传感器数据.在7位地址之后,第8位是决定数据传送方向,“1”表示主设备从所选择的磁传感器设备中读出信息,“0”则表示主设备把信息写入到所选择的磁传感器设备中.接着磁传感器需给SDA线一个低电平作为确认信号.为了读出磁传感器中的信号,单片机需要向磁传感器的8位内部寄存器(00H)中写入代码01H,表示读出磁传感器信息的唤醒操作.磁传感器收到读命令后就开始把8位数据传送到I2C总线上.收到主设备发过来的确认信号后,磁传感器就继续传送下个字节数据.重复相同的过程直至4个字节的数(MSBX轴,LSBX轴,MSB Y轴,LSBY轴)都被传送到主设备为止.图3 指南针硬件电路图5 电子指南针的软件实现根据磁传感器的I2C总线的时序要求编写程序.在执行开始测量指令之前,一定要给磁传感器至少50μs的时间去完成置位/复位操作.置位/复位线圈的流程图如图4所示.在置位/复位线圈的流程的第3个周期,单片机向磁传感器的内部寄存器写入02H表示是启动置位命令,或写入04H表示是启动复位命令.然后进入测量操作,读出磁传感器输出的X轴和Y轴的值.测量过程主要分为两大步:第一步是磁传感器的唤醒操作,第二步是单片机发读命令读入磁传感器发送的数据.唤醒操作过程是单片机首先向磁传感器发送写入命令60H,接着单片机向磁传感器发送写入的目标寄存器地址00H,最后发送要写入的命令01H.唤醒操作完成后单片机向磁传感器发送61H读命令进入第二步,单片机开始接收磁传感器发送过来的数据.图4 置位/复位流程图我们从磁传感器直接读出的X轴和Y轴的值HX和HY均是非负值.因为这个磁传感器芯片没法输出负值,所以芯片输出值是将X轴和Y轴的真实值加上一个固定偏移Offset,所以输出的X轴和Y轴的真实值等于芯片输出值减Offset,Offset理论值为2 048.由于磁传感器周围存在磁干扰(硬磁干扰、软磁干扰),使得所测的当地磁场是当地的地磁场和当地的干扰磁场的矢量和.为了提取所要测量的当地地磁场,还需要进一步校准程序.校准的方法是在测量之前水平将磁传感器旋转1圈,得到X Y轴的最大最小值HXmax,HXmin和HYmax,HYmin,从而求出以下几个参量的真实值:Sensitivity是灵敏度,理论值是512×104T,但是实际情况中2个轴的灵敏度是有差别的.HXcal和HYcal就是校正后消除灵敏度影响的真实值.然后根据公式α=arctan(HYcal/HXcal)求出方位角,并进行角度处理,把角度扩展到0~360°,最后进行数值转换,十进制数送显示缓冲区显示相应角度.单片机程序采用Keil C[7]编程,程序流程图如图4~5所示.图5 测量流程图6 结果与误差分析设某地地磁场强度He=0.5×10-4T,方向与地磁传感器X轴重合,α=arctan(HeY/HeX)=0,当地磁传感器X轴与地磁场方向偏转1°时,ΔHeY=HesinΔ α=8.72×10-3,MMC2120地磁传感器的分辨率为1×10-4T/512计数,最小检测量M=1.95×10-7T,考虑到测量系统的最大误差为±1个计数,故该地磁传感器的分辨角小于0.5°.以上的误差分析的条件是传感器的X-Y轴平面与水平面平行,考虑一般情况,该系统的误差应小于1°.如果要近一步提高其测量精度,必需同时测量出地磁场He的X,Y,Z分量,来计算地球磁场的HeX和HeY(水平平面中)方向的分量[5].电子指南针电路经系统调试后,进行了实际测量.东南西北4个方向对应的角度分别为:91°,180°,270°和1°,所以结果显示存在±1°的误差在合理范围内.结果表明本文设计达到了预定的要求.参考文献:【相关文献】[1] 林继鹏,王君,凌振宝,等.HMC1001型磁阻式传感器及应用[J].传感器技术,2002,21(3):51-52.[2] 王国余,张欣,景亮.新型磁阻传感器在地磁场测量中的应用[J].传感器技术,2002,21(10):43-45.[3] 汤玉林,李俊文,瞿光杰.利用GMR效应的电子指南针[J].数字采集与处理,2005,20(3):342-345.[4] 裴轶,虞南方,刘奇,等.各向异性磁阻传感器的原理及应用[J].仪表技术与传感器,2004,(8):26-28.[5] 朱学斌.基于MAX155和KMZ52的电子指南针的实现[J].鲁东大学学报,2006,22(4):300-302.[6] 李广弟,朱月秀.单片机基础[M].北京:北京航空航天大学出版社,2001.[7] 谢维成,杨加国.单片机原理及C51程序设计[M].北京:清华大学出版社,2006.[8] 胡修林,余凯军,杨奇.高精度电子指南针的设计与实现[J].计算机与数字工程,2007,35(1):157-159.。
51单片机使用ds3231模块
51单片机使用ds3231模块//DS3231某宝买的模块,5块不到的样子。
麻烦大家下载一下,不要直接复制。
89c52不能用1t的单片机。
//此修正版的文件可以解决之前的word下载后不能打开的蛋疼问题。
1602数据端口是P2如果需要修改,只有2个地方需要改。
#include#include#define uchar unsigned char#define uint unsigned int#define yh 0x80 //第一行的初始位置#define er 0x80+0x40 //第二行初始位置sbitrs=P0^7;//1602的3个端口sbitwr=P0^6;sbit en=P0^5;sbit SDA=P1^6; //模拟I2C数据传送位SDA 模块只使用了2个端口sbit SCL=P1^7; //模拟I2C时钟控制位SCL//sbit INT=P3^2;sbit key1=P3^5; //功能键,修改键这是3个按键,低电平有效,串联个4到10千欧的电阻到按键开关上,然后接地就行sbit key2=P3^4; //上调键sbit key3=P3^3; //下调键//sbit RESET=P3^3;bit ack; //应答标志位#define DS3231_WriteAddress 0xD0 //器件写地址#define DS3231_ReadAddress 0xD1 //器件读地址#define DS3231_SECOND 0x00 //秒#define DS3231_MINUTE 0x01 //分#define DS3231_HOUR 0x02 //时#define DS3231_WEEK 0x03 //星期#define DS3231_DAY 0x04 //日#define DS3231_MONTH 0x05 //月#define DS3231_YEAR 0x06 //年//闹铃1#define DS3231_SALARM1ECOND 0x07 //秒#define DS3231_ALARM1MINUTE 0x08 //分#define DS3231_ALARM1HOUR 0x09 //时#define DS3231_ALARM1WEEK 0x0A //星期/日//闹铃2#define DS3231_ALARM2MINUTE 0x0b //分#define DS3231_ALARM2HOUR 0x0c //时#define DS3231_ALARM2WEEK 0x0d //星期/日#define DS3231_CONTROL 0x0e //控制寄存器#define DS3231_STATUS 0x0f //状态寄存器#define BSY 2 //忙#define OSF 7 //振荡器停止标志#define DS3231_XTAL 0x10 //晶体老化寄存器#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位) #define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)uchara,miao,shi,fen,ri,yue,nian,week,temp1,temp2,key1n,temp;uchar code tab1[]={"2017- - FRI"};uchar code tab2[]={" : : ."};/*uchar HEX2BCD(ucharval) //B码转换为BCD码{uchar k;k=(val)/10*16+(val)%10;}*/ucharBCD_Decimal(ucharbcd){uchar Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1; //发送起始条件的数据信号delayus(1);SCL=1;delayus(5); //起始条件建立时间大于4.7us,延时SDA=0; //发送起始信号delayus(5); // 起始条件锁定时间大于4μsSCL=0; //钳住I2C总线,准备发送或接收数据delayus(2); }void Stop_I2C(){SDA=0; //发送结束条件的数据信号delayus(1); //发送结束条件的时钟信号SCL=1; //结束条件建立时间大于4usdelayus(5);SDA=1; //发送I2C总线结束信号}void SendByte(uchar c){ucharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位{if((c<<bitcnt)&0x80)< bdsfid="153" p=""></bitcnt)&0x80)<>SDA=1; //判断发送位elseSDA=0;delayus(1);SCL=1; //置时钟线为高,通知被控器开始接收数据位delayus(5); //保证时钟高电平周期大于4μsSCL=0;}delayus(2);SDA=1; //8位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1; //判断是否接收到应答信号SCL=0;delayus(2);}ucharRcvByte()ucharretc;ucharBitCnt;retc=0;SDA=1; //置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0; //置时钟线为低,准备接收数据位delayus(5); //时钟低电平周期大于4.7μsSCL=1; //置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中delayus(2);}SCL=0;delayus(2);return(retc);}void Ack_I2C(bit a){if(a==0)SDA=0; //在此发出应答或非应答信号elseSDA=1;delayus(3);SCL=1;delayus(5); //时钟低电平周期大于4μsSCL=0; //清时钟线,钳住I2C总线以便继续接收delayus(2);}ucharwrite_byte(ucharaddr, ucharwrite_data) {Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();delayus(10);return 1;}ucharread_current(){ucharread_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}ucharread_random(ucharrandom_addr) { Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}/*voidModifyTime(ucharyea,ucharmon,ucharda,ucharhou,ucharmin,uc harsec,uchar week) {uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp); //修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp); //修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp); //修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); //修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); //修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); //修改秒temp=HEX2BCD(week);write_byte(DS3231_WEEK,temp); //修改星期}*//******************液晶写入************************/void write_1602com(uchar com)//液晶写入指令函数{rs=0;//置为写入命令P2=com;//送入数据delayus(1000);en=1;//拉高使能端delayus(1000);en=0;//完成高脉冲}void write_1602dat(uchardat){rs=1;//置为写入数据P2=dat;//送入数据delayus(1000);en=1;delayus(1000);en=0;}/*********************over***********************/ void lcd_init()//液晶初始化函数{ wr=0;write_1602com(0x38);//设置液晶工作模式write_1602com(0x0c);//开显示不显示光标write_1602com(0x06);//整屏不移动,指针加一write_1602com(0x01);write_1602com(yh+1);//字符写入的位置for(a=0;a<14;a++){write_1602dat(tab1[a]);//delay(3);}write_1602com(er);for(a=0;a<12;a++){write_1602dat(tab2[a]);//delay(3);}write_1602com(er+14); //写温度符号write_1602dat(0xdf);write_1602dat(0x43);}void write_sfm(ucharadd,uchardat)//写时分秒及温度{uchargw,sw;gw=dat%10;sw=dat/10;write_1602com(er+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);}void write_nyr(ucharadd,uchardat) //写日期{uchargw,sw;gw=dat%10;sw=dat/10;write_1602com(yh+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);}void write_week(uchar week)//写星期函数{write_1602com(yh+0x0c);switch(week){case 1:write_1602dat('M');//delay(5); write_1602dat('O');//delay(5);write_1602dat('N');break;case 2:write_1602dat('T');//delay(5); write_1602dat('U');//delay(5);write_1602dat('E');break;case 3:write_1602dat('W');//delay(5); write_1602dat('E');//delay(5);write_1602dat('D');break;case 4:write_1602dat('T');//delay(5); write_1602dat('H');//delay(5);write_1602dat('U');break;case 5:write_1602dat('F');//delay(5); write_1602dat('R');//delay(5);write_1602dat('I');break;case 6:write_1602dat('S');//delay(5); write_1602dat('T');//delay(5);write_1602dat('A');break;case 7:write_1602dat('S');//delay(5); write_1602dat('U');//delay(5);write_1602dat('N');break;}}void keyscan(){if(key1==0)//key1为功能键{delayus(5000);if(key1==0){while(!key1);key1n++;if(key1n==9)key1n=1;switch(key1n){case 1: TR0=0;//关闭定时器//TR1=0;write_1602com(er+0x06);//写入光标位置write_1602com(0x0f);//设置光标为闪烁break;case 2: write_1602com(er+3);//fen//write_1602com(0x0f);break;case 3: write_1602com(er+0);//shi//write_1602com(0x0f);break;case 4: write_1602com(yh+0x0d);//week //write_1602com(0x0f);break;case 5: write_1602com(yh+0x09);//ri//write_1602com(0x0f);break;case 6: write_1602com(yh+0x06);//yue//write_1602com(0x0f);break;case 7: write_1602com(yh+0x03);//nian//write_1602com(0x0f);break;case 8: write_1602com(0x0c);//设置光标不闪烁write_sfm(6,miao);//写入新的秒数temp=(miao)/10*16+(miao)%10;write_byte(DS3231_SECOND,temp); //退出时修改秒write_1602com(er+6);write_sfm(0x03,fen);temp=(fen)/10*16+(fen)%10;write_byte(DS3231_MINUTE,temp); //修改分write_1602com(er+3);TR0=1;//打开定时器break;}}}if(key1n!=0)//当key1按下以下。
【同学毕业论文】毕业设计---基于51单片机的电子式指南针的设计+最后附源代码
摘要早期的指南针采用了磁化指针和方位盘的组合方式,整个指南针从便携性、指示灵敏度上都有一定缺乏。
本系统采用专用的磁场传感器结合高速微控制器〔MCU〕的电子指南针能有效解决这些问题。
系统采用了磁阻〔GMR〕传感器采集某一方向磁场强度后通过MCU控制器对其进行处理并显示上传,通过对电子指南针硬件电路和软件程序的分析,阐述了电子指南针根本的工作原理及实现。
理论上指南针模块精度到达1°,能够在LCD上显示当前方位并能通过键盘控制上传指南针处理得到的数据到上位机。
关键词:电子指南针,GMR,MCU,LCDABSTRACTSince the early compass was composited by the magnetic compass and direction-pointer, the sensitivity and portability of this compass is ing a dedicated high-speed magnetic sensor with microcontroller (MCU) electronic compass can effectively solve these problems.The system is designed by the reluctance (GMR) sensors collecting a certain direction through the magnetic field strength after the MCU Controller its judgment will be dealt with the results, through the LCD screen display and can be sent to the MCU's top serial Machine. The compass module can reach 1 ° theoretically, in the LCD display on the current position of the keyboard and through selective compass upload the data processing.KEY WORDS:electronic compass,GMR,MCU,LCD目录第1章本研究的背景及目的 (1)1.1 本研究的背景 (1)1.2 本研究的目的 (1)第2章系统的构成及工作原理 (2)2.1 系统的构成 (2)2.2工作原理分析 (2)第3章硬件电路 (4)3.1 单片机系统 (4)3.2 传感器模块 (6)3.2.1 磁阻传感器 (6)3.2.2 磁场测量电路 (7)3.3 LCD显示模块 (8)3.4 实时时钟电路 (9)3.5 接口电路 (10)第4章系统软件 (12)4.1 主监控程序 (12)4.2 实时时钟驱动 (13)4.3 人机界面驱动 (14)4.3.1 液晶模块驱动 (14)4.3.2 键盘驱动 (14)4.4 传感器模块驱动 (14)第5章仿真结果 (17)第6章结论 (18)致谢 (19)参考文献 (20)附录(主要程序) (21)第1章本研究的背景及目的1.1 本研究的背景指南针是用以判别方位的一种简单仪器。
51的I2C协议操作
51的I2C协议操作I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
是微电子通信控制领域广泛采用的一种总线标准。
它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。
具体可以详细查看通讯协议#include "reg51.h"#include "intrins.h"unsigned char SystemError;sbit SCL= P1^6; //定义串行时钟线所在口使用时根据自己的需要来定义sbit SDA= P1^7; //定义串行数据线所在口使用时根据自己的需要来定义#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}/*--------------------------------------------------------- 调用方式:void AD7416_I2CStart(void) 2003/05/04函数说明:私有函数,I2C专用---------------------------------------------------------*/ void I2CStart(void){EA=0;SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始SDA=0; SomeNOP();SCL=0;}/*-------------------------------------------------------- 调用方式:void AD7416_I2CStop(void) 2003/05/04函数说明:私有函数,I2C专用---------------------------------------------------------*/ void I2CStop(void){SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止SCL=1; SomeNOP(); SDA=1;EA=1;}/*-------------------------------------------------------- 调用方式:I2CAck(void) 2003/05/13函数说明:私有函数,I2C专用,等待从器件接收方的应答ACK BY AD7416---------------------------------------------------------*/WaitAck(void){unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
51入门系列教程 协议协议(IIC篇)
51入门系列教程协议协议(IIC篇)从这一贴开始,和大家一起聊聊有关通讯协议,通讯协议是指单片机和外部设备进行数据交互的基本准则.先说说物理连接吧!地球上的通讯端口,从根本上来讲只有两种:一种是串行接口,即指数据按照高地位的一定顺序,一位一位分时进行传输;一种是并行接口,即指所有数据,一次性同时进行传输;由此可以看来,并行接口理论上的速度会比串行接口快.为了简化单片机(主)和外部设备(从)的物理连接复杂度,一般情况下会使用串行接口.而单片机内部的总线,一般就是并行的结构.俺们这里主要聊聊串行通信,再说协议,这个是非常重要的通信手段.举个栗子,咱(主机)和女神(从机)聊天,首先得确认两个原则性的东西:第一,相同的语言.咱说国语,女神说那美克星语,直接后果就是双方完全不能沟通.类比下来,就是通讯中的信号协议,必须遵循一定的信号发送接收的格式.还记得韩梅梅和李雷吗?韩:hi,lilei,how are you李:fine,thank you,and you?韩:I’m fine too,goodbye李:goodbye韩用英语先喊名字打招呼,李听到喊自己名字且听懂后,才会有下面的交流.这就是一次完整的通信过程,以hi开始,以goodbye结束.第二,相同的语速.虽然咱和女神都说国语.但是咱每秒说10个字,女神每秒只能听见并理解5个字,这样下来,明显也无法正常沟通.不信你试试飞快地读“西安”一词,会不会有人理解成“先”一字呢?呵呵,速度快了,意思完全就不通了抛开上面两点,接下来就是一些细节内容了,譬如,咱向女神阐述长达1分钟的故事.女神在这1分钟内,会隔一段时间回复一个“嗯”,来表示正在聆听,并且做好准备继续聆听.咱才能继续讲下去哈反过来女神讲事情给咱也是一样,咱也得时不时回复一个“嗯”.好让女神继续讲下去,如果换个场景,咱一个人(主机)给多个人(多从机)吹水.也基本上就是上面的过程,个人认为一个串行通信比较重要的方面也就这么些了,下面来看看今天咱聊的具体对象IIC.IIC,有些写成I2C,简单读成i方c,全称Inter-Integrated Circuit,是由飞利浦在上世纪80年代设计推广的一种通信总线协议,呃,现在应该叫恩智浦(NXP)了.它只需要两个IO口即可构成,一根是SCL时钟线,有些也标为SCK之类,说法不一;另外一根是SDA数据线,SCL是一个单向的IO,由主机向从机发送.SDA则是条双向IO,主机需要对其进行读写操作,每次8位数据.读的时候接收数据,写的时候发送数据.IIC的速度分为三个等级:标准模式100kbit/s,快速模式400kbit/s,高速模式3.4Mbit/s.由SCL的频率来决定.一般情况下,需要参照外围器件的要求来决定SCL频率.在硬件上,SDA和SCL 是需要有上拉电阻,从机设备需要是OC/OD状态,集电极开路或者漏极开路,且这个上拉电阻的取值,会对速度产生比较大的影响.10kohm以下比较常见,个人喜欢4.7k,IIC要求的细则很多,有兴趣可以下载英文原版的手册研读.这里聊聊一些基本要求:1、基本原则SCL为高时,SDA不能乱动.SCL 为低时,SDA随便玩.SCL必须由主机控制.在寻址过程中,一次发送数据8位,其中高7位为从机地址,最后一位为读写标志位.So,每个从机一个地址,一条IIC总线理论上最多挂载127个从设备.主机呼叫,从机听到叫自己才作出回应2、起始信号类似于打招呼hi,告诉别人,咱要发话了时序图SCL在高电平器件,SDA出现一次下降沿,也就是SDA从高电平跳变到低电平,看代码:void start(){SDA=1; //SDA拉高delay();SCL=1; //SCL拉高delay();SDA=0; //SDA拉低,出现一次下降沿,形成起始信号delay();SCL=0; //SCL拉低delay();}3、停止信号时序图类似于再见goodbye,告诉别人交流结束,SCL高电平期间,SDA由低电平跳变到高电平,也就是出现一次上升沿,看代码:void stop(){SDA=0; //SDA拉低delay();SCL=1; //SCL拉高delay();SDA=1; //SDA拉高,出现一次上升沿delay();}4、应答信号应答信号有两类:一类是主机发送给从机的,另一类是从机发送给主机的,出现在8位数据传输结束后,第九个时钟到来之时,应答信号一般称为ACK信号.至于NACK(非应答信号),其实就是ACK的另一种说法,时序图:表示从机已经收到之前传输的8位数据,简单点理解,就是女神的“嗯”(邪恶了!!!!!!!) .这个需要由主机读取SDA的值,来判断是否有ACK信号.看代码:bit respons(){bittemp=0;SDA=1; //主机将SDA拉高,释放SDA控制权(SDA 是上拉到电源的哟)delay();SCL=1; //SCL拉高delay();temp = SDA; //读取SDA的值,赋给tempSCL=0; //SCL拉低delay();return temp; //返回temp值}So,temp=1的话,是个NACK信号,从机无响应,temp=0的话,则是个ACK信号咯,那就可以认为,从机已经接收到主机发送过来的数据了.5、数据发送过程每次传递8位的数据,这些数据啥时候发送呢?看时序图:So easy ,SCL高电平期间,保持SDA数据稳定,就是1位数据传过去了 .SCL低电平期间,SDA可以进行数据变化...瞧代码:void wr_byte(uchar date){uchari;for(i=0;i{date=dateSDA=CY; //将左移进位信号1或0赋给SDA,详见REG51.h中SY寄存器delay();SCL=1; //SDA稳定后,SCL拉高delay();SCL=0; //SCL拉低delay();}}上面2-4肢解了IIC一次数据通信过程,就这么些.但是不同的IIC设备,读写时序略有不同,咱来看些具体的例子吧!正好手头上有块24C08看看这货的地址情况8位寻址数据,最后一位为读写标志位,0写1读,D7-D1为地址位,其中高四位固定为1010,B2、B1、B0可操作.但是注意一下,对于24C08而言,B2位是由外部管脚确定的,写无效.也就是说,一条IIC总线上可以挂2个24C08,B2为0或者1.而其他,特别是24C02,B0、B1、B2都是由外部管脚确定,可挂8片.不过24c08可以软件操作B1和B0.B1B0=00时,指向block0的256个字节空间.后面依次类推.总共有4x256=1024k字节=8kbit.所以叫做24c08,呵呵。
第8章51单片机常用外扩模块1DS18B20和IIC
unsigned char code dispnum[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f ,0xff };
//温度小数部分译码表
unsigned char timecount;
//中断次数变量
unsigned char readdata[2];
//保存温度值的数组
搜索ROM命令(F0h)
当不知道总线上有多少芯片和各芯片序列号时,这条命令采用排除法识别总线上的芯片的64 位编码。
报警搜索命令(Ech)
最近一次测温后,满足报警条件的芯片,将响应这条命令报警。
(2)DS18B20的操作命令 1)写暂存器命令(4Eh) 写入开始地址为TH(字节2),随后是TL(字节3)和配置字节(字节4),所有写入操作 必须在DS18B20芯片复位之前完成。 2)读暂存器命令(BEh) 该命令从字节0开始,一直读完所有字节(字节8),如果只需要读取部分数据,则可以使 用复位命令终止。 3)拷贝暂存器命令(48h) 将暂存器内容拷贝到EEPROM中。 4)启动温度转换命令(44h) 启动总线上的DS18B20进行温度转换。 5)读EEPROM命令(B8h) 将EEPROM内的数据读回暂存器 6)读供电模式命令(B4h) 若是寄生电源,芯片返回0,若是外部电源,返回1。
夏路易电子工业出版社所有读操作1立即地址读at24c02的地址计数器内容为最后操作字节的地址加1也就是说如果上次读写的操作地址为n则立即读的地址为从地址n1开始如果n255则计数器将翻转到0且继续输出数据at24c02接收到器件地址信号rw位置1信号首先发送一个应答信号然后发送一个8位字节数据主器件不需发送一个应答信号但要产生一个停止信号
21
51单片机各针脚介绍
51单片机各引脚及端口详解51单片机引脚功能:MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图:l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。
l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。
l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。
l P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子)。
这4个I/O口具有不完全相同的功能,大家可得学好了,其它书本里虽然有,但写的太深,对于初学者来说很难理解的,我这里都是按我自已的表达方式来写的,相信你也能够理解的。
P0口有三个功能:1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口)2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口)3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。
P1口只做I/O口使用:其内部有上拉电阻。
P2口有两个功能:1、扩展外部存储器时,当作地址总线使用2、做一般I/O口使用,其内部有上拉电阻;P3口有两个功能:除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。
有内部EPROM的单片机芯片(例如8751),为写入程序需提供专门的编程脉冲和编程电源,这些信号也是由信号引脚的形式提供的,即:编程脉冲:30脚(ALE/PROG)编程电压(25V):31脚(EA/Vpp)接触过工业设备的兄弟可能会看到有些印刷线路板上会有一个电池,这个电池是干什么用的呢?这就是单片机的备用电源,当外接电源下降到下限值时,备用电源就会经第二功能的方式由第9脚(即RST/VPD)引入,以保护内部RAM中的信息不会丢失。
在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。
51单片机综合学习系统之 无线遥控模块应用篇
51单片机综合学习系统之无线遥控模块应用篇《电子制作》2008年6月站长原创,如需引用请注明出处大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了数字温度传感器DS18B20的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习无线电遥控的基本原理与应用实例。
先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。
图1 51单片机综合学习系统上图是我们将要使用的51单片机综合学习系统硬件平台,如图1所示,本期实验我们用到了综合系统主机、200米无线遥控器,无线接收板,综合系统其它功能模块原理与使用详见前几期《电子制作》杂志及后期连载教程介绍。
PT2262/PT2272无线模块工作原理PT2262/2272是台湾普城公司生产的一种CMOS工艺制造的低功耗低价位通用编/解码电路,是目前在无线通讯电路中作地址编码识别最常用的芯片之一。
PT2262/2272最多可有12位(A0-A11)三态(悬空,接高电平,接低电平)地址设定管脚,任意组合可提供531441个地址码。
PT2262最多可有6位(D0-D5)数据端管脚,设定的地址码和数据码从17脚(Dout)串行输出,可用于无线遥控发射电路。
PT2262和PT2272的引脚排列见图2。
对于编码器PT2262,A0~A5共6根线为地址线,而A6~A11共6根线可以作为地址线,也可以作为数据线,这要取决于所配合使用的解码器。
若解码器没有数据线,则A6~A11作为地址线使用,这种情况下,A0~A11共12根地址线,每线都可以设置成“1”、“O”、“开路”三种状态之一,因此共有编码数312=531441种;但若配对使用的解码器的A6~A11是数据线,例如PT2272,那么这时PT2262的A6~A11也作为数据线用,并只可设置为“1”和“0”两种状态之一,而地址线只剩下A0~A5共6根,编码数降为36=729种。
51单片机指令系统(word文档良心出品)
3
24
JNB bit,rel
若直接位不为“1”则转移
若(bit)≠1,则PC=(PC)+2+rel
若(bit)=1,则PC=(PC)+2
3
24
JBC bit,rel
若直接为为“1”则转移并清除该位
若(bit)=1,则PC=(PC)+3+rel,bit←0
若(bit)≠1,则PC=(பைடு நூலகம்C)+3
A←(A)-((Ri))
1
12
SUBB A,#data
A←(A)- #data
1
12
INC A
A←(A)+ 1
1
12
INC Rn
Rn←(Rn)+ 1
1
12
INC direct
Direct←(direct)+ 1
2
12
INC @Ri
(Ri)←((Ri))+ 1
1
12
INC DPTR
DPTR←(DPTR)+ 1
CY←1
3
24
CJNE @Ri,#data,rel
间接RAM和立即数比较若不相等则跳转
若((Ri))=#data,PC←(PC)+3,
CY←0
若((Ri))>#data,PC←(PC)+3+rel,
CY←0
若((Ri))<#data,PC←(PC)+3+rel,
CY←1
3
24
DJNZ Rn,rel
寄存器键1若非零则跳转
1
24
基于51单片机的电子指南针设计
4.3 方案三:51 系列单片机
51 系列单片机的优点之一是它从内部的硬件到软件有一套完整的按位操作系统,称作 位处理器,或布尔处理器,它能进行位操作。它不仅能对片内某些特殊功能寄存器的某位进 行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起 来得心应手。虽然其他种类的单片机也具有位处理功能,但能进行位逻辑运算的实属少见。 51 系列在片内 RAM 区间还特别开辟了一个双重功能的地址区间, 十六个字节, 单元地址 20H~ 2FH,它既可作字节处理,也可作位处理,使用极为灵活。这一功能无疑给使用者提供了极 大的方便,因为一个较复杂的程序在运行过程中会遇到很多分支,因而需建立很多标志位, 在运行过程中,需要对有关的标志位进行置位、清零或检测,以确定程序的运行方向。而实 施这一处理,只需用一条位操作指令即可。51 系列的 I/O 脚的设置和使用也非常简单,当 引脚为低电平时,吸入电流可达 20mA,具有一定的驱动能力。 BACK
通常的导航仪器主要有两种:陀螺罗经和磁罗盘。对地磁场测量方向的仪器 叫做磁罗盘。 我国发明指南针就是一个简易的磁罗盘,对整个人类社会发展做出 巨大贡献。 在公元 50 年左右, 磁石已经被运用到导航航啦, 并且研制出了司南。 在公元 960-1127 年时候, 支撑是的指南针——指南龟被研制出来。到 20 世纪 初,随着工业的发展,罗盘制造工艺也得到了飞速的发展,材料的选择和机械制 造使得罗盘的性能有了显著地提高。尤其是是机械式磁罗盘,现在某些情况下依 然使用机械式磁罗盘 [1]。到了 20 世纪出,陀螺罗盘的问世,对罗盘又是一场革 命。罗盘感应这地球的自转,磁性物质对其没有影响。使得陀螺罗盘的标度盘非
一、摘要
本课题针对电子指南针的各个功能部件对电子指南针的关键部分做了详细的研究。采 用单片机做为系统的核心控制芯片, 而单片机的接口是数字信号的, 想要它能够处理地球的 磁场状况,必须要把磁场信号转化成电信号(电压或电流),然后经过模数转换,把模拟的 电信号转化成单片机可以处理的数字信号。 把所得的数字信息通过主控制器进行处理, 然后 用人机界面表现出来,供我们来读取和应用。电子指南针系统是一个典型的单片机系统,了 解其工作原理及其信号处理流程有利于研究更加复杂的嵌入式系统, 特别是系统中采用进口 的磁传感器及其相关信号的采集芯片更是有利于研究磁场传感器的实现机理, 以便将其更加 广泛的应用。
在C51单片机上对读写卡芯片MFRC522编程
在C51单片机上对读写卡芯片MFRC522编程1 概述在整个的射频识别系统中。
读写卡模块负责建立单片机与电子标签之间的通信,起着非常重要的作用。
而整个读写卡模块的核心,就是读写卡芯片MFRC522MFRC522 是NXP 公司专为各种计量检测设备而设计、推出的一款低成本、低功耗的非接触式读写卡芯片。
该芯片应用于13.56MHz 非接触通信,应用了较为先进的调制和解调概念,集成了众多的通信方式和协议,其内部强大的电路可直接驱动天线无需其他外接电路,通过其独特的加密算法,更使其具备可较强的安全性。
作为一款较为成功的读写卡芯片,MFRC522与主机间的通信采用的是连线较少的串行通信,而且可根据不同的用户需求,从SPI、I2C、串行UART三种总线模式中选择,这样的设计有利于减少连线数量,缩小PCB 板体积,降低成本。
目前MFRC522在很多的领域都得到了广泛应用,尤其适用于低成本、小尺寸、低功耗和单电源的非接触式通信的应用场合,是智能仪表、板上单元、便携式手持设备的极佳选择。
目前,全国各大城市的公共交通终端以及非接触式公用电话应用的正是MFRC5222 特性1. 高度集成的模拟电路模块,应用新概念完成调制和解调。
2. 支持ISO 14443A与MIFARE通信协议3. 驱动优化,采用少量外部器件就能输出驱动级到天线4. 支持MIFARE的加密算法5. 可自由选择多样的主机接口:①10Mbit/s的SPI接口②I2C接口,快速传输模式的速率为400kbit/s,高速模式的速率为3400kbit/s③串行UART,传输速率高达1228.8kbit/s,帧取决于RS232接口,电压电平取决于提供的管脚电压6. 灵活的中断模式7. 64字节的发送接收缓冲区8. 具备软件掉电、硬件掉电和发送器掉电三种低功耗模式,能够通过关闭相应的模块或驱动器达到节电的目的。
9. 2.5~3.3V的低电源电压,低功耗设计10. 内部振荡器,链接27.12HZ的晶体11.可编程定时器12.自由编程的I/O管脚13.内置温度传感器,当芯片温度过高时会自动停止射频信号的发射14. 体积小,仅有5mm╳5mm╳0.85mm3 系统结构MFRC522与MCU通过串口进行数据交换,其支持3种微控制器接口类型:SPI、I2C以及串行UART。
HMC1022 磁阻中文资料
白噪音(BW=1kHz)=
3.8*√BW nV 120 nV (rms) 50µ高斯(p-p)
频率(Hz)
图 3-典型噪音密度曲线
什么是偏置电流带
特定大小的电流流过偏置电流带可以消除任何环 境磁场 这对消除地球磁场的杂散硬铁(stray hard iron)失真影响非常有用 例如 减少汽车罗盘应用 中车体对地球磁场的影响 如果磁阻传感器在汽车
单位: 1 高斯(g)=1Oe(空气中) =79.58A/m 1G=10-3 特斯拉 1G=105 伽马(gamma)
线性磁场传感器
HMC1021/1022 技术规格
特性 电桥电源 电桥电阻 工作温度(1) 贮存温度(1) 磁场范围(1)
线性误差(1)
滞后误差(1) 可重复性误差(1)
电桥偏置
条件
1高斯g1oe空气中1g104特斯拉1g7958am1g105伽马线性磁场传感器主要性能数据在置位或复位后传感器输出与磁场强度曲线vm压电复位出置位输2次扫描磁场oe传感器噪声对频率曲线zhtrvn度密声噪频率hz电桥电阻对温度曲线所有型号姆欧阻电温度c输出在磁场强度范围20oe内可重复时传感器输出对磁场强度曲线vm压电出输2次扫描磁场oe供电电压恒定时灵敏度对温度曲线eovvm度敏灵温度c置位复位脉冲变化效应推荐2?sec微秒的脉冲持续时间sr电压4v零电压mv置位性零电压mv复位复重灵敏度mvvoe置位可?灵敏度mvvoe复位在这区段无置位复位置位复位电压v线性磁场传感器封装引脚技术规格hmc1002双轴mr磁阻传感器微电?hmc1001单轴mr微电?hmc1022双轴mr电?hmc1021s单轴mr电?hmc1021d单轴mr电?hmc1021z单轴mr电?箭头指示外加磁场的方向在set置位脉冲后会产生一个正输出电压线性磁场传感器基本的设备操作霍尼韦尔磁阻传感器是简单的电阻电桥设备图1只需要一个供电电压?可测?磁场当010伏的电压连接到桥?上时传感器开始测?轴线内的环境磁场或施加磁场除了电桥电?外传感器的芯片上有两个磁耦合的电流带偏置电流带和置位复位电流带这些电流带是霍尼韦尔的专利它省去了外部加装线圈的需要v电桥最大35?偏置偏置最大20?接地i置位i复位图1芯片上的元件hmc1001磁阻传感器是由在硅圆片上电积的一个薄层镍铁或称坡莫合金或镍铁导磁合金薄膜制成并布置成一个电阻带存在施加磁场时电桥电阻的变化使电压输出产生相应的变化通常施加在薄膜侧的外部磁场使磁?线产生旋转并改变其角度这又使电阻值发生变化?rr并造成惠斯通电桥的电压输出的变化这种镍铁电阻的变化被称作磁阻效应它直接与电流的方向和磁化矢?有关制造过程中敏感轴磁场方向被设置为沿薄膜长度的方向这样可使施加在镍铁薄膜的磁场导致电阻值的最大变化但是沿敏感轴的强磁场大于10高斯的影响会扰乱或翻转薄膜磁化的极性改变传感器的特性针对这样的扰动磁场为了恢复或置位传感器的特性必须短暂地施加一个强的恢复磁场这种做法被称作施加置位脉冲或复位脉冲电桥输出信号的极性取决于此内部薄膜的磁化方向并且与零磁场输出相对称当直流电流在偏置电流带内通过时偏置电流带允许多种工作模式?可减去?必要的磁场?可将电桥偏置设置为0?电桥输出可驱动偏置电流带来消除闭环配置内的测?磁场?接到命令时桥
51单片机汇编指令大全
51单片机汇编指令大全汇编指令大全: 表示当前寄存器区的个工作寄存器: 表示当前寄存器区的或,可作地址指针即间址寄存器(或): 为间接寄存器或基址寄存器的前缀.: 表示位内部数据存储单元的地址.它可以是内部的单元地址.特殊功能寄存器的地址()或名称,: 累加器.: .特殊功能寄存器,用于和指令中.:::::::::“(一()(), : ; ()<()() 以直接地址为目的的传送指令:, ;()<(), ; ()<(), ; ()<(), ; ()<(()), ; ()<() 以寄存器间接地址为目的的传送指令:, ;(())<(), ;(())<(), ;(())<(二) 数据指针赋值指令(位数据传送指令) , ;(三) 片外数据传送指令, ;()<(())片外, ;()<(())片外, ;(())片外<(), ;(())片外<()(四) 数据访问指令(查表指令)(五(六()()()(七()(), ; ()<() (()), ; ()<()()加指令:, ;()<();()<();(())<(());()<();()<()(八) 减法指令()带进位减法指令:, ;()<() (), ; ()<() (), ; ()<() (()), ; ()<()()减指令:;()<() ;()<();()<();(())<(()) (九()存器,()(十(()(), ; ()<()∨() 逻辑异或运算指令: , ;()<()⊙() , ; ()<()⊙(), ; ()<()⊙(()) , ; ()<()⊙, ;()<()⊙(), ; ()<()⊙() 累加器清和去反指令;()< (累加器清指令);()<() (累加器取反指令)() 累加器移位指令:不带进位循环左移: <<([]()()() 短转移指令 ;()<()() 变址寻址转移指令 ;()<()()[] 条件转移指令:() 累加器判转移指令:;如果(),跳转到目标语句,否则顺序执行;如果()≠,跳转到目标语句,否则顺序执行() 比较转移指令:, , ;如果()≠,则跳转到目标语句,否则程序顺序执行 , ; 如果()≠(),则跳转到目标语句,否则程序顺序执行, ; 如果()≠,则跳转到目标语句,否则程序顺序执行, ; 如果()≠,则跳转到目标语句,否则程序顺序执行 () 循环控制转移指令:, ;()先减,如减后()≠,则跳转到目标语句;否则顺序执行 , ; ()先减,如减后()≠,则跳转到目标语句;否则顺序执行 (十三) 子程序调用和返回指令() 绝对调用指令:() 长调用指令:()((()()()()();如果位,跳转到目标语句,否则顺序执行() 以指定位状态为条件的转移指令:, ;如果,跳转到目标语句,否则顺序执行, ;如果,跳转到目标语句,否则顺序执行, ;如果,跳转到目标语句,同时将位清;否则顺序执行。
MCS51-IIC
总线仲裁
总线仲裁发生在两个主IIC设备中。如果一个 主设备欲使用总线,而测得SDA为低电平,则 该主设备仲裁不能够使用总线启动传输。这个 仲裁过程会延长,直到信号线SDA变为高电平 每次操作都要进行仲裁
MCS-51模拟IIC总线
SCL
>4.7μS > 4μ S
SC L
> 4μ S
>4.7μS
IIC总线数据传输格式
一般操作格式
S 从IIC地址(7位) R/W A
主控制器写操作格式
传输数据 …… A P
S 从IIC地址 W A 数据1 A 数据2 A …… 数据n A/A P 红色起始信号S、地址信号、控制信号W、各个数据、结束信号 P,均为主IIC设备发送、从IIC设备接收;黑色的应答信号A/A 为从IIC设备发送、主IIC设备接收
IIC总线的工作原理
数据位信号 数据位
SDA SCL
起始信号
结束信号
IIC总线的工作原理
IIC总线对数据线上信号的定义
数据位信号:时钟信号线是低电平时,可以改变数 据信号线电平;时钟信号线是高电平时,应保持数 据信号线上电平不变,即时钟是高电平时数据有效 应答信号:占1位,数据接收者接收1字节数据后, 应向数据发出者发送一应答信号。低电平为应答, 继续发送;高电平为非应答,结束发送 控制位信号:占1位,主IIC设备发出的读写控制信 号,高为读、低为写(对主IIC设备而言)。控制 位在寻址字节中
IIC总线系统组成
SDA SCL SCL SDA SCL SDA SCL 单片机 A 单片机 B SDA SCL SDA SCL 日历 时钟 SDA SCL SDA
SRAM或 E2PROM
A/D或 D/A
基于HMC1022磁引信的信号采集模块设计
文章编号:1006—1576(2007)12一0069—02基于HMCl022磁引信的信号采集模块设计战延谋,王卓柱,陈明,徐长根(解放军炮兵学院火控教研室,安徽合肥230031)摘要:基于HMCl022磁引信的信号采集模块,其硬件电路包括磁探测电路、信号放大电路、信号滤波电路和基于MSP430F149芯片的A,D转换电路。
模块软件采用c语言编写,并在IcCAVR集成环境中编辑、编译。
实验结果证明整个系统具有精度高、功耗低、接口方便和微型化的优点。
关键词:磁传感器;信号采集;磁引信;模块设计中图分类号:TP274.2文献标识码:ASignalC01lectionModuleDesignBasedonHMCl022MagneticFuseeZHANYan.mou,WANGZhuo—zhu,CHENMin2。
XUChang.gen(FireControlforStaffRoom,Art订leryAcademyofPLA,Hefei230031,China)Abstract:SignalcoUectionmoduledesignbasedonHMCl022magneticfusee,itshardwarecircuitincludesthemagneticprobecircuit,signalfilteringcircuit,A,DconversioncircuitbasedonMSP430F149chip.ThemodelsoftwareisprogrammedbyClanguage,editedandtranslatedinICCAVRintegratedenvironment.TheresultoftheexperimentprovesthatthewholesystemhasadvantagesOfhighaccuracy'lowcOnsume,convenientinterfaceconnectingandminiaturization.KeVwords:Magneticsensor;Signalcollection:Magneticfllsee:ModuledesignO引言磁传感器在水雷磁引信、探矿、考古、空间磁场探测、航天器飞行姿态测量、水中平台姿态测量等许多领域中得到广泛应用,它能检测弱磁场,分辨率高。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
uchar ge_data,shi_data,bai_data ,qian_data;
qian_data=temp_data/1000 ;
temp_data=temp_data%1000; //取余运算
sbit KEY_2 =P2^4; //按键2
sbit KEY_3 =P2^5; //按键3
sbit KEY_4 =P2^6; //按键4
uchar templ,temph,cnt;
uchar ge,shi,bai,qian;
uint dis_data,dis_data1;
dis_data=BUF[1];
dis_data<<=8;
dis_data|=BUF[2];
conversion(dis_data);
ge=HEX_TO_ASCII(ge);
shi=HEX_TO_ASCII(shi);
bai=HEX_TO_ASCII(bai);
if(KEY_3==0){
recovery_factory();
void IIC_ADDR_Change();
void delay_10ms();
//*********************************************************
uchar HEX_TO_ASCII(uchar HEX_data)
{uchar ASCII_data;
DisplayOneChar(12,1,ge);
//----------按键检测
if(KEY_1==0){
delay_10ms();
if(KEY_1==0){
cal_on();
while(KEY_1==0)delay_10ms();
DisplayOneChar(5,1,ge);
DisplayOneChar(6,1,0XDF); //温度单位
DisplayOneChar(7,1,'C'); //温度单位
//-------显示磁偏量
dis_data1=0;
dis_data1=BUF[3];
dis_data1<<=8;
void AT24C04_WritePage();
void read_cmp(void);
//-----------------------------------
void cal_on();
void cal_off();
void recovery_factory();
void CMP_OFFS();
bai_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;
dis_data&=0xefff; //清符号位
}
else DisplayOneChar(0,1,' ');//如果bit-12为0,空格,清空
conversion(dis_data);
ge=HEX_TO_ASCII(ge);
shi=HEX_TO_ASCII(shi);
}
}
if(KEY_2==0){
delay_10ms();
if(KEY_2==0){
cal_off();
while(KEY_2==0)delay_10ms();
}
}
if(KEY_3==0){
delay_10ms();
qian=HEX_TO_ASCII(qian);
DisplayOneChar(0,0,qian);
DisplayOneChar(1,0,bai);
DisplayOneChar(2,0,shi);
DisplayOneChar(3,0,'.');
DisplayOneChar(4,0,ge);
sbit LCM_RS=P2^0; //LCD1602命令端口
sbit LCM_RW=P2^1; //LCD1602命令端口
sbit LCM_EN=P2^2; //LCD1602命令端口
sbit KEY_1 =P2^3; //按键1
ge=HEX_TO_ASCII(ge);
shi=HEX_TO_ASCII(shi);
bai=HEX_TO_ASCII(bai);
qian=HEX_TO_ASCII(qian);
DisplayOneChar(10,1,bai);
DisplayOneChar(11,1,shi);
#define DataPort P0 //LCD1602数据端口
#define WriteDeviceAddress 0xE0 //定义器件在IIC总线中的地址
#define ReadDviceAddress 0xE1 //器件在IIC总线中地址+1
typedef unsigned char BYTE;
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned short WORD;
BYTE BUF[8]; //数据缓存区
BYTE code res[6] _at_ 0x23;
sbit SCL=P1^0; //iic时钟引脚定义
sbit SDA=P1^1; //iic数据引脚定义
case 0x0d:ASCII_data=0x44;break;
case 0x0e:ASCII_data=0x45;break;
case 0x0f:ASCII_data=0x46;break;
}
return(ASCII_data);
}
//*********************************************************
switch(HEX_data){
case 0x00:ASCII_data=0x30;break;
case 0x01:ASCII_data=0x31;break;
case 0x02:ASCII_data=0x32;break;
case 0x03:ASCII_data=0x33;break;
bai=HEX_TO_ASCII(bai);
qian=HEX_TO_ASCII(qian);
DisplayOneChar(1,1,qian);
DisplayOneChar(2,1,bai);
DisplayOneChar(3,1,shi);
DisplayOneChar(4,1,'.');
uchar HEX_TO_ASCII(uchar HEX_data);
void conversion(uint temp_data);
//------------------------------------
void Delay5us();
void Delay5ms();
void AT24C04_Start();
{
unsigned int i;
delay(500);
InitLcd();
EA=0;
cnt=0;
while(1) //循环
{
read_cmp(); //读出数据
//---------显示角度
dis_data=0;
//淘宝网 /
// GY-26 IIC测试程序
// 使用单片机STC89C51
// 晶振:11.0592M
// 显示:LCD1602
// 编译环境 Keil uVision2
// 程序中把模块当24c04进行通信
#include <REG51.H>
qian= qian_data;
bai = bai_data;
shi = shi_data;
ge = ge_data ;
}
//*********************************************************
void main()
dis_data1|=BUF[4];
conversion(dis_data1);
ge=HEX_TO_ASCII(ge);
shi=HEX_TO_ASCII(shi);
bai=HEX_TO_ASCII(bai);
qian=HEX_TO_ASCII(qian);
DisplayOneChar(7,0,qian);
case 0x08:ASCII_data=0x38;break;
case 0x09:ASCII_data=0x39;break;
case 0x0a:ASCII_data=0x41;break;
case 0x0b:ASCII_data=0x42;break;
case 0x0c:ASCII_data=0x43;break;
//---------显示温度
dis_data=0;