我最近在做一个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; }
|