*---------------- 24CXX讀寫程序 ----------------*/ void start24c(void) //開始啟動 { sda=1;scl=1; nop(); sda=0; nop(); } void stop24c(void) //停止 { sda=0;scl=1; nop(); sda=1; nop(); } void ack24c(void) //正向回應(yīng) { sda=0; nop(); scl=1; nop(); scl=0; } void noack24c(void) //反向回應(yīng) { sda=1; nop(); scl=1; nop(); scl=0; } void send24c(uchar dd) //內(nèi)部函數(shù),發(fā)送數(shù)到i2c { uchar bitcounter=8; uchar temp; do { temp=dd; scl=0; nop(); if((temp&0x80)==0x80) sda=1; else sda=0; scl=1; temp=dd<<1; dd=temp; bitcounter--; } while(bitcounter); scl=0; } uchar rece24c(void) //內(nèi)部函數(shù),從i2c接收數(shù) { uchar temp=0,temp1=0,bitcounter=8; sda=1; do { scl=0; nop(); scl=1; nop(); if(sda) temp=temp|0x01; else temp=temp&0xfe; if(bitcounter-1) { temp1=temp<<1; temp=temp1; } bitcounter--; } while(bitcounter); return(temp); } /** 向I2C寫數(shù)據(jù),器件號(頁號)(addr24crom_w,addr24crom_r), */ /* 可調(diào)用函數(shù): 將dd寫入24c 中的address地址中 */ void write24c(uchar addr24crom_w,uchar dd,uchar address) { con1=0; start24c(); send24c(addr24crom_w); ack24c(); send24c(address); ack24c(); send24c(dd); ack24c(); stop24c(); delay(1); con1=1; } /** 從I2C讀數(shù)據(jù),器件號(頁號)(addr24crom_w,addr24crom_r), */ /* 可調(diào)用函數(shù): 從24c 中的address地址中讀出數(shù),返回值為該讀數(shù) */ uchar read24c(uchar addr24crom_w,addr24crom_r,address) { uchar dd; start24c(); send24c(addr24crom_w); ack24c(); send24c(address); ack24c(); start24c(); send24c(addr24crom_r); ack24c(); dd=rece24c(); scl=0; noack24c(); stop24c(); return(dd); } /*--------------------- ADC0832 控制程序 -------- -----*/ void adcck(void) // 一個時鐘周期 { adcclk=1; sdelay(5); adcclk=0; sdelay(5); } uchar readadc(bit b1,b0) //讀0832中通道(b1,b0)中的一個數(shù) { uchar i,ch; ch=0; // 清零 adccs=0; // cs 低電平有效 adcclk=0;sdelay(3); adcdo=1;sdelay(3); adcclk=1;sdelay(3); //當(dāng)do為1時,脈沖沿送出,啟動開始 adcclk=0;sdelay(3); adcdo=b1;sdelay(3); adcclk=1;sdelay(3); adcclk=0;sdelay(3); adcdo=b0;sdelay(3); adcclk=1;sdelay(3); //配置通道 adcck(); //一個穩(wěn)定時鐘 ch=0; for (i=0; i<8; i++) { adcck(); ch=(ch<<1)|adcdo; } adccs=1; return(ch); } /*------------------------------RS232 --------------------------*/ /*速率:1200b 使用定時器方式1 */ void rs232init(void) //通訊初始化 { TMOD=0x20; //設(shè)置1200B速率時的定時器1方式 TL1=0xe8; TH1=0xe8; //計算初值為1200B SCON=0xd8; //設(shè)定串口工作方式3 PCON=0x00; TR1=1; //定時器1有效 } //向串口發(fā)送一個字符 void send232c(unsigned char ch) { SBUF=ch; while(TI==0); TI=0; } //從串口收一個字符,非中斷 uchar rece232c(void) {uchar ch; while(RI==0); RI=0; ch=SBUF; return(ch); } //向串口發(fā)送一個字符串,strlen為該字符串長度 uchar rs232t(uchar *str,strlen) { uchar k=0,ch; do { send232c(*(str + k)); k++; } while(k < strlen); //發(fā)strlen個字符 send232c('}'); //發(fā)校驗(yàn)碼 ch=rece232c(); //等上位機(jī)校驗(yàn) return(ch); } /*------------------------------RS232 --------------------------*/ |