辽工大电子设计
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; }