基于51单片机的智能窗帘的研究与设计(6)

2019-04-02 23:31

辽工大电子设计

uchar IICreceiveByte(void) {

uchar idata n=8; // 从SDA线上读取一上数据字节,共八位 uchar tdata=0; while(n--) {

SDA = 1; SCL = 1;

tdata =tdata<<1; //左移一位 if(SDA == 1) tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1 else tdata = tdata&0xfe; // 否则数据的最后一位置0 SCL = 0; }

return(tdata); }

void ADC_PCF8591(uchar controlbyte) {

uchar i=0; //idata: 单片机间接访问的片内RAM区,允许访问全部片内RAM iic_start();

IICSendByte(PCF8591_WRITE); //控制字 check_ACK(); if(askflag == 1) { SystemError = 1; return; }

IICSendByte(controlbyte); //控制字 check_ACK(); if(askflag == 1) { SystemError = 1; return; }

iic_start(); //重新发送开始命令 IICSendByte(PCF8591_READ); //控制字 check_ACK(); if(askflag == 1) { SystemError = 1;

辽工大电子设计

return; }

IICreceiveByte(); //空读一次,调整读顺序

slave_ACK(); //收到一个字节后发送一个应答位

//读四次,如果只启动一个通道,读一次就行读出值是16进制的 /* while(i<4) {

receive_da=IICreceiveByte(); receivebuf[i++]=receive_da;

slave_ACK(); //收到一个字节后发送一个应答位 } */

//读一次写法

receivebuf=IICreceiveByte();

slave_NOACK(); //收到最后一个字节后发送一个非应答位 iic_stop(); }

unsigned char BusyTest(void) {

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1;

E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0;

return result; }

void WriteInstruction (unsigned char dictate) {

while(BusyTest()==1); //如果忙就等待

RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, // 就是让E从0到1发生正跳变,所以应先置\

_nop_();

_nop_(); //空操作两个机器周期,给硬件反应时间

辽工大电子设计

P0=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }

void WriteAddress(unsigned char x) {

WriteInstruction(x|0x80); //显示位置的确定方法规定为\地址码x\ }

void WriteData(unsigned char y) {

while(BusyTest()==1);

RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, // 就是让E从0到1发生正跳变,所以应先置\ P0=y; //将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }

void LcdInitiate(void) {

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口

辽工大电子设计

delay(5); //延时5ms WriteInstruction(0x38); delay(5);

WriteInstruction(0x38); delay(5);

WriteInstruction(0x0c); delay(5);

WriteInstruction(0x06); delay(5);

WriteInstruction(0x01); delay(5); }

Init_DS18B20(void) {

DQ = 1 ;

DelayDelay(8) ;

DQ = 0 ;

DelayDelay(90) ;

DQ = 1 ;

DelayDelay(8) ;

presence = DQ ; //如果=0则初始化成功 =1则初始化失败 DelayDelay(100) ; DQ = 1 ;

return(presence) ; //返回信号,0=presence,1= no presence }

Disp_Temperature() {

display[4]=temp_data[0]&0x0f ;

display[0]=ditab[display[4]]+0x30 ;//查表得小数位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ; display[3]=display[4]/100+0x30 ; display[1]=display[4]0 ; display[2]=display[1]/10+0x30 ; display[1]=display[1]+0x30 ;

if(display[3]==0x30) //高位为0,不显示 {

display[3]=0x20 ;

if(display[2]==0x30) //次高位为0,不显示 display[2]=0x20 ;

辽工大电子设计

}

WriteAddress(0x48) ;

WriteData(display[3]) ; //百位数显示 WriteAddress(0x49) ;

WriteData(display[2]) ; //十位数显示 WriteAddress(0x4a) ;

WriteData(display[1]) ; //个位数显示 WriteAddress(0x4c) ;

WriteData(display[0]) ; //小数位数显示 }

void Compare() {

// bit tempflag1; // bit tempflag2; uint temp=0;

display[4]=temp_data[0]&0x0f ;

display[0]=ditab[display[4]];//查表得小数位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ; display[3]=display[4]/100 ; display[1]=display[4]0 ; display[2]=display[1]/10 ; display[1]=display[1] ;

temp=display[0]+display[1]*10+display[2]*100; if(settemp>temp) {

// tempflag1=1; fzflag2=1; }

//if((settemp

// tempflag2=1; // fzflag2=1; //// tempflag1=0; //} }

void Int0(void) interrupt 0 {

unsigned char j,k,N=0;

EX0 = 0; delay11(15); if (IR==1) { EX0 =1;

辽工大电子设计

return; }

while (!IR) {delay11(1);}

for (j=0;j<4;j++) {

for (k=0;k<8;k++) {

while (IR) {delay11(1);}

while (!IR) {delay11(1);}

while (IR) {

delay11(1);

N++; if (N>=30) { EX0=1;

return;}

} a[j]=a[j] >> 1; if (N>=8) {a[j] = a[j] | 0x80;} N=0; } }

if (a[2]!=~a[3]) { EX0=1; return; } beep(); HWPD();

EX0 = 1; }


基于51单片机的智能窗帘的研究与设计(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:朝阳沟油田原油集输系统分队计量技术探讨

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: