1、/*-DS1302相关声明-*/char TAB_1302= 0x00,0x40,0x09,0x10,0x07,0x00,0x12; /秒:分:时:日:月:星期:年.uchar code TAB_XQ=一二三四五六日/把DS1302数字日期转换为中文字符.sbit T_CLK=P14; /* 实时时钟的时钟线引脚*/sbit T_IO=P15; /* 实时时钟的数据线*/sbit T_RST=P16; /* 实时时钟的复位线引脚*/uchar bdata datbyte;sbit datbyte0=datbyte0;sbit datbyte7=datbyte7; /*-18B20相关声明-*/
2、uchar dis116;sbit DQ=P10; /*DS18B20温度检测*/ /*-键盘相关声明-*/sbit key=P35; /功能键sbit key1=P33; /自加“+”键sbit key2=P34; /自减“-”键uchar sum,keyflag=0; /调用时,分,秒,标志,调用键盘处理标志./*-以下为LCD12864相关函数-*/* 函数名称:void delay1ms(uint x)函数功能: 延时1MS*/ void delay1ms(uint x) uint i,j; for(i=0;ix;i+) for(j=0;j120;j+); /*void w_12864
3、byte(uchar byte) 写字节*/ void w_12864byte(uchar byte) uchar i; psb=0;8; sck=0; byte=1; sid=CY; sck=1; uchar r_12864byte(void) 读字节 uchar r_12864byte(void) uchar i,temp1,temp2; temp1 = 0; temp2 = 0; temp1=temp11; sck = 0; sck = 1; if(sid) temp1+; temp2=temp2 if(sid) temp2+; return (0xf0&temp1)+(0x0f&tem
4、p2);void c_12864busy( void ) 检测忙函数 void c_12864busy( void ) do w_12864byte(0xfc); /11111,RW(1),RS(0),0 while(0x80&r_12864byte();void w_12864(bit dat_com,uchar byt) 写入函数 void w_12864(bit dat_com,uchar byt) uchar temp; if(dat_com=0) /为零,写入指令 temp=0xf8; /11111,RS(0),RW(0),0 else /否则,写入数据 temp=0xfa; /11
5、111,RS(1),RW(0),0 cs=1; c_12864busy(); w_12864byte(temp); w_12864byte(byt&0xf0); /写入高四位 w_12864byte(bytuchar r_1302byte(void)读一个字节(下降沿) uchar r_1302byte(void) datbyte=0; datbyte7=T_IO; /读最低位 return(datbyte);void write_1302(uchar addr,uchar date) 指定位置写数据*/ void write_1302(uchar addr,uchar date) T_RST
6、=0; T_RST=1; w_1302byte(addr); w_1302byte(date);uchar read_1302(uchar addr) 指定位置读数据 uchar read_1302(uchar addr) uchar dat1,dat2,temp; temp=r_1302byte(); dat1=temp/16; dat2=temp%16; temp=dat1*10+dat2; return(temp);void init_1302(void) 初始化*/ uchar addr=0x80; write_1302(0x8e,0x00);7; write_1302(addr,TA
7、B_1302i); addr+=2; write_1302(0x8e,0x80);/*void get_1302(void) 功能说明:读取DS1302时钟信息.*/ void get_1302(void) uchar i,addr=0x81; TAB_1302i=read_1302(addr);/*-以下为18B20相关函数-*/*void delay (uint x) 若机器周期为1us,则本延时程序为延时 4*x(us) */ void delay (uint x) /本板延时8us while (-x);/*uchar bus_rest(void) 产生单总线系统信号的总线复位信号,并
8、返回总线上是否存在单总线器件信息 uchar bus_rest(void) uchar k; DQ=0; /将DQ信号线拉低 delay(29); /持续48US DQ=1; /释放总线 delay(3); /等待从设备将总线拉低 k=DQ; /保存当前总线状态 delay(25); /等待总线初始化过程结束 return k;/返回是否有从设备将总线拉低 uchar r_1820BYTE(void) 向单总线读取一个数据字节 uchar r_1820BYTE(void) uchar i=0; uchar date = 0; for (i=8;i0;i-) DQ = 0; / 将DQ信号线拉低
9、启动读时隙 / 释放总线,等待从机动车辆返回数据位 delay(1); /越接近15us越好; 准备采样总线上的信号 date=1 ; if (DQ) date=date|0x80; delay(6); return(date);void w_1280Byte(uchar bytevalue) 向单总线写一个数据字节 void w_1280Byte(uchar bytevalue) / 将DQ信号线拉低启动读时隙 DQ=bytevalue&0x01; / delay(5);/等待写时隙结束 /释放 bytevalue /等待写时隙结束uint read_T(void) 读取1820温度 */
10、uint read_T(void) uchar a=0; uchar b=0; uint t=0; bus_rest(); w_1280Byte(0xCC); / 跳过读序号列号的操作 ; w_1280Byte(0x44); / 启动温度转换,模数转化; /跳过读序号列号的操作 ; w_1280Byte(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度 ; a=r_1820BYTE();/ 低8位 b=r_1820BYTE();/ 高8位 t=(b*256)+a; return(t);void show_T(uint temp)显示温度 void show_T(uint t
11、emp) int i; float ftemp; ftemp = temp* 0.0625; sprintf(dis1,%f,ftemp);/把温度值写入数组内存 w_12864(com,0x98+3);5; w_12864(dat,dis1i); /写入温度/*-以下为显示相关函数-*/ /* void fenli(uchar x,uchar y,uchar val) 指定位置写入数据*/void fenli(uchar x,uchar y,uchar val) uchar ge,shi,addr,i=0; if(val=5)/这里把星期数字显示的转换为中文 w_12864(com,0x88
12、+2);2; /一个汉字写两次 if(TAB_13025=0)w_12864(dat,TAB_XQi); if(TAB_13025=1)w_12864(dat,TAB_XQ2+i); / if(TAB_13025=2)w_12864(dat,TAB_XQ3+i); /?星期三显示有问题 if(TAB_13025=3)w_12864(dat,TAB_XQ5+i); if(TAB_13025=4)w_12864(dat,TAB_XQ7+i); if(TAB_13025=5)w_12864(dat,TAB_XQ9+i); if(TAB_13025=6)w_12864(dat,TAB_XQ11+i);
13、 else shi=TAB_1302val/10;/分离十位 ge=TAB_1302val%10; if(x=1)x=0x80; if(x=2)x=0x90; if(x=3)x=0x88; if(x=4)x=0x98; addr=x+y; w_12864(com,addr);/指定位置 w_12864(dat,0x30+shi);/写入 w_12864(dat,0x30+ge);/*void display(void) 显示函数 get_1302(); /读1302 fenli(3,7,0); /读秒 fenli(3,5,1); /读分 fenli(3,3,2); /读时 fenli(2,5,
14、3); /读日 fenli(2,3,4); /读月 fenli(3,2,5); /读星期 fenli(2,1,6); /读年/*-按键处理相关函数-*/ /*void scanner() 按键函数*/ void scanner() uchar i,j; if(!key) /功能键按下 delay1ms(500); /延时500MSkey) /还按下,退出时间调整 keyflag=0; /标志位为0 sum=0; /清0/清闪烁 for(i=0;i+)/十进制转十六进制 j=TAB_1302i/10; TAB_1302i=TAB_1302i%10; TAB_1302i=TAB_1302i+16*j; init_1302(); /写入1302 while(!key); /等待释放 delay1ms(10); /延时消抖 e
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1