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