找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4935|回复: 7
打印 上一主题 下一主题
收起左侧

单片机+ds1302+dht11+无字库12864带温湿度的电子钟(程序+仿真)

  [复制链接]
跳转到指定楼层
楼主
        内容如题,可以调节时间,没有闹钟之类的,程序其实也是拼凑出来的,有很多问题,之后我会重新理解,然后重新写过,再加些功能。        现在这个就当做是我开始学习的一个记录吧。
        现在最主要的问题就是显示的时候字符相互之间有些冲突,导致有些地方显示不太全,还有大数字变化速度有点慢,以后可能会把秒针改小。
        若是大家有解决方案的话,不妨帮帮我,多谢了。



单片机源程序如下:
  1. //-------------------------------------
  2. // 名称:用DS1302与12864LCD设计的可调电子日历与时钟
  3. //---------------------------------------
  4. // 说明:本例运行时会以PC时间表为默认时间开始,运行过程中可以通过K1键
  5. //       选择调节对象,所选中的调整对象会反白显示,用K2,K3键进行加减,用K4键保存。
  6. //       本例会自动将时间调节控制为合法日期时间,对于星期的调节会
  7. //        在调整年月日时自动完成,闰年问题也会自动判断。
  8. //-------------------------------------------
  9. #include <reg51.h>
  10. #include <intrins.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define LCD_DB_PORT P0             // 液晶数据线端口DB0-DB7
  14. #define LCD_START_ROW 0xc0         //起始行命令
  15. #define LCD_PAGE 0xB8                 //页指令
  16. #define LCD_COL  0x40                 //列指令
  17. bit Reverse_Display=0;//是否反相显示(白底黑字/黑底白字)
  18. //液晶引脚定义
  19. sbit SDA=P1^0;          //DS1302数据线
  20. sbit CLK=P1^1;          //DS1302时钟线
  21. sbit RST=P1^2;          //DS1302复位线
  22. sbit DI=P2^0;
  23. sbit RW=P2^1;
  24. sbit E=P2^2;
  25. sbit CS1=P2^3;
  26. sbit CS2=P2^4;
  27. sbit CS3=P2^2;

  28. char Adjust_Index=-1;  //当前调节的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)
  29. uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};   // 一年中每个月的天数,二月的天数由年份决定
  30. uchar DateTime[7];//所读取的日期时间
  31. //DS1302函数声明
  32. void Write_Byte_TO_DS1302(uchar X); // 向DS1302写入一个字节
  33. uchar Read_Byte_FROM_DS1302();                //从DS1302中读取一个字节
  34. uchar Read_Data_FROM_DS1302(uchar addr);  //从DS1302指定位置读取数据        , 读数据
  35. void Write_Data_TO_DS1302(uchar addr,uchar dat);  // 向DS1302指定位置写入数据, 写数据
  36. void SET_DS1302();          //设置时间
  37. void GetTime();                  //读取当前时间
  38. uchar Is_Leapyear(uint year); //判断是否为闰年
  39. //12864LCD函数
  40. void dht11();
  41. extern void LCD12864_Initialization();
  42. extern void Display_char(uchar P1,uchar L1,uchar *M) reentrant;
  43. extern void Display_Word(uchar P2,uchar L2,uchar *M) reentrant;
  44. extern void Datetime_Adjust(char X);
  45. extern void SET_DS1302();          //  设置时间
  46. //函数声明
  47. void Initialization();//初始化函数
  48. extern bit Reverse_Display;//是否反相显示(白底黑字/黑底白字)
  49. extern uchar code Digits[];
  50. extern uchar code WEEK_WORDS[];
  51. extern uchar code Digits[];
  52. extern uchar code DATE_TIME_WORDS[];
  53. extern char Adjust_Index;  //当前调节的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)
  54. extern uchar MonthsDays[];   // 一年中每个月的天数,二月的天数由年份决定
  55. extern uchar DateTime[7];//所读取的日期时间
  56. sbit k1=P3^4;           //选择按键
  57. sbit k2=P3^5;           //加
  58. sbit k3=P3^6;           //减
  59. sbit k4=P3^7;           //确定
  60. uchar tcount=0;       
  61. //水平与垂直偏移       
  62. uchar H_Offset=0;       
  63. uchar V_page_Offset=0;

  64. //---------------------------------------------------------------
  65. //        检查LCD是否忙
  66. //--------------------------------------------------------------
  67. bit LCD_IS_BUSY()
  68. {
  69.           LCD_DB_PORT=0xFF;
  70.         RW=1;
  71.         _nop_();
  72.         DI=0;
  73.         E=1;
  74.         _nop_();
  75.         E=0;
  76.         return (bit)(P0&0x80);
  77. }
  78. //---------------------------------------------------------------
  79. //        向LCD写入一个字节(一般用于发送命令)
  80. //--------------------------------------------------------------
  81. void Write_Byte_To_LCD(uchar comand)
  82. {
  83.    while(LCD_IS_BUSY());  
  84.    LCD_DB_PORT=0xFF;
  85.    RW=0;
  86.    _nop_();
  87.    DI=0;
  88.    LCD_DB_PORT=comand;
  89.    E=1;
  90.    _nop_();
  91.    E=0;
  92. }
  93. //---------------------------------------------------------------
  94. //        向LCD写入数据
  95. //--------------------------------------------------------------
  96. void Write_Data_To_LCD(uchar dat)
  97. {
  98.    while(LCD_IS_BUSY());  
  99.    LCD_DB_PORT=0xFF;
  100.    RW=0;
  101.    _nop_();
  102.    DI=1;
  103.    if(!Reverse_Display)           //根据Reverse_Display决定是否反相显示
  104.        LCD_DB_PORT=dat;
  105.    else
  106.       LCD_DB_PORT=~dat;
  107.    E=1;
  108.    _nop_();
  109.    E=0;
  110. }

  111. //********************************************************************
  112. //1MS为单位的延时程序,不准确
  113. //********************************************************************
  114. void lcd_delay_ms(unsigned char m)
  115. {
  116.     unsigned char n;
  117.     while(m--){
  118.         for(n=0;n<125;n++)
  119.             {;}
  120.         }   
  121. }

  122. //---------------------------------------------------------------
  123. //        初始化LCD
  124. //--------------------------------------------------------------
  125. void LCD12864_Initialization()
  126. {
  127.   CS1=1;
  128.   CS2=1;
  129.   Write_Byte_To_LCD(0x38);
  130.         lcd_delay_ms(10);
  131.   Write_Byte_To_LCD(0x0F);
  132.         lcd_delay_ms(10);
  133.   Write_Byte_To_LCD(0x06);
  134.         lcd_delay_ms(10);
  135. //  Write_Byte_To_LCD(LCD_START_ROW);
  136.   Write_Byte_To_LCD(0x01);
  137.         lcd_delay_ms(10);
  138. }
  139. //---------------------------------------------------------------
  140. //        通用显示函数  从第P页第L列显示W个字节数据,具体显示的数据在r所指的数组中
  141. //--------------------------------------------------------------
  142. void LCD_Show(uchar P,uchar L,uchar W,uchar *r) reentrant
  143. {
  144.     uchar i;
  145.         if(L<64)
  146.                   {
  147.                     CS1=1;
  148.                 CS2=0;
  149.                         Write_Byte_To_LCD(LCD_PAGE+P);
  150.                         Write_Byte_To_LCD(LCD_COL+L);
  151.                         if(L+W<64)
  152.                           {
  153.                             for(i=0;i<W;i++)
  154.                                    Write_Data_To_LCD(r[i]);
  155.                           }
  156.                         else
  157.                           {
  158.                             for(i=0;i<64-L;i++)
  159.                                           Write_Data_To_LCD(r[i]);
  160.                                 CS1=0;
  161.                     CS2=1;
  162.                                 Write_Byte_To_LCD(LCD_PAGE+P);
  163.                             Write_Byte_To_LCD(LCD_COL);
  164.                                 for(i=64-L;i<W;i++)
  165.                                           Write_Data_To_LCD(r[i]);
  166.                           }
  167.                    }
  168.         else
  169.           {
  170.                     CS1=0;
  171.             CS2=1;
  172.                         Write_Byte_To_LCD(LCD_PAGE+P);
  173.                     Write_Byte_To_LCD(LCD_COL+L-64);
  174.                         for(i=0;i<W;i++)
  175.                                   Write_Data_To_LCD(r[i]);
  176.           }
  177. }
  178. //---------------------------------------------------------------
  179. // 显示一个8×16点阵字符
  180. //--------------------------------------------------------------
  181. void Display_char(uchar P1,uchar L1,uchar *M) reentrant
  182. {
  183.    LCD_Show(P1,L1,8,M);
  184.    LCD_Show(P1+1,L1,8,M+8);
  185. }
  186. //--------------------------------------------------------------------
  187. // 显示一个16×16点阵字符 (汉字上半部分与下半部分分别处在相邻两页中)
  188. //----------------------------------------------------------------------
  189. void Display_Word(uchar P2,uchar L2,uchar *M) reentrant
  190. {                                                                                         
  191.    LCD_Show(P2,L2,16,M);
  192.    LCD_Show(P2+1,L2,16,M+16);
  193. }
  194. //--------------------------------------------------------------------
  195. // 显示一个16×32点阵字符 (汉字上半部分与下半部分分别处在相邻两页中)
  196. //----------------------------------------------------------------------
  197. void Display_Word2(uchar P2,uchar L2,uchar *M) reentrant
  198. {                                                                                         
  199.    LCD_Show(P2,L2,16,M);
  200.    LCD_Show(P2+1,L2,16,M+16);
  201.         LCD_Show(P2+2,L2,16,M+32);
  202.         LCD_Show(P2+3,L2,16,M+48);
  203. }


  204. //*************************************************************************
  205. //***********************DHT11*************************
  206. //**************************************************************************

  207. //sbit DATA = P1^3;                //定义数据引脚
  208. //bit flag_1s,flag_200ms,tmp;

  209. //----------------定义区--------------------//
  210. uchar s1,s2,w1,w2;

  211. sbit TRH = P1^3;//data数据端
  212. unsigned char i;

  213. typedef unsigned char unint8;
  214. typedef unsigned char unint16;

  215. unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
  216. unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
  217. unint8 com_data,untemp,temp;
  218. unint8 respond;

  219. /*********************************************************************************/
  220. void delayNOP()
  221. {
  222.          _nop_();
  223.          _nop_();
  224.          _nop_();
  225.          _nop_();
  226. }
  227. /*********************************************************************************/


  228. /*********************************************************************************/
  229. // 毫秒级延时子程序
  230. /*********************************************************************************/
  231. void delay_ms(unsigned char ms)
  232. {      
  233.          unsigned char i;
  234.          while(ms--)
  235.          {
  236.                   for(i = 0; i<250; i++)
  237.                   {
  238.                            _nop_();
  239.                            _nop_();
  240.                            _nop_();
  241.                            _nop_();
  242.                   }
  243.          }
  244. }
  245. /*********************************************************************************/


  246. /*********************************************************************************/
  247. //5us级延时程序
  248. /*********************************************************************************/
  249. void delay_us()
  250. {
  251.          unint8 i;
  252.          i--;
  253.          i--;
  254.          i--;
  255.          i--;
  256.          i--;
  257.          i--;
  258. }

  259. /****************************************************************************/


  260. /****************************************************************************/
  261. //收发信号检测,数据读取
  262. /****************************************************************************/
  263. char receive()
  264. {   
  265.          unint8 i;
  266. //         ST=0;
  267.          com_data=0;
  268.          for(i=0;i<=7;i++)   
  269.          {
  270.                   respond=2;
  271.                   while((!TRH)&&respond++);
  272.                   delay_us();
  273.                   delay_us();
  274.                   delay_us();
  275.                   if(TRH)
  276.                   {
  277.                            temp=1;
  278.                            respond=2;
  279.                            while((TRH)&&respond++);
  280.                   }
  281.                   else
  282.                            temp=0;
  283.                   com_data<<=1;
  284.                   com_data|=temp;   
  285.          }
  286.          return(com_data);  
  287. }
  288. /****************************************************************************/


  289. /****************************************************************************/
  290. //湿度读取子程序
  291. //温度高8位== TL_data
  292. //温度低8位== TH_data
  293. //湿度高8位== RH_data
  294. //湿度低8位== RH_data
  295. //校验 8位 == CK_data
  296. //调用的程序有 delay();, Delay_5us();,RECEIVE();
  297. /***************************************************************************/

  298. void read_TRH()
  299. {
  300. //         int m;
  301.          //主机拉低18ms
  302.         TRH=0;
  303.         delay_ms(18);
  304.         TRH=1;
  305.         //DATA总线由上拉电阻拉高 主机延时20us
  306.        delay_us();
  307.        delay_us();
  308.        delay_us();
  309.        delay_us();

  310.        //主机设为输入 判断从机响应信号
  311.        TRH=1;
  312.        //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行   
  313.       if(!TRH)   
  314.       {
  315.              respond=2;
  316.              //判断DHT11发出 80us 的低电平响应信号是否结束
  317.              while((!TRH)&& respond++);
  318.             respond=2;
  319.             //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  320.             while(TRH && respond++);
  321.              //数据接收状态   
  322.             RH_temp = receive();
  323.             RL_temp = receive();
  324.             TH_temp = receive();
  325.             TL_temp = receive();
  326.             CK_temp = receive();
  327.             TRH=1;
  328. //                                ST=1;     
  329.             //数据校验
  330.              untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
  331.              if(untemp==CK_temp)
  332.             {
  333.                      RH_data = RH_temp;
  334.                      RL_data = RL_temp;
  335.                      TH_data = TH_temp;
  336.                      TL_data = TL_temp;
  337.                      CK_data = CK_temp;
  338.              }
  339.        }
  340. //           if(RH_data>=60)
  341. //           {  
  342. //           i=100;
  343. //             while(i>0)
  344. //             {               
  345. //                    Beep=1;
  346. //                 delay_ms(1);
  347. //                 Beep=0;
  348. //                 i--;
  349. //                 }          
  350. //                 Beep=1;                 
  351. //           }
  352. //           else        if(RH_data<60)
  353. //           {
  354. //                 Beep=0;
  355. //           }
  356.          //湿度整数部分
  357. //                           RH_data= htoi(str1);
  358.          s1 = (char)(RH_data/10);

  359.          s2 = (char)(RH_data%10);
  360.          //温度整数部分
  361. //                                 TH_data= htoi(str2);
  362.          w1 = (char)(TH_data/10);
  363.                                  
  364.          w2 = (char)(TH_data%10);
  365. //          m=(int)(RH_data);
  366. //          if(m>=35)//可改变相应数值,以此控制其他设备
  367. //          {
  368. //                  XS=0;
  369. //                 // Beep =1; //可适当加一个延迟
  370. //          }
  371. //         else
  372. //         {
  373. //                  XS=1;
  374. //                //Beep =0;
  375. //        }
  376. }


  377.        


  378. //*--------写字节函数,向DS1302写入一个字节--------*//
  379. void Write_Byte_TO_DS1302(uchar X)    // 向DS1302写入一个字节
  380.   {
  381.      uchar i;
  382.          for(i=0;i<8;i++)
  383.            {
  384.              SDA=X&1;
  385.                  CLK=1;
  386.                  CLK=0;
  387.                  X>>=1;
  388.            }
  389.   }
  390. //*--------读字节函数,从DS1302读取一个字节--------*//
  391. uchar Read_Byte_FROM_DS1302()                //从DS1302中读取一个字节
  392. {
  393.    uchar i,byte,t;
  394.    for(i=0;i<8;i++)
  395.      {
  396.           byte>>=1;
  397.           t=SDA;
  398.           byte|=t<<7;
  399.           CLK=1;
  400.           CLK=0;
  401.          }
  402.          //BCD码转换
  403.          return byte/16*10+byte%16;
  404. }
  405. //-------------------------------------------------------------
  406. //从DS1302指定位置读取数据        , 读数据
  407. //---------------------------------------------------------------
  408. uchar Read_Data_FROM_DS1302(uchar addr)  //从DS1302指定位置读取数据        , 读数据
  409.    {
  410.      uchar dat;
  411.          RST=0;
  412.          CLK=0;
  413.          RST=1;
  414.          Write_Byte_TO_DS1302(addr);  //向DS1302写入一个地址
  415.          dat=Read_Byte_FROM_DS1302(); //在上面写入的地址中读取数据
  416.          CLK=1;
  417.          RST=0;
  418.          return dat;
  419.    }
  420. //-------------------------------------------------------------
  421. //向DS1302指定位置写入数据, 写数据
  422. //---------------------------------------------------------------
  423. void Write_Data_TO_DS1302(uchar addr,uchar dat)  // 向DS1302指定位置写入数据, 写数据
  424.   {
  425.       CLK=0;
  426.            RST=1;
  427.            Write_Byte_TO_DS1302(addr);
  428.            Write_Byte_TO_DS1302(dat);
  429.            CLK=1;
  430.            RST=0;
  431.   }
  432. //-----------------------------------------------------------
  433. // 设置时间
  434. //---------------------------------------------------------
  435. void SET_DS1302()          //  设置时间
  436. {
  437.    uchar i;
  438.    Write_Data_TO_DS1302(0x8E,0x00); //写控制字,取消写保护
  439.    // 分,时,日,月,年依次写入
  440.    for(i=0;i<7;i++)
  441.      {
  442.           // 分的起始地址是10000010(0x82),后面依次是时,日,月,周,年,写入地址每次递增2
  443.                    Write_Data_TO_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));
  444.          }
  445.    Write_Data_TO_DS1302(0x8E,0x80); //写控制字,加写保护
  446. }
  447. //--------------------------------------------------------
  448. // 读取当前时间
  449. //-------------------------------------------------------
  450. void GetTime()                  //  读取当前时间
  451. {
  452.   uchar i;
  453.   for(i=0;i<7;i++)
  454.     {
  455.           DateTime[i]=Read_Data_FROM_DS1302(0x81+2*i);
  456.         }
  457. }
  458. //-------------------------------------------------------------------
  459. // 判断是否为闰年
  460. //-------------------------------------------------------------------
  461. uchar Is_Leapyear(uint year)
  462. {
  463.   return (year%4==0&&year%100!=0)||(year%400==0) ;
  464. }
  465. //------------------------------------------------------------------
  466. //         求自2000.1.1开始的任何一天是星期几?
  467. //----------------------------------------------------------------------
  468. void Refresh_Week_Day()
  469. {
  470.   uint i,d,w=5;  //已知1999年12.31是星期五
  471.   for(i=2000;i<2000+DateTime[6];i++)
  472.      {
  473.             d=Is_Leapyear(i)?366:365;
  474.                 w=(w+d)%7;
  475.          }
  476.   d=0;
  477.   for (i=1;i<DateTime[4];i++)
  478.        {d+=MonthsDays[i];}
  479.   d+=DateTime[3];
  480.    //保存星期,0-6表示星期日,星期一至星期六,为了与DS1302的星期格式匹配,返回值需要加1
  481.    DateTime[5]=(w+d)%7+1;
  482. }
  483. //-------------------------------------------------
  484. //年,月,日和时,分++/--
  485. //----------------------------------------------------
  486. void Datetime_Adjust(char X)
  487. {
  488.   switch(Adjust_Index)
  489.     {
  490.            case 6:         //年调整,00-99
  491.                           if(X==1&&DateTime[6]<99)
  492.                              {
  493.                                    DateTime[6]++;
  494.                                  }
  495.                           if(X==-1&&DateTime[6]>0)
  496.                              {
  497.                                    DateTime[6]--;
  498.                                  }
  499.                           //获取2月天数
  500.                           MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28;
  501.                           //如果年份变化后当前月份的天数大于上限则设为上限
  502.                           if(DateTime[3]>MonthsDays[DateTime[4]])
  503.                               {
  504.                                     DateTime[3]=MonthsDays[DateTime[4]];
  505.                                    }
  506.                            Refresh_Week_Day();  //刷新星期
  507.                           break;
  508.            case 4:  //月调整 01-12
  509.                   if(X==1&&DateTime[4]<12)
  510.                              {
  511.                                    DateTime[4]++;
  512.                                  }
  513.                           if(X==-1&&DateTime[4]>1)
  514.                              {
  515.                                    DateTime[4]--;
  516.                                  }
  517.                                   //获取2月天数
  518.                           MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28;
  519.                           //如果年份变化后当前月份的天数大于上限则设为上限
  520.                           if(DateTime[3]>MonthsDays[DateTime[4]])
  521.                               {
  522.                                     DateTime[3]=MonthsDays[DateTime[4]];
  523.                                    }
  524.                            Refresh_Week_Day();  //刷新星期
  525.                           break;
  526.            case 3:         //         日调整00-28或00-29或00-30或00-31
  527.                      //调节之前首先根据当前年份得出该年中2月的天数
  528.                           MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28;
  529.                           //根据当前月份决定调节日期的上限
  530.                           if(X==1&&DateTime[3]<MonthsDays[DateTime[4]])
  531.                              {
  532.                                    DateTime[3]++;
  533.                                  }
  534.                           if(X==-1&&DateTime[3]>0)
  535.                              {
  536.                                    DateTime[3]--;
  537.                                  }
  538.                           Refresh_Week_Day();  //刷新星期
  539.                   break;
  540.            case 2:          //  时调整
  541.                           if(X==1&&DateTime[2]<23)
  542.                              {
  543.                                    DateTime[2]++;
  544.                                  }
  545.                           if(X==-1&&DateTime[4]>0)
  546.                              {
  547.                                    DateTime[2]--;
  548.                                  }
  549.                   break;
  550.            case 1:          //  分调整
  551.                           if(X==1&&DateTime[1]<59)
  552.                              {
  553.                                    DateTime[1]++;
  554.                                  }
  555.                           if(X==-1&&DateTime[4]>0)
  556.                              {
  557.                                    DateTime[1]--;
  558.                                  }
  559.                   break;
  560.                 case 0:          // 秒调整
  561.                           if(X==1&&DateTime[1]<59)
  562.                              {
  563.                                    DateTime[0]++;
  564.                                  }
  565.                           if(X==-1&&DateTime[4]>0)
  566.                              {
  567.                                    DateTime[0]--;
  568.                                  }
  569.                   break;
  570.         }
  571. }

  572. //-------------------------------------------------
  573. // 与本程序有关的数字和汉字的点阵编码 DotMatrix.c
  574. // -----------------------------------------------
  575. //中文提示(纵向取模,字节倒序)
  576. //年、月、日、星期、时、分、秒等汉字点阵(16×16)
  577. uchar code DATE_TIME_WORDS[]={       
  578.         0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, //年
  579.         0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
  580.         0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月
  581.         0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,
  582.         0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日
  583.         0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
  584.         0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,//星
  585.         0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,
  586.         0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期
  587.         0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
  588.         0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//时
  589.         0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
  590.         0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分
  591.         0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
  592.         0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒
  593.         0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00
  594. };

  595. //一、二、三、四、五、六和天等汉字点阵(16×16)
  596. uchar code WEEK_WORDS[]={
  597. 0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00,//天
  598. 0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,
  599. 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,//一
  600. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  601. 0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,//二
  602. 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,
  603. 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,//三
  604. 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  605. 0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,//四
  606. 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,
  607. 0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,//五
  608. 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,
  609. 0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,//六
  610. 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00,
  611. 0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
  612. 0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00,/*"℃",0*/
  613. };

  614. //0-9等数字点阵(8×16)
  615. uchar code Digits[]={  
  616.         0x00,0x00,0xF0,0xF8,0x08,0x68,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x0B,0x08,0x0F,0x07, //0
  617.         0x00,0x20,0x20,0x30,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,  //1
  618.         0x00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x00, //        2
  619.         0x00,0x30,0x38,0x88,0x88,0xF8,0x70,0x00,0x00,0x06,0x0E,0x08,0x08,0x0F,0x07,0x00, //3
  620.         0x00,0x00,0xF8,0xF8,0x00,0xE0,0xE0,0x00,0x00,0x03,0x03,0x02,0x02,0x0F,0x0F,0x02,//4
  621.         0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,//5
  622.         0x00,0xC0,0xE0,0x78,0x58,0xC8,0x80,0x00,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,//6
  623.         0x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,//7
  624.         0x00,0x70,0xF8,0xC8,0x88,0xF8,0x70,0x00,0x00,0x07,0x0F,0x08,0x09,0x0F,0x07,0x00,//8
  625.         0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x00,0x09,0x0D,0x0F,0x03,0x01,0x00,//9
  626.         0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00,/*"%",0*/
  627.   0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,/*"R",1*/
  628.   0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,/*"H",2*/
  629.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*".",0*/
  630. };

  631. uchar code fuhao[]=
  632. {
  633.         0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  634.   0x00,0xF0,0xFE,0x0F,0x01,0x00,0x00,0x00,0x00,0x01,0x07,0xFE,0xF0,0x00,0x00,0x00,
  635.   0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x00,
  636.   0x00,0x00,0x01,0x03,0x06,0x0C,0x08,0x08,0x08,0x06,0x03,0x01,0x00,0x00,0x00,0x00,/*"0",0*/
  637.   0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  638.   0x00,0x00,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  639.   0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  640.   0x00,0x00,0x08,0x08,0x08,0x0C,0x0F,0x0F,0x0C,0x08,0x08,0x08,0x00,0x00,0x00,0x00,/*"1",1*/
  641.   0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,
  642.   0x00,0x1E,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0xFF,0x3E,0x00,0x00,0x00,
  643.   0x00,0x00,0x00,0x80,0x40,0x30,0x18,0x0C,0x06,0x03,0x01,0x00,0xC0,0x00,0x00,0x00,
  644.   0x00,0x0E,0x0D,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0E,0x03,0x00,0x00,0x00,/*"2",2*/
  645.   0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  646.   0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0xC1,0x7F,0x3E,0x00,0x00,0x00,0x00,
  647.   0x00,0xC0,0xC0,0x00,0x00,0x01,0x01,0x01,0x03,0x02,0x06,0xFC,0xF0,0x00,0x00,0x00,
  648.   0x00,0x03,0x07,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x06,0x03,0x00,0x00,0x00,0x00,/*"3",3*/
  649.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
  650.   0x00,0x00,0x00,0x80,0x60,0x10,0x0C,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
  651.   0x30,0x2C,0x26,0x21,0x20,0x20,0x20,0x20,0xFF,0xFF,0x20,0x20,0x20,0x00,0x00,0x00,
  652.   0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x00,0x00,0x00,/*"4",4*/
  653.   0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,
  654.   0x00,0x00,0xFF,0x00,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
  655.   0x00,0xC0,0xC3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00,0x00,
  656.   0x00,0x03,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x07,0x03,0x00,0x00,0x00,0x00,/*"5",5*/
  657.   0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x80,0x80,0x00,0x00,0x00,0x00,
  658.   0x00,0xE0,0xFC,0x07,0x81,0xC0,0x40,0x40,0x40,0xC0,0x83,0x03,0x00,0x00,0x00,0x00,
  659.   0x00,0x7F,0xFF,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00,0x00,
  660.   0x00,0x00,0x01,0x07,0x06,0x0C,0x08,0x08,0x08,0x0C,0x06,0x03,0x00,0x00,0x00,0x00,/*"6",6*/
  661.   0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,
  662.   0x00,0x0E,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x18,0x06,0x01,0x00,0x00,0x00,0x00,
  663.   0x00,0x00,0x00,0x00,0x00,0xC0,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  664.   0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"7",7*/
  665.   0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
  666.   0x00,0x3E,0x7F,0xF1,0xC0,0xC0,0x80,0x00,0x00,0x80,0x41,0x7F,0x1E,0x00,0x00,0x00,
  667.   0xF0,0xFC,0x0E,0x02,0x01,0x01,0x01,0x03,0x07,0x0E,0x1E,0xFC,0xF0,0x00,0x00,0x00,
  668.   0x01,0x03,0x06,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x06,0x03,0x01,0x00,0x00,0x00,/*"8",8*/
  669.   0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  670.   0xFC,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0xF8,0x00,0x00,0x00,
  671.   0x01,0x03,0x07,0x0C,0x08,0x08,0x08,0x08,0x04,0x06,0xE1,0x7F,0x1F,0x00,0x00,0x00,
  672.   0x00,0x07,0x07,0x08,0x08,0x08,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,/*"9",9*/
  673.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //:
  674.   0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
  675.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  676.   0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
  677.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  678.   0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,/*"-",0*/
  679. };



  680. //----------------------------------------------------
  681. // 主程序
  682. //----------------------------------------------------
  683. void main()
  684. {

  685.   Initialization();
  686.         while(1)
  687.           {
  688.             if(Adjust_Index==-1)
  689.                         GetTime();
  690.                 read_TRH();
  691. //                CS2=0; //左屏开显示
  692. //          CS1=1;
  693.           Display_char(6,0,Digits+s1*16);// Hz_Wo为某个汉字的首地址
  694.                 Display_char(6,16,Digits+s2*16);
  695. //    CS2=1; //右屏开显示
  696. //          CS1=0;
  697.     Display_char(6,64,Digits+w1*16);
  698.                 Display_char(6,80,Digits+w2*16);
  699.                 }
  700. }

  701. void Initialization()//初始化函数
  702. {
  703.   IE=0x83;
  704.         IP=0x01;
  705.         IT0=0X01;
  706.         TH0=-50000/256; // 写入初值
  707.   TL0=-50000%256; //  写入初值
  708.         TR0=1;
  709.         LCD12864_Initialization();//液晶初始化函数
  710.     //显示年的前面固定的两位
  711.         Display_char(V_page_Offset,0+H_Offset,Digits+2*16);//显示2
  712.         Display_char(V_page_Offset,8+H_Offset,Digits);     //显示0
  713.    //-----------------------------------------------
  714.    //在12864屏幕上固定显示汉字:年月日,星期,时分秒
  715.    //---------------------------------------------------
  716. ……………………

  717. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
89c52 ds1302 dht11 12864.rar (161.11 KB, 下载次数: 271)



评分

参与人数 2黑币 +60 收起 理由
kljie1000 + 10
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:239977 发表于 2019-4-7 14:21 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

板凳
ID:353960 发表于 2019-4-8 22:32 | 只看该作者
为什么编译会失败?
回复

使用道具 举报

地板
ID:529630 发表于 2019-5-7 15:51 | 只看该作者
很想问一个问题!给整个系统供电的是哪个一模块啊,在图上是哪一个地方啊。
还有就是RP是什么东西啊
回复

使用道具 举报

5#
ID:16806 发表于 2019-5-7 19:09 | 只看该作者
感谢分享,
回复

使用道具 举报

6#
ID:906585 发表于 2021-4-22 23:13 | 只看该作者
请问温湿度无法显示,怎么改,楼主解决了吗
回复

使用道具 举报

7#
ID:328014 发表于 2021-4-23 04:09 | 只看该作者
一战成硕xbc 发表于 2021-4-22 23:13
请问温湿度无法显示,怎么改,楼主解决了吗

用Proteus8.8打开 貌似正常的

51hei.png (32.12 KB, 下载次数: 19)

51hei.png
回复

使用道具 举报

8#
ID:983890 发表于 2021-11-23 18:42 | 只看该作者
非常有用,最近在弄这个,学到了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表