ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:18.18KB ,
资源ID:7290929      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7290929.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于STC89C52RC的TSL2561调试程序.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于STC89C52RC的TSL2561调试程序.docx

1、基于STC89C52RC的TSL2561调试程序/Config.h文件/#ifndef _CONFIG_H#define _CONFIG_H/* 通用头文件 */#include #include /* 数据类型定义 */*typedef signed char int8; / 8位有符号整型数typedef signed int int16; /16位有符号整型数typedef signed long int32; /32位有符号整型数 */typedef unsigned char u8; / 8位无符号整型数typedef unsigned int u16; /16位无符号整型数type

2、def unsigned long u32; /32位无符号整型数/* 全局运行参数定义 */#define SYS_MCLK (11059200/12) /系统主时钟频率,即振荡器频率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;

3、/矩阵按键的扫描输出引脚2sbit KEY_OUT_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液晶数据端口sbit LCD12864_RES = P10;

4、 /1602液晶指令/数据选择引脚sbit LCD12864_RW = P11; /1602液晶读写引脚sbit LCD12864_EN = P15; /1602液晶使能引脚sbit DS1302_CE = P17; /DS1302片选引脚sbit DS1302_CK = P35; /DS1302通信时钟引脚sbit DS1302_IO = P34; /DS1302通信数据引脚sbit I2C_SCL = P27; /I2C总线时钟引脚sbit I2C_SDA = P26; /I2C总线数据引脚sbit BUZZER = P16; /蜂鸣器控制引脚sbit IO_18B20 = P32; /D

5、S18B20通信引脚sbit IR_INPUT = P33; /红外接收引脚#include LCD12864.H#include I2C.H#include TSL2561.h#endif/I2C通信协议/#include config.h#define I2CDelay() _nop_();_nop_();_nop_();_nop_();/* 产生总线起始信号 */void I2CStart() I2C_SDA = 1; /首先确保SDA、SCL都是高电平 I2C_SCL = 1; I2CDelay(); I2C_SDA = 0; /先拉低SDA I2CDelay(); I2C_SCL =

6、 0; /再拉低SCL/* 产生总线停止信号 */void I2CStop() I2C_SCL = 0; /首先确保SDA、SCL都是低电平 I2C_SDA = 0; I2CDelay(); I2C_SCL = 1; /先拉高SCL I2CDelay(); I2C_SDA = 1; /再拉高SDA I2CDelay();/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */bit I2CWrite(unsigned char dat) bit ack; /用于暂存应答位的值 unsigned char mask; /用于探测字节内某一位值的掩码变量 for (mask=0x8

7、0; mask!=0; mask=1) /从高位到低位依次进行 if (mask&dat) = 0) /该位的值输出到SDA上 I2C_SDA = 0; else I2C_SDA = 1; I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL,完成一个位周期 I2C_SDA = 1; /8位数据发送完后,主机释放SDA,以检测从机应答 I2CDelay(); I2C_SCL = 1; /拉高SCL ack = I2C_SDA; /读取此时的SDA值,即为从机的应答值 I2CDelay(); I2C_SCL = 0; /

8、再拉低SCL完成应答位,并保持住总线 return (ack); /应答值取反以符合通常的逻辑: /0=不存在或忙或写入失败,1=存在且空闲或写入成功/* I2C总线读操作,并发送非应答信号,返回值-读到的字节 */unsigned char I2CReadNAK() unsigned char mask; unsigned char dat; I2C_SDA = 1; /首先确保主机释放SDA for (mask=0x80; mask!=0; mask=1) /从高位到低位依次进行 I2CDelay(); I2C_SCL = 1; /拉高SCL if(I2C_SDA = 0) /读取SDA的

9、值 dat &= mask; /为0时,dat中对应位清零 else dat |= mask; /为1时,dat中对应位置1 I2CDelay(); I2C_SCL = 0; /再拉低SCL,以使从机发送出下一位 I2C_SDA = 1; /8位数据发送完后,拉高SDA,发送非应答信号 I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL完成非应答位,并保持住总线 return dat;/* I2C总线读操作,并发送应答信号,返回值-读到的字节 *unsigned char I2CReadACK() unsigned

10、char mask; unsigned char dat; I2C_SDA = 1; /首先确保主机释放SDA for (mask=0x80; mask!=0; mask=1) /从高位到低位依次进行 I2CDelay(); I2C_SCL = 1; /拉高SCL if(I2C_SDA = 0) /读取SDA的值 dat &= mask; /为0时,dat中对应位清零 else dat |= mask; /为1时,dat中对应位置1 I2CDelay(); I2C_SCL = 0; /再拉低SCL,以使从机发送出下一位 I2C_SDA = 0; /8位数据发送完后,拉低SDA,发送应答信号 I

11、2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL完成应答位,并保持住总线 return dat; */LCD12864显示/#include config.hu8 zhbuf=预览; /中文数组u8 ehbuf=yulan; /英文字符数组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() u

12、8 sta=0; LCD12864_RES = 0; LCD12864_RW = 1; do LCD12864_EN = 1; sta = P0; LCD12864_EN = 0; while(sta&0x80);/*读RAM中数据*/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_RE

13、S = 0; LCD12864_RW = 0; P0 = cmd; LCD12864_EN = 1; LCD12864_EN = 0;/*写数据*/void Write_12864_Dat(u8 dat) Write_Ready(); LCD12864_RES = 1; LCD12864_RW = 0; P0 = dat; LCD12864_EN = 1; LCD12864_EN = 0;/*设置起始坐标*/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

14、);break; case 1:Write_12864_Cmd(0x90+x);break; case 2:Write_12864_Cmd(0x88+x);break; case 3:Write_12864_Cmd(0x98+x);break; default : break; /*显示连续的2个字符*/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); /*显示单个字符*/void Show_Single_12864_Char(

15、u8 x,u8 y,u8 *c) Set_DDRAM_XY(x,y); Write_12864_Dat(*c); /*显示中文字符串*/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+); /*显示一串数值*/*u8 dec 小数位 为0不显示小数*/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; n

16、um/=10; Set_DDRAM_XY(x,y); for(;i;i-) if(i=dec) Write_12864_Dat(0X2E); /显示小数点 Write_12864_Dat(*(numbuf+(i-1); /显示数值 /*显示英文字符串*/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 i

17、nt tmp=0; for(i=0;i9;) /分两屏,上半屏和下半屏,因为起始地址不同,需要分开 for(x=0;x32;x+) /32行 Write_12864_Cmd(0x34); Write_12864_Cmd(0x80+x);/列地址 Write_12864_Cmd(0x80+i); /行地址,下半屏,即第三行地址0X88 Write_12864_Cmd(0x30); for(y=0;y16;y+) Write_12864_Dat(imtmp+y);/读取数据写入LCD tmp+=16; i+=8; Write_12864_Cmd(0x36); /扩充功能设定 Write_12864

18、_Cmd(0x30); /*初始化12864*/void Init_Lcd12864() Read_12864_RAM(); Show_Single_12864_Char(0,0,A); Show_Double_12864_Char(0,0,AB); Show_12864_NUM(0,0,1,123); Show_12864_ZH(0,0,预览); Show_12864_EH(0,0,yulan); Show_12864_IM(imbuf); Write_12864_Cmd(0X30); /8位数据,基本指令 Write_12864_Cmd(0X0C); /开显示,关游标 Write_1286

19、4_Cmd(0X01); /清屏 Write_12864_Cmd(0X02); /地址归位 Write_12864_Cmd(0X80); /设置DDRAM地址/TSL2561代码/#include config.h/*初始化TSL2561*/void Init_TSL2561() TSL2561_Write(0X80|TSL2561_CONTROL,0x03); /选择控制寄存器 /工作模式 TSL2561_Write(0X80|TSL2561_TIME,0x01); /选择转换时间控制寄存器/*读TSL2561寄存器中的数据,addr是寄存器地址*/u8 TSL2561_Read(u8 ad

20、dr) u8 lx=0; I2CStart(); I2CWrite(TSL2561_WR); /选择TSL2561 I2CWrite(0X80|addr); /选择寄存器 I2CStart(); I2CWrite(TSL2561_RD); lx=I2CReadNAK(); /读取寄存器中的值 I2CStop(); return lx;/*写TSL2561命令或数据,addr是寄存器地址*/void TSL2561_Write(u8 addr,u8 cmd) I2CStart(); I2CWrite(TSL2561_WR); /选择TSL2561写操作 I2CWrite(0X80|addr);

21、/选择寄存器 I2CWrite(cmd); /写入命令或数据 I2CStop();/*读取光强*/u16 TSL_Read_LX() u8 lxl=0,lxh=0,lxp=0; double lx=0; u16 ch0=0,ch1=0; lxl=TSL2561_Read(TSL2561_DATA0_L); lxh=TSL2561_Read(TSL2561_DATA0_H); ch0=lxh*256+lxl; lxh=0,lxl=0; lxl=TSL2561_Read(TSL2561_DATA1_L); lxh=TSL2561_Read(TSL2561_DATA1_H); ch1=lxh*256

22、+lxl; lxp=(ch1*100)/ch0; if(0lxp)&(lxp=50) lx=0.0304*ch0-0.062*ch0*(ch1/ch0)/4); else if(50lxp)&(lxp=61) lx=0.0224*ch0-0.031*ch1; else if(61lxp)&(lxp=80) lx=0.0128*ch0-0.0153*ch1; else if(80lxp)&(lxp=130) lx=0.00146*ch0-0.00112*ch1; else if(130=30) ms-=5; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); void main() Init_Lcd12864(); Init_TSL2561(); while(1) Show_12864_NUM(0,0,0,TSL_Read_LX(); Show_12864_NUM(0,2,0,12345); delayms(1000); Write_12864_Cmd(0X01); /完/

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1