基于STC89C52RC的TSL2561調(diào)試程序_第1頁
基于STC89C52RC的TSL2561調(diào)試程序_第2頁
基于STC89C52RC的TSL2561調(diào)試程序_第3頁
基于STC89C52RC的TSL2561調(diào)試程序_第4頁
基于STC89C52RC的TSL2561調(diào)試程序_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、/Config.h文件/#ifndef _CONFIG_H#define _CONFIG_H/* 通用頭文件 */#include #include /* 數(shù)據(jù)類型定義 */*typedef signed char int8; / 8位有符號整型數(shù)typedef signed int int16; /16位有符號整型數(shù)typedef signed long int32; /32位有符號整型數(shù) */typedef unsigned char u8; / 8位無符號整型數(shù)typedef unsigned int u16; /16位無符號整型數(shù)typedef unsigned long u32; /

2、32位無符號整型數(shù)/* 全局運(yùn)行參數(shù)定義 */#define SYS_MCLK (11059200/12) /系統(tǒng)主時(shí)鐘頻率,即振蕩器頻率12/* IO引腳分配定義 sbit KEY_IN_1 = P24; /矩陣按鍵的掃描輸入引腳1sbit KEY_IN_2 = P25; /矩陣按鍵的掃描輸入引腳2sbit KEY_IN_3 = P26; /矩陣按鍵的掃描輸入引腳3sbit KEY_IN_4 = P27; /矩陣按鍵的掃描輸入引腳4sbit KEY_OUT_1 = P23; /矩陣按鍵的掃描輸出引腳1sbit KEY_OUT_2 = P22; /矩陣按鍵的掃描輸出引腳2sbit KEY_OU

3、T_3 = P21; /矩陣按鍵的掃描輸出引腳3sbit KEY_OUT_4 = P20; /矩陣按鍵的掃描輸出引腳4 */sbit ADDR0 = P10; /LED位選譯碼地址引腳0sbit ADDR1 = P11; /LED位選譯碼地址引腳1sbit ADDR2 = P12; /LED位選譯碼地址引腳2sbit ADDR3 = P13; /LED位選譯碼地址引腳3sbit ENLED = P14; /LED顯示部件的總使能引腳#define LCD12864_DB P0 /1602液晶數(shù)據(jù)端口sbit LCD12864_RES = P10; /1602液晶指令/數(shù)據(jù)選擇引腳sbit LC

4、D12864_RW = P11; /1602液晶讀寫引腳sbit LCD12864_EN = P15; /1602液晶使能引腳sbit DS1302_CE = P17; /DS1302片選引腳sbit DS1302_CK = P35; /DS1302通信時(shí)鐘引腳sbit DS1302_IO = P34; /DS1302通信數(shù)據(jù)引腳sbit I2C_SCL = P27; /I2C總線時(shí)鐘引腳sbit I2C_SDA = P26; /I2C總線數(shù)據(jù)引腳sbit BUZZER = P16; /蜂鳴器控制引腳sbit IO_18B20 = P32; /DS18B20通信引腳sbit IR_INPUT

5、= P33; /紅外接收引腳#include LCD12864.H#include I2C.H#include TSL2561.h#endif/I2C通信協(xié)議/#include config.h#define I2CDelay() _nop_();_nop_();_nop_();_nop_();/* 產(chǎn)生總線起始信號 */void I2CStart() I2C_SDA = 1; /首先確保SDA、SCL都是高電平 I2C_SCL = 1; I2CDelay(); I2C_SDA = 0; /先拉低SDA I2CDelay(); I2C_SCL = 0; /再拉低SCL/* 產(chǎn)生總線停止信號 *

6、/void I2CStop() I2C_SCL = 0; /首先確保SDA、SCL都是低電平 I2C_SDA = 0; I2CDelay(); I2C_SCL = 1; /先拉高SCL I2CDelay(); I2C_SDA = 1; /再拉高SDA I2CDelay();/* I2C總線寫操作,dat-待寫入字節(jié),返回值-從機(jī)應(yīng)答位的值 */bit I2CWrite(unsigned char dat) bit ack; /用于暫存應(yīng)答位的值 unsigned char mask; /用于探測字節(jié)內(nèi)某一位值的掩碼變量 for (mask=0x80; mask!=0; mask=1) /從高位

7、到低位依次進(jìn)行 if (mask&dat) = 0) /該位的值輸出到SDA上 I2C_SDA = 0; else I2C_SDA = 1; I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL,完成一個(gè)位周期 I2C_SDA = 1; /8位數(shù)據(jù)發(fā)送完后,主機(jī)釋放SDA,以檢測從機(jī)應(yīng)答 I2CDelay(); I2C_SCL = 1; /拉高SCL ack = I2C_SDA; /讀取此時(shí)的SDA值,即為從機(jī)的應(yīng)答值 I2CDelay(); I2C_SCL = 0; /再拉低SCL完成應(yīng)答位,并保持住總線 retur

8、n (ack); /應(yīng)答值取反以符合通常的邏輯: /0=不存在或忙或?qū)懭胧。?=存在且空閑或?qū)懭氤晒?* I2C總線讀操作,并發(fā)送非應(yīng)答信號,返回值-讀到的字節(jié) */unsigned char I2CReadNAK() unsigned char mask; unsigned char dat; I2C_SDA = 1; /首先確保主機(jī)釋放SDA for (mask=0x80; mask!=0; mask=1) /從高位到低位依次進(jìn)行 I2CDelay(); I2C_SCL = 1; /拉高SCL if(I2C_SDA = 0) /讀取SDA的值 dat &= mask; /為0時(shí),dat中

9、對應(yīng)位清零 else dat |= mask; /為1時(shí),dat中對應(yīng)位置1 I2CDelay(); I2C_SCL = 0; /再拉低SCL,以使從機(jī)發(fā)送出下一位 I2C_SDA = 1; /8位數(shù)據(jù)發(fā)送完后,拉高SDA,發(fā)送非應(yīng)答信號 I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL完成非應(yīng)答位,并保持住總線 return dat;/* I2C總線讀操作,并發(fā)送應(yīng)答信號,返回值-讀到的字節(jié) *unsigned char I2CReadACK() unsigned char mask; unsigned char

10、 dat; I2C_SDA = 1; /首先確保主機(jī)釋放SDA for (mask=0x80; mask!=0; mask=1) /從高位到低位依次進(jìn)行 I2CDelay(); I2C_SCL = 1; /拉高SCL if(I2C_SDA = 0) /讀取SDA的值 dat &= mask; /為0時(shí),dat中對應(yīng)位清零 else dat |= mask; /為1時(shí),dat中對應(yīng)位置1 I2CDelay(); I2C_SCL = 0; /再拉低SCL,以使從機(jī)發(fā)送出下一位 I2C_SDA = 0; /8位數(shù)據(jù)發(fā)送完后,拉低SDA,發(fā)送應(yīng)答信號 I2CDelay(); I2C_SCL = 1;

11、/拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL完成應(yīng)答位,并保持住總線 return dat; */LCD12864顯示/#include config.hu8 zhbuf=預(yù)覽; /中文數(shù)組u8 ehbuf=yulan; /英文字符數(shù)組u8 code imbuf= /圖片碼128*64 寬16,高320x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,;/*寫等待*/void Write_Ready()u8 sta=0;LCD12864_RES = 0;

12、LCD12864_RW = 1;doLCD12864_EN = 1;sta = P0;LCD12864_EN = 0;while(sta&0x80);/*讀RAM中數(shù)據(jù)*/u8 Read_12864_RAM()u8 ram=0;LCD12864_RES = 1;LCD12864_RW = 1;LCD12864_EN = 1;ram = P0;LCD12864_EN = 0;return ram;/*寫指令*/void Write_12864_Cmd(u8 cmd)Write_Ready();LCD12864_RES = 0;LCD12864_RW = 0;P0 = cmd;LCD12864_E

13、N = 1;LCD12864_EN = 0;/*寫數(shù)據(jù)*/void Write_12864_Dat(u8 dat)Write_Ready();LCD12864_RES = 1;LCD12864_RW = 0;P0 = dat;LCD12864_EN = 1;LCD12864_EN = 0;/*設(shè)置起始坐標(biāo)*/void Set_DDRAM_XY(u8 x,u8 y)if(x=7)x=7;if(y=3)y=3;switch(y)case 0:Write_12864_Cmd(0x80+x);break;case 1:Write_12864_Cmd(0x90+x);break;case 2:Write

14、_12864_Cmd(0x88+x);break;case 3:Write_12864_Cmd(0x98+x);break;default : break;/*顯示連續(xù)的2個(gè)字符*/void Show_Double_12864_Char(u8 x,u8 y,u8 *c)Set_DDRAM_XY(x,y);Write_12864_Dat(*c);Write_12864_Dat(*(c+1); /*顯示單個(gè)字符*/void Show_Single_12864_Char(u8 x,u8 y,u8 *c)Set_DDRAM_XY(x,y);Write_12864_Dat(*c); /*顯示中文字符串*

15、/void Show_12864_ZH(u8 x,u8 y,u8 *zh)u8* p=zh;Set_DDRAM_XY(x,y);while(*p)!=0)Write_12864_Dat(*p+);/*顯示一串?dāng)?shù)值*/*u8 dec 小數(shù)位 為0不顯示小數(shù)*/void Show_12864_NUM(u8 x,u8 y,u8 dec,u16 num)u8 i;u8 numbuf6;for(i=0;num;i+)numbufi=num%10+0;num/=10;Set_DDRAM_XY(x,y);for(;i;i-)if(i=dec)Write_12864_Dat(0X2E); /顯示小數(shù)點(diǎn)Writ

16、e_12864_Dat(*(numbuf+(i-1); /顯示數(shù)值/*顯示英文字符串*/void Show_12864_EH(u8 x,u8 y,u8 *eh)u8* p=eh;Set_DDRAM_XY(x,y);while(*p)!=0)Write_12864_Dat(*p+);/*顯示圖案*/void Show_12864_IM(u8 code *im)unsigned char x,y,i;unsigned int tmp=0;for(i=0;i9;) /分兩屏,上半屏和下半屏,因?yàn)槠鹗嫉刂凡煌?,需要分開for(x=0;x32;x+) /32行Write_12864_Cmd(0x34);

17、Write_12864_Cmd(0x80+x);/列地址Write_12864_Cmd(0x80+i);/行地址,下半屏,即第三行地址0X88Write_12864_Cmd(0x30);for(y=0;y16;y+)Write_12864_Dat(imtmp+y);/讀取數(shù)據(jù)寫入LCDtmp+=16;i+=8;Write_12864_Cmd(0x36);/擴(kuò)充功能設(shè)定Write_12864_Cmd(0x30); /*初始化12864*/void Init_Lcd12864()Read_12864_RAM();Show_Single_12864_Char(0,0,A);Show_Double_1

18、2864_Char(0,0,AB);Show_12864_NUM(0,0,1,123);Show_12864_ZH(0,0,預(yù)覽);Show_12864_EH(0,0,yulan);Show_12864_IM(imbuf); Write_12864_Cmd(0X30);/8位數(shù)據(jù),基本指令 Write_12864_Cmd(0X0C);/開顯示,關(guān)游標(biāo) Write_12864_Cmd(0X01);/清屏 Write_12864_Cmd(0X02);/地址歸位 Write_12864_Cmd(0X80);/設(shè)置DDRAM地址/TSL2561代碼/#include config.h/*初始化TSL2

19、561*/void Init_TSL2561()TSL2561_Write(0X80|TSL2561_CONTROL,0x03); /選擇控制寄存器/工作模式TSL2561_Write(0X80|TSL2561_TIME,0x01); /選擇轉(zhuǎn)換時(shí)間控制寄存器/*讀TSL2561寄存器中的數(shù)據(jù),addr是寄存器地址*/u8 TSL2561_Read(u8 addr)u8 lx=0;I2CStart();I2CWrite(TSL2561_WR); /選擇TSL2561I2CWrite(0X80|addr); /選擇寄存器I2CStart();I2CWrite(TSL2561_RD);lx=I2C

20、ReadNAK(); /讀取寄存器中的值I2CStop();return lx;/*寫TSL2561命令或數(shù)據(jù),addr是寄存器地址*/void TSL2561_Write(u8 addr,u8 cmd)I2CStart();I2CWrite(TSL2561_WR); /選擇TSL2561寫操作I2CWrite(0X80|addr); /選擇寄存器I2CWrite(cmd); /寫入命令或數(shù)據(jù)I2CStop();/*讀取光強(qiáng)*/u16 TSL_Read_LX()u8 lxl=0,lxh=0,lxp=0;double lx=0;u16 ch0=0,ch1=0;lxl=TSL2561_Read(TSL2561_DATA0_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論