MLX90614 arduino写入程序后为什么无法工作? 程序为:

MLX90614 arduino写入程序后为什么无法工作? 程序为:,第1张

[编辑本段]由来

在Windows 3.x *** 作系统中,注册表是一个极小文件,其文件名为Reg.dat,里面只存放了某些文件类型的应用程序关联,大部分的设置放在Win.ini、System.ini等多个初始化INI文件中。由于这些初始化文件不便于管理和维护,时常出现一些因INI文件遭到破坏而导致系统无法启动的问题。为了使系统运行得更为稳定、健壮,Windows 95/98设计师们借用了Windows NT中的注册表的思想,将注册表引入到Windows 95/98 *** 作系统中,而且将INI文件中的大部分设置也移植到注册表中,因此,注册表在Windows 95/98 *** 作系统的启动、运行过程中起着重要的作用。

[编辑本段]作用

注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件。16位驱动在Winnt下无法工作,所以所有设备都通过注册表来控制,一般这些是通过BIOS来控制的。在Win95下,16位驱动会继续以实模式方式设备工作,它们使用system.ini来控制。16位应用程序会工作在NT或者Win95 下,它们的程序仍然会参考win.ini和system.ini文件获得信息和控制。

在没有注册表的情况下, *** 作系统不会获得必须的信息来运行和控制附属的设备和应用程序及正确响应用户的输入。

在系统中注册表是一个记录32位驱动的设置和位置的数据库。当 *** 作系统需要存取硬件设备,它使用驱动程序,甚至设备是一个BIOS支持的设备。无BIOS支持设备安装时必须需要驱动,这个驱动是独立于 *** 作系统的,但是 *** 作系统需要知道从哪里找到它们,文件名、版本号、其他设置和信息,没有橘指注册表对设备的记录,它们就不能被使用。

当一个用户准备运行一个应用程序,注册表提供应用程序信息给 *** 作系统,这样应用程序可以被找到,正确数据文件的位置被规定,其他设置也都可以被使用。

注册表保存关于缺省数据和辅助文件的位置信息、菜单、按钮条、窗口状态和其他可选项。它同样也保存了安装信息(比如说日期),安装软件的用户,软件版本号和日期,序列号等。根据安装软件的不同,它包括的信息也不同。

然而,一般来说,注册表控制所有32位应用程序和驱动,控制的方法是基于用户和计算机的,而不依赖于应用程序或驱动,每个注册表的参数项控制了一个用户的功能或者计算机功能。用户功能可能包括了桌面外观和用户目录。所以,计算机功能和安装的硬件和软件有关,对所有用户来说项都是公用的。

有些程序功能对用户有影响,有些是作用于计算机而不是为个人设置的,同样的,驱动可能是用户指定的,但仔伍肢在很多时候,它们在计念世算机中是通用的。

注册表控制用户模式的例子有:

控制面板功能;

桌面外观和图标;

网络参数;

浏览器功能性和特征;

那些功能中的某些是和用户无关的,有些是针对用户的。

计算机相关控制项基于计算机名,和登陆用户无关。控制类型的例子是安装一个应用程序,不管是哪个用户,程序的可用性和存取是不变的,然而,运行程序图标依赖于网络上登陆的用户。网络协议可用性和优先权基于计算机,但是当前连接和用户信息相关。

这里是在注册表中基与计算机控制条目的一些例子:

存取控制;

登陆确认;

文件和打印机共享;

网卡设置和协议;

系统性能和虚拟内存设置;

在系统中注册表控制所有32位应用程序和它们的功能及多个应用程序的交互,比如复制和粘贴,它也控制所有的硬件和驱动程序。虽然多数可以通过控制面板来安装和设置,理解注册表仍是做Winnt和Win95系统管理基本常识。

[编辑本段]打开方式

Win98/98SE/Me

运行中输入regedit.exe 无权限限制

Win2000/XP

1.开始>>运行.中输入regedt32

2.开始>>运行.中输入regedit

第一种方法打开的注册表编辑器和Win98下的一样,而且功能相同,而使用第二种方法打开的注册表编辑器则可以方便的设置权限,建议网络管理员使用第2种方法打开注册表编辑器修改需要修改的权限设置部分以免被他人恶意修改。

Windows Vista/7

1.在开始菜单搜索框中输入regedit并按回车键.(需要管理员权限)

2.在运行中输入regedit.exe(需要管理员权限)

[编辑本段]存放位置

2000/XP注册表文件按功能来分,也是由系统注册表文件和用户注册表文件两类组成的

注册表文件存放系统的所有设置信息:

系统设置和缺省用户配置数据存放在系统\系统文件夹\SYSTEM32\CONFIG文件夹下的6个文件,DEFAULT、SAM、SECURITY、SOFTWARE、USERDIFF和SYSTEM中,而用户的配置信息存放在系统所在磁盘的\Documents and Setting\文件夹,包括ntuser.dat ntuser.ini ntuser.dat.log

/*这是用LCD显示所测温度的代码,你参考一下,如果没问题的话,其他的功能你再添加就好了,不难*/

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

#define Nack_number 10

//**************端口定义**************************************************

uchar flag    //LCD控制线接口

sbit RS=P1^0  //RS端

sbit RW=P1^1  //读写端

sbit LCDE=P2^5  //使能端

//mlx90614端口定义

sbit SCK=P2^1 //时钟线

sbit SDA=P2^2 //数据线

//************数据定义****************************************************

bdata uchar flag1 //可位寻址数据

sbit bit_out=flag1^7

sbit bit_in=flag1^0

uchar tempH,tempL,err

//**************************  LCD1602  ***********************************

//向LCD写入命令或数据*****************************************************

#define LCD_COMMAND 0       //命令

#define LCD_DATA 1       // 数据

#define LCD_CLEAR_SCREEN 0x01       // 清屏

#define LCD_HOMING   0x02       // 光标返回原点

//设置显示模式******* 0x08+   *********************************************

#define LCD_SHOW 0x04     //显示开

#define LCD_HIDE 0x00     //显示关

#define LCD_CURSOR 0x02 //显示光标

#define LCD_NO_CURSOR 0x00     //无光标

#define LCD_FLASH 0x01     //光标闪动

#define LCD_NO_FLASH 0x00    纤悉 //光标不闪动

//设置输入模式********** 0x04+ ********************************************

#define LCD_AC_UP 0x02     //光标右移 AC+

#define LCD_AC_DOWN 0x00       //默认 光标左移毁亏乎 AC-

#define LCD_MOVE 0x01       //画面可平移

#define LCD_NO_MOVE 0x00       //默认 画面不空敬移动

//**************************  mlx90614  ***********************************

//command mode  命令模式

#define RamAccess 0x00 //对RAM *** 作

#define EepomAccess 0x20 //对EEPRAM *** 作

#define Mode 0x60 //进入命令模式

#define ExitMode 0x61 //退出命令模式

#define ReadFlag 0xf0 //读标志

#define EnterSleep 0xff //进入睡眠模式

//ram address read only RAM地址(只读)

#define AbmientTempAddr 0x03 //周围温度

#define IR1Addr 0x04

#define IR2Addr 0x05

#define LineAbmientTempAddr 0x06   //环境温度

/*0x0000 0x4074 16500 0.01/单元

   -40   125*/

#define LineObj1TempAddr 0x07 //目标温度,红外温度

/*0x27ad-0x7fff 0x3559 22610 0.02/单元

-70.01-382.19  0.01   452.2*/

#define LineObj2TempAddr 0x08

//eepom address  EEPROM地址

#define TObjMaxAddr 0x00 //测量范围上限设定

#define TObjMinAddr 0x01 //测量范围下限设定

#define PWMCtrlAddr 0x02 //PWM设定

#define TaRangeAddr 0x03 //环境温度设定

#define KeAddr 0x04 //频率修正系数

#define ConfigAddr 0x05 //配置寄存器

#define SMbusAddr 0x0e //器件地址设定

#define Reserverd1Addr 0x0f //保留

#define Reserverd2Addr 0x19 //保留

#define ID1Addr 0x1c //ID地址1

#define ID2Addr 0x1d //ID地址2

#define ID3Addr 0x1e //ID地址3

#define ID4Addr 0x1f //ID地址4

//************函数声明*****************************************************

void start() //MLX90614发起始位子程序

void stop() //MLX90614发结束位子程序

uchar ReadByte(void) //MLX90614接收字节子程序

void send_bit(void) //MLX90614发送位子程序

void SendByte(uchar number) //MLX90614接收字节子程序

void read_bit(void) //MLX90614接收位子程序

void delay(uint N) //延时程序

uint readtemp(void) //读温度数据

void init1602(void) //LCD初始化子程序

void busy(void) //LCD判断忙子程序

void cmd_wrt(uchar cmd) //LCD写命令子程序

void dat_wrt(uchar dat) //LCD写数据子程序

void display(uint Tem) //显示子程序

void Print(uchar *str) //字符串显示程序

//*************主函数*******************************************

void main()

{

uint Tem //温度变量

SCK=1

SDA=1

delay(4)

SCK=0

delay(1000)

SCK=1

init1602() //初始化LCD

while(1)

{

Tem=readtemp() //读取温度

cmd_wrt(0x01) //清屏

Print("  Temperature:    ") //显示字符串  Temperature: 且换行

display(Tem) //显示温度

Print(" ^C") //显示摄氏度

delay(10000) //延时再读取温度显示

}

}

void Print(uchar *str) //字符串显示程序

{

while(*str!='\0') //直到字符串结束

{

dat_wrt(*str) //转成ASCII码

str++ //指向下一个字符

}

}

//*********输入转换并显示*********

void display(uint Tem)

{

uint T,a,b

T=Tem*2

if(T>=27315) //温度为正

{

T=T-27315 //

a=T/100 //温度整数

b=T-a*100 //温度小数

if(a>=100) //温度超过100度

{

dat_wrt(0x30+a/100) //显示温度百位

dat_wrt(0x30+a%100/10) //显示温度十位

dat_wrt(0x30+a%10) //显示温度个位

}

else if(a>=10) //温度超过10度

{

dat_wrt(0x30+a%100/10) //显示温度十位

dat_wrt(0x30+a%10) //显示温度个位

}

else //温度不超过10度

{

dat_wrt(0x30+a) //显示温度个位

}

dat_wrt(0x2e) //显示小数点

if(b>=10) //温度小数点后第1位数不等于0

{

dat_wrt(0x30+b/10) //显示温度小数点后第1位数

dat_wrt(0x30+b%10) //显示温度小数点后第2位数

}

else //温度小数点后第1位数等于0

{

dat_wrt(0x30) //显示温度小数点后第1位数0

dat_wrt(0x30+b) //显示温度小数点后第2位数

}

}

else //温度为负

{

T=27315-T

a=T/100

b=T-a*100

dat_wrt(0x2d) //显示负号

if(a>=10) //温度低于负10度

{

dat_wrt(0x30+a/10) //显示温度十位

dat_wrt(0x30+a%10) //显示温度个位

}

else //温度高于负10度

{

dat_wrt(0x30+a) //显示温度个位

}

dat_wrt(0x2e) //显示小数点

if(b>=10) //温度小数点后第1位数不等于0

{

dat_wrt(0x30+b/10) //显示温度小数点后第1位数

dat_wrt(0x30+b%10) //显示温度小数点后第2位数

}

else //温度小数点后第1位数等于0

{

dat_wrt(0x30) //显示温度小数点后第1位数0

dat_wrt(0x30+b) //显示温度小数点后第2位数

}

}

}

//************************************

void start(void) //停止条件是 SCK=1时,SDA由1到0

{

SDA=1

delay(4)

SCK=1

delay(4)

SDA=0

delay(4)

SCK=0

delay(4)

}

//------------------------------

void stop(void) //停止条件是 SCK=1时,SDA由0到1

{

SCK=0

delay(4)

SDA=0

delay(4)

SCK=1

delay(4)

SDA=1

}

//---------发送一个字节---------

void SendByte(uchar number)

{

uchar i,n,dat

n=Nack_number //可以重发次数

Send_again:

dat=number

for(i=0i<8i++) //8位依次发送

{

if(dat&0x80)   //取最高位

{

bit_out=1    //发1

}

else

{

bit_out=0    //发0

}

send_bit()    //发送一个位

dat=dat<<1    //左移一位

}

read_bit()  //接收1位 应答信号

if(bit_in==1)     //无应答时重发

{

stop()

if(n!=0)

{

n--    //可以重发Nack_number=10次

goto Repeat //重发

}

else

{

goto exit //退出

}

}

else

{

goto exit

}

Repeat:

start() //重新开始

goto Send_again //重发

exit: //退出

}

//-----------发送一个位---------

void send_bit(void)

{

if(bit_out==1)

{

SDA=1  //发1

}

else

{

SDA=0  //发0

}

_nop_()

SCK=1  //上升沿

delay(4)delay(4)

SCK=0

delay(4)delay(4)

}

//----------接收一个字节--------

uchar ReadByte(void)

{

uchar i,dat

dat=0 //初值为0

for(i=0i<8i++)

{

dat=dat<<1 //左移

read_bit() //接收一位

if(bit_in==1)

{

dat=dat+1 //为1时对应位加1

}

}

SDA=0 //发送应答信号0

send_bit()

return dat //带回接收数据

}

//----------接收一个位----------

void read_bit(void)

{

SDA=1 //数据端先置1

bit_in=1

SCK=1 //上升沿

delay(4)delay(4)

bit_in=SDA //读数据

_nop_()

SCK=0

delay(4)delay(4)

}

//------------------------------

uint readtemp(void)

{

SCK=0

start() //开始条件

SendByte(0x00) //发送从地址00

SendByte(0x07) //发送命令

start() //开始条件

SendByte(0x01) //读从地址00

bit_out=0

tempL=ReadByte() //读数据低字节

bit_out=0

tempH=ReadByte() //读数据高字节

bit_out=1

err=ReadByte() //读错误信息码

stop() //停止条件

return(tempH*256+tempL)

}

//******************LCD显示子函数***********************

void init1602(void) //初始化LCD

{

cmd_wrt(0x01) //清屏

cmd_wrt(0x0c) //开显示,不显示光标,不闪烁

cmd_wrt(0x06) //完成一个字符码传送后,光标左移,显示不发生移位

cmd_wrt(0x38) //16×2显示,5×7点阵,8位数据接口

}

void busy(void) //LCD忙标志判断

{

flag=0x80 //赋初值 高位为1 禁止

while(flag&0x80) //读写 *** 作使能位禁止时等待 继续检测

{

P0=0xff

RS=0 //指向地址计数器

RW=1 //读

LCDE=1 //信号下降沿有效

flag=P0 //读状态位 高位为状态

LCDE=0

}

}

void cmd_wrt(uchar cmd) //写命令子函数

{

LCDE=0

busy() //检测 读写 *** 作使能吗

P0=cmd //命令

RS=0 //指向命令计数器

RW=0 //写

LCDE=1 //高电平有效

LCDE=0

}

void dat_wrt(uchar dat) //写数据子函数

{

busy() //检测 读写 *** 作使能吗

LCDE=0

if(flag==16)

{

RS=0 //指向指令寄存器

RW=0 //写

P0=0XC0 //指向第二行

LCDE=1 //高电平有效

LCDE=0

}

RS=1 //指向数据寄存器

RW=0 //写

P0=dat //写数据

LCDE=1 //高电平有效

LCDE=0

}

//------------延时--------------

void delay(uint n)

{

uint j

for(j=0j<nj++)

{

_nop_()

}

}

当然可以用stc89s52单片机来读取温度了,但是,mlx90614采用的是SMbus 总线协议,你要用单片机引脚来模拟总线,并要写出读拦镇取温度的山帆程序,要根据SMbus 总线简唯粗协议来写呀,能写吗?

与单片机只需要两个脚连接就行了,类似于I2C总线的连接方式,但是通信协议可不同的。如下图


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12488205.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存