我最近在做一个SMbus的红外测温写了一个程序但不知道为什么无法编译。。求大侠们指点啊具体代码如下啊#include <reg51.h>
#include"intrins.h"
//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
unsigned char code seg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char cs;
unsigned char dispram[4];
uint keyflag=0;
uint Tem;
float TEM ;
uint T;
//**************端口定义**************
//mlx90614 端口定义
sbit SCL=P2^3; //时钟线
sbit SDA=P2^2; //数据线
sbit key_get=P1^6; //按键读取
//************数据定义****************
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL;//Pecreg;
//************函数声明*****************************************
// ****************7seg函数********************
void writesegdata(unsigned char );
void writecsdate(unsigned char );
void inittimer1(void); // 七段数码管初始化
void start_bit(); //MLX90614 发起始位子程序
void stop_bit(); //MLX90614 发结束位子程序
void send_bit(void); //MLX90614 发送位子程序
void tx_byte(uchar dat_byte); //MLX90614 发送字节子程序
void receive_bit(void); //MLX90614 接收位子程序
uchar rx_byte(void); //MLX90614 接收字节子程序
void key_scan(void); //键盘读取函数
void delay(uint N); //延时程序
uint memread(void); //读温度数据
void display(uint Tem); //显示子程序
//*************主函数*******************************************
void main()
{
P0=0xff;
P2=0xff;
inittimer1();
TR1=1;
dispram[0]=1;
dispram[1]=2;
dispram[2]=3;
dispram[3]=4;
//uint Tem;
//float TEM;
//函数部分
SCL=1;SDA=1;
nop_();_nop_();_nop_();_nop_();
SCL=0;
delay(1000);
SCL=1;
while(1)
{
key_scan();
if(keyflag==1)
{
Tem=memread();
TEM=Tem*(2/100)-27315/100;
T=TEM*100 ;
cs=0;
dispram[0]=T/10000;
dispram[1]=T%10000/1000;
dispram[2]=T%1000/100;
dispram[3]=T%100/10;
}
}
}
//***************************************************
void start_bit(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
}
//*******************************************
//-----------发送一个位---------
void send_bit(void)
{
if(bit_out==0)
SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//********************************************
//---------发送一个字节---------
void tx_byte(uchar dat_byte)
{
char i,n,dat;
//n=Nack_counter;
for(n=Nack_counter;n>0;n--)
{
//TX_again:
dat=dat_byte;
for(i=0;i<8;i++)
{
if(dat&0x80)
bit_out=1;
else
bit_out=0;
send_bit();
dat=dat<<1;
}
receive_bit();
if(bit_in==1)
{
stop_bit();
break;
}
}
}
//if(n!=0)
//{n--;goto Repeat;}
//lse
//goto exit;
//else
//goto exit;
//Repeat:
//start_bit();
//goto TX_again;
//exit: ;
//*******************************************
//----------接收一个位----------
void receive_bit(void)
{
SDA=1;bit_in=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in=SDA;
_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//**************************************
//----------接收一个字节--------
uchar rx_byte(void)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit();
return dat;
}
//***************************************
//------------延时--------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++)
_nop_();
}
//----------读取温度------------------
uint memread(void)
{
start_bit();
tx_byte(0x00);
tx_byte(0x07);
//Send SlaveAddress
//Send Command
//------------
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
//Pecreg=rx_byte();
stop_bit();
return(DataH*256+DataL);
}
//-----------按键读取函数--------------
void key_scan(void)
{
uchar key_temp1,key_temp2;
key_temp1=key_get;
if(key_temp1==0)
{
delay(30);
key_temp2=key_get;
if(key_temp1==key_temp2)
{
keyflag=1;
}
}
}
//************ 数码管初始*************
void inittimer1( void)
{
cs=0;
dispram[0]=0;
dispram[1]=0;
dispram[2]=0;
dispram[3]=0;
TMOD=0x90;
TH1=0XEF;
TL1=0XFF;
EA=1;
ET1=1;
}
//******************LED 显示子函数***********************
// ****************中断函数************************
void timer13ST(void) interrupt 3
{
unsigned char k;
TH1=0XEF;
TL1=0XFF;
TF1=0;
if(cs>=3) cs=0;
else cs++;
writesegdata(dispram[cs]);
k=1<<cs;
writecsdate(k);
}
//***************写函数*****************
void writesegdata(unsigned char seg)
{
if(seg>10)
seg=10;
seg=seg_code[seg];
P0=seg;
_nop_();
_nop_();
P2&=0x1f;
_nop_();
_nop_();
P2|=0xe0;
}
void writecsdate(unsigned char cs)
{
cs&=0x0f;
P0=~cs;
_nop_();
_nop_();
P2&=0x3f;
_nop_();
_nop_();
P2|=0xe0;
}
此帖出自
小平头技术问答
一周热门 更多>