1、 temp=temp1; /temp中的各数据位右移一位,因为先读出的是高位数据 TH0=0; /定时器清0 TL0=0; TR0=1; /开启定时器T0 while(IR=0) /如果是低电平就等待 ; /低电平计时 TR0=0; /关闭定时器T0 LowTime=TH0*256+TL0; /保存低电平宽度 while(IR=1) /如果是高电平就等待 ; HighTime=TH0*256+TL0; /保存高电平宽度 if(LowTime640) return 0; /如果低电平长度不在合理范围,则认为出错,停止解码 if(HighTime420)&(HighTime7800)&(LowTi
2、me3600)&4700) /如果是引导码,就开始解码,否则放弃,引导码的低电平计时 /次数9000us/1.085=8294, 判断区间:83005007800,83005008800. if(DeCode()=1) Function(); /如果满足条件,执行遥控功能 /开启外中断EX0 /实例98:基于DS1302的日历时钟intrins.h /包含_nop_()函数定义的头文件/*以下是DS1302芯片的操作程序*/unsigned char code digit10=0123456789; /定义字符数组显示数字sbit DATA=P11; /位定义1302芯片的接口,数据输出端定义
3、在P1.1引脚sbit RST=P12; /位定义1302芯片的接口,复位端口定义在P1.1引脚sbit SCLK=P10; /位定义1302芯片的接口,时钟输出端口定义在P1.1引脚/*延时若干微秒入口参数:n*/ void delaynus(unsigned char n) unsigned char i;n;i+)向1302写一个字节数据xvoid Write1302(unsigned char dat) SCLK=0; /拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus(2); /稍微等待,使硬件做好准备i+) /连续写8个二进制位数据 DATA=dat&0x01; /取出
4、dat的第0位数据写入1302 delaynus(2); SCLK=1; /上升沿写入数据 SCLK=0; /重新拉低SCLK,形成脉冲 dat=1; /将dat的各数据位右移1位,准备写入下一个数据位根据命令字,向1302写一个字节数据Cmd,储存命令字;dat,储存待写的数据void WriteSet1302(unsigned char Cmd,unsigned char dat) RST=0; /禁止数据传递 /确保写数居前SCLK被拉低 RST=1; /启动数据传输 Write1302(Cmd); /写入命令字 Write1302(dat); /写数据 SCLK=1; /将时钟电平置于
5、已知状态从1302读一个字节数据 unsigned char Read1302(void) unsigned char i,dat;i+) /连续读8个二进制位数据 dat /将dat的各数据位右移1位,因为先读出的是字节的最低位 if(DATA=1) /如果读出的数据是1 dat|=0x80; /将1取出,写在dat的最高位 /将SCLK置于高电平,为下降沿读出 /稍微等待 /拉低SCLK,形成脉冲下降沿 return dat; /将读出的数据返回 根据命令字,从1302读取一个字节数据Cmdunsigned char ReadSet1302(unsigned char Cmd) unsig
6、ned char dat; /拉低RST dat=Read1302(); /读出数据 1302进行初始化设置void Init_DS1302(void) WriteSet1302(0x8E,0x00); /根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,(0/10)4|(0%10); /根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,(0/10) /根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,(12/10)4|(12%10); /根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,(1
7、6/10)4|(16%10); /根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,(11/10)4|(11%10); /根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,(8/10)4|(8%10);/*以下是对液晶模块的操作程序*/sbit RS=P20; /寄存器选择位,将RS位定义为P2.0引脚sbit RW=P21; /读写选择位,将RW位定义为P2.1引脚sbit E=P22; /使能信号位,将E位定义为P2.2引脚sbit BF=P07; /忙碌标志位,将BF位定义为P0.7引脚延时1ms(3j+2)*i=(333+2)10=101
8、0(微秒),可以认为是1毫秒*/void delay1ms()10; for(j=0;33;j+)延时若干毫秒 void delaynms(unsigned char n) delay1ms();判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙bit BusyTest(void) bit result; RS=0; /根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; /E=1,才允许读写 _nop_(); /空操作 /空操作四个机器周期,给硬件反应时间 result=BF; /将忙碌标志电平赋给result E=0; /将E恢复
9、低电平 return result;将模式设置指令或显示地址写入液晶模块dictatevoid WriteInstruction (unsigned char dictate) while(BusyTest()=1); /如果忙就等待 /根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; /E置低电平(根据表8-6,写指令时,E为高脉冲, / 就是让E从0到1发生正跳变,所以应先置0 /空操作两个机器周期,给硬件反应时间 P0=dictate; /将数据送入P0口,即写入指令或地址 /空操作四个机器周期,给硬件反应时间 /E置高电平 /当E由高电平跳变成低电平时,液晶模块开始执行命
10、令指定字符显示的实际地址 void WriteAddress(unsigned char x) WriteInstruction(x|0x80); /显示位置的确定方法规定为80H+地址码x将数据(字符的标准ASCII码)写入液晶模块y(为字符常量) void WriteData(unsigned char y) RS=1; /RS为高电平,RW为低电平时,可以写入数据 P0=y; /将数据送入P0口,即将数据写入液晶模块 _nop_();对LCD的显示模式进行初始化设置void LcdInitiate(void) delaynms(15); /延时15ms,首次写指令时应给LCD一段较长的反
11、应时间 WriteInstruction(0x38); /显示模式设置:162显示,57点阵,8位数据接口 delaynms(5); /延时5ms,给硬件一点反应时间 /连续三次,确保初始化成功 WriteInstruction(0x0c);显示开,无光标,光标不闪烁 WriteInstruction(0x06);光标右移,字符不移 WriteInstruction(0x01); /清屏幕指令,将以前的显示内容清除/*以下是1302数据的显示程序*/显示秒void DisplaySecond(unsigned char x) /j,k,l分别储存温度的百位、十位和个位 i=x/10;/取十位 j=x%10;/取个位 WriteAddress(0x49); /写显示地址,将在第2行第7列开始显示 WriteData(digiti); /将百位数字的字符常量写入LCD WriteData(digitj); /将十位数字的字符常量写入LCD delaynms(50); /延时1ms给硬件一点反应时间 显示分钟void DisplayMinute(unsigned char x) WriteAddress(0x46);