|
用oled和ds1302搞了个半成品时钟(只能够看时间和温度不能调时间),然后我在我的STC89c52的单片机开发板上实验成功了,结果换到STC15W408AS上就出现了时间显示乱码和TT
补充:我把ds18b20和ds1302的程序全换成1T的了,不知道是不是改了以后ds1302的程序有bug。。。。。。
- #include "stc15f2k60s2.h"
- #include "intrins.h"
- #include "codetab.h"
- #include "LQ12864.h"
- #include "ds1302.h"
- #include "ds18b20.h"
- unsigned char code Address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位 读+1;写不加
- unsigned char code Table[12]="0123456789:-";
- unsigned char code Week[7][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
- unsigned char database[9];//时钟寄存器(时分秒)
- unsigned char Date[11];//日期寄存器(年月日)
- unsigned char Weekend[4];//星期寄存器
- unsigned char Temperature[7];//温度寄存器
- unsigned char l[7]={00,39,13,23,1,3,19};//秒分时日月周年08-05-15 12:00:00
- unsigned int temper;
- unsigned char Bits;//修改时间标志位
- unsigned char Bist[2];
- void SetRTC() /*设置时间*/
- {
- unsigned char i,tmp,*p;
- for(i=0;i<7;i++)
- {
- tmp=l[i]/10;
- l[i]=l[i]%10;
- l[i]=l[i]+tmp*16;
- }
- WriteData(0x8e,0x00);
- p=Address;
- for(i=0;i<7;i++)
- {
- WriteData(*p,l[i]);
- p++;
- }
- WriteData(0x8e,0x80);
- }
- void ReadRTC() /*读时钟*/
- {
- unsigned char i,*p;
- p=Address;
- for(i=0;i<7;i++)
- {
- l[i]=ReadData(*p+1);
- p++;
- }
- }
- void DisplayRTC()
- {
- database[0]=Table[l[2]/16];
- database[1]=Table[l[2]&0x0f];
- database[2]=Table[10];
- database[3]=Table[l[1]/16];
- database[4]=Table[l[1]&0x0f];
- database[5]=Table[10];
- database[6]=Table[l[0]/16];
- database[7]=Table[l[0]&0x0f];
- Date[0]=Table[2];
- Date[1]=Table[0];
- Date[2]=Table[l[6]/16];
- Date[3]=Table[l[6]&0x0f];
- Date[4]=Table[11];
- Date[5]=Table[l[4]/16];
- Date[6]=Table[l[4]&0x0f];
- Date[7]=Table[11];
- Date[8]=Table[l[3]/16];
- Date[9]=Table[l[3]&0x0f];
- Weekend[0]=Week[l[5]-1][0];
- Weekend[1]=Week[l[5]-1][1];
- Weekend[2]=Week[l[5]-1][2];
- Temperature[0]=Table[temper/100];
- Temperature[1]=Table[temper%100/10];
- Temperature[2]='.';
- Temperature[3]=Table[temper%10];
- Temperature[4]='^';
- Temperature[5]='C';
- Bist[0]=Table[Bits];
- OLED_P8x16Str(32,2,database);
- OLED_P8x16Str(16,4,Date);
- OLED_P8x16Str(8,6,Weekend);
- OLED_P8x16Str(64,6,Temperature);
- OLED_P6x8Str(112,4,Bist);
- }
- void Tempchange()
- {
- DS18B20_Reset(); //设备复位
- DS18B20_WriteByte(0xCC); //跳过ROM命令
- DS18B20_WriteByte(0x44); //开始转换命令
- // while (!DQ); //等待转换完成
- }
- unsigned int Tempread()
- {
- unsigned char TPH,TPL; //存放温度值的高字节
- unsigned int temp;
- float tt;
- DS18B20_Reset(); //设备复位
- DS18B20_WriteByte(0xCC); //跳过ROM命令
- DS18B20_WriteByte(0xBE); //读暂存存储器命令
- TPL = DS18B20_ReadByte(); //读温度低字节
- TPH = DS18B20_ReadByte(); //读温度高字节
- temp=TPH;
- temp<<=8;
- temp=temp|TPL;
- tt=temp*0.0625;
- temp=tt*10+0.5;
- return(temp);
- }
- void main()
- {
- unsigned char i;
- database[8]='\0';
- Date[10]='\0';
- Weekend[3]='\0';
- Temperature[6]='\0';
- Bist[1]='\0';
- OLED_Init();
- //SetRTC();
- for(i=0;i<8;i++)
- {
- OLED_P16x16Ch(i*16,0,i);
- }
- while(1)
- {
- unsigned char k;
- Tempchange();
- for(k=0;k<25;k++)
- {
- ReadRTC();
- DisplayRTC();
- }
- temper=Tempread();
- }
- }
复制代码 |
|