久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3553|回復: 0
收起左側

基于51單片機的16*64點陣仿真加源程序 生日字模

[復制鏈接]
ID:300185 發(fā)表于 2019-3-8 23:09 | 顯示全部樓層 |閱讀模式
16*64點陣仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ截圖20190308230723.png

16*64點陣單片機源程序如下:
  1. #include<reg51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define light 3                        //定義亮度
  5. uchar code hanzi[];                                            //漢字字模
  6. uchar code shengri[];                                        //生日字模
  7. uchar code timer[13][16];                                //0~9數(shù)字
  8. uchar code sw[];                            //138驅動數(shù)據(jù)

  9. void Show_word();                      //待機顯示按三秒間隔分別顯示年、月日、星期、時分秒。
  10. void Show_pass();                                   //不顯示一個字
  11. void Send_data(unsigned char *d);      /*串口發(fā)送一行*/



  12. /******************************************/
  13. sbit resget=P0^2;                        //時鐘復位
  14. sbit key_moda=P0^3;                        //模式轉換
  15. sbit key_up=P0^4;                        //時鐘加
  16. sbit key_Down=P0^5;                        //時鐘減

  17. sbit T_CLK=P2^1;                    //DS1302引腳連接
  18. sbit T_IO =P2^2;
  19. sbit T_RST=P2^3;

  20. sbit ACC0=ACC^0;           //1bit數(shù)據(jù)存儲位
  21. sbit ACC7=ACC^7;

  22. sbit STR=P1^7;              //鎖存         
  23. sbit CLK=P3^1;                    //時鐘         
  24. sbit Data= P3^0;            //數(shù)據(jù)
  25. sbit Data1= P1^6;         
  26. sbit E=P1^4;

  27. sbit UU=P1^7;


  28. sbit DQ= P2 ^ 0;//ds1820data(單總線)         


  29. uchar starts_time[7]={0x00,0x10,0x22,0x21,0x10,0x03,0x09};         //初始化后設置
  30. uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week;  //時間溫度變量
  31. uchar a,b,f,h,msec,id,x;           //標志計數(shù)器 a為自動轉換顯示時間,b為手動與自動標志
  32. uint zimuo,tvalue;                                   //字模計數(shù)器
  33. uchar BUFF[10];                                   //緩存

  34. void   RTInputByte(uchar);         //* 輸入 1Byte */
  35. uchar  RTOutputByte(void);         //* 輸出 1Byte */
  36. void   W1302(uchar, uchar);        // 向DS1302寫入一個字節(jié)
  37. uchar  R1302(uchar);               // 從DS1302讀出一個字節(jié)
  38. void   Set1302(uchar *);           // 寫DS1302時間
  39. void   du1302();                   // 讀時間  
  40. void   DelayMs(void);              // 延時
  41. void   Set(uchar,uchar );          // 變量調(diào)整
  42. void   in_data();                                   // 調(diào)整移動數(shù)據(jù)
  43. void   rxd_data();                                   // 串口發(fā)送移動數(shù)據(jù)
  44. read_temp();                   //*讀取溫度值并轉換*/


  45. /*主函數(shù)*/
  46. void main()
  47. {  
  48.    Data1=1;
  49.    Move=0;
  50.    zimuo=0;
  51.    TMOD=0x01;        //16位定時
  52.    TH0=0xC5;    //15ms晶振為12M
  53.    TL0=0x68;
  54.    EA=1;
  55.    TR0=1;
  56.    ET0=1;
  57.    SCON=0;             //初始化串口為工作方式0(同步通信方式,TxD輸出同步脈沖)

  58.    while(zimuo<512)
  59.     {
  60.          while(Move<16)                                             //數(shù)據(jù)移位。
  61.        {
  62.              for(Speed=0;Speed<4;Speed++)       //移動速度
  63.               {        
  64.                     for(line=0;line<16;line++)
  65.                           {
  66.                          in_data();                                     //調(diào)整移動數(shù)據(jù)
  67.                      rxd_data();
  68.                       P1=sw[line];      
  69.                                                                        
  70.                 STR=1;//鎖存
  71.                 STR=0;
  72.                 UU=1;
  73.             DelayMs();         //延時,等待一段時間,讓這列顯示的內(nèi)容在人眼內(nèi)產(chǎn)生“視覺暫留”現(xiàn)象。*/
  74.                                     

  75.                         
  76.                   }
  77.                  }
  78.        Move++;                                                 //移動一步
  79.              }
  80.      Move=0;
  81.          zimuo=zimuo+32;
  82.     }        
  83.    zimuo=0;
  84.    while(1)             //重復(無限)循環(huán)顯示
  85.     {
  86.           if(resget==0)
  87.              {  DelayMs();
  88.             if(resget==0)
  89.                     Set1302(starts_time);    //初始化
  90.                 W1302(0x8e,0x00);            //控制命令,WP=0,寫操作               
  91.                 W1302(0x90,0xa5);            //打開充電二級管  一個二級管串聯(lián)一個2K電阻
  92.             }  
  93.           du1302();          //讀取 秒 分 時 日 月 星期 年
  94.           read_temp();//讀取溫度
  95.           zimuo=0;                                             
  96.            if (key_moda==0)                         //設置和選擇項目鍵
  97.          {  DelayMs();
  98.                 if(key_moda==0)
  99.                    {
  100.                       if(id++==10) {id=0;}
  101.                                   h=0;msec=0;            //清閃爍標志
  102.                           while(key_moda==0){ Show_word();}   
  103.                }                                                   
  104.              }

  105.          
  106.       if(id!=0)
  107.           {
  108.       if (key_up==0)                  //增加
  109.          {
  110.             DelayMs();
  111.             if(key_up==0)
  112.                    {
  113.                              while(key_up==0)
  114.                                                 {Show_word();}         //調(diào)用顯示
  115.                           h=0;msec=0;            //清閃爍標志
  116.                                  
  117.                           Set(id,0);                 //調(diào)用時間調(diào)調(diào)整
  118.                        }  
  119.          }
  120.    
  121.       if (key_Down==0)  //減少
  122.          {
  123.             DelayMs();
  124.             if(key_Down==0)
  125.                     {
  126.                       while(key_Down==0)
  127.                               {Show_word();}   //調(diào)用顯示
  128.                           h=0;msec=0;          //清閃爍標志
  129.                           Set(id,1);                   //調(diào)用時間調(diào)調(diào)整
  130.                         }         
  131.          }
  132.           }
  133.           else
  134.            {
  135.             if (key_up==0)                  //增加
  136.           {
  137.             DelayMs();
  138.             if(key_up==0)
  139.                    {
  140.                              while(key_up==0)
  141.                                                 {Show_word();}         //調(diào)用顯示
  142.                           h=0;msec=0;            //清閃爍標志  
  143.                       if(b!=0)                                 //手動調(diào)整顯示的內(nèi)容
  144.                            {
  145.                                      if(f++==5)                         //f為顯示轉換標志
  146.                                      f=0;
  147.                            }
  148.               }
  149.                     }
  150.            }

  151.    Show_word();          //待機顯示按三秒間隔分別顯示年、月日、星期、時分秒。

  152.    }           
  153. }
  154. /************************************************/
  155. void Show_word()                                 //串行輸出顯示
  156. {  uchar h;                  
  157.    for(h=0;h<16;h++)
  158.     {
  159.                  if((id==0)&(f==0)|(id==1))                        //f為三秒轉換顯示
  160.                            {
  161.                          Send_data(&timer[0][0]);            //不顯示
  162.                                  if((Flicker==1)&(id==1))       //閃爍標志為1時不亮,為零時亮
  163.                                     { Show_pass();                            //不顯示一個字
  164.                                           Show_pass();
  165.                                         }
  166.                                  else
  167.                                    {
  168.                                         Send_data(&timer[2][h]);        //20年   
  169.                               Send_data(&timer[0][h]);
  170.                           Send_data(&timer[Year/16][h]);  //年值   
  171.                               Send_data(&timer[Year%16][h]);
  172.                                    }
  173.                                  Send_data(&hanzi[h*2+641]);          //年字符  
  174.                          Send_data(&hanzi[h*2+640]);
  175.                                  Send_data(&timer[0]);                      //不顯示
  176.                            }

  177.                      if((id==0)&(f==1)|(id==2)|(id==3))                              
  178.                           {
  179.                              if((Flicker==1)&(id==2))                //閃爍標志為1時不亮,為零時亮
  180.                                     { Show_pass();                            //不顯示一個字
  181.                                           
  182.                                         }
  183.                                  else
  184.                                     {
  185.                                           if(Month/16<1)
  186.                                                    Send_data(&timer[0]);                     //月十位為零時不顯示
  187.                                           else
  188.                                         Send_data(&timer[Month/16][h]);      //月值   
  189.                               Send_data(&timer[Month%16][h]);
  190.                                         }
  191.                                  Send_data(&hanzi[h*2+673]);                     //月字符
  192.                          Send_data(&hanzi[h*2+672]);        
  193.                                  if((Flicker==1)&(id==3))                             //閃爍標志為1時不亮,為零時亮
  194.                                     { Show_pass();                                         //不顯示一個字
  195.                                           
  196.                                         }
  197.                                  else
  198.                                     {                                      
  199.                                         Send_data(&timer[Day/16][h]);          //日值   
  200.                               Send_data(&timer[Day%16][h]);
  201.                                         }
  202.                      Send_data(&hanzi[h*2+961]);                 //日字符  
  203.                          Send_data(&hanzi[h*2+960]);
  204.                           }

  205.                      if((id==0)&(f==2)|(id==4))                                     //f為三秒轉換顯示
  206.                           {
  207.                              Send_data(&timer[0]);                             //不顯示
  208.                                  Send_data(&hanzi[h*2+705]);                     //星字符
  209.                          Send_data(&hanzi[h*2+704]);
  210.                                  Send_data(&hanzi[h*2+737]);                     //期字符
  211.                          Send_data(&hanzi[h*2+736]);
  212.                                  if((Flicker==1)&(id==4))                             //閃爍標志為1時不亮,為零時亮
  213.                                     { Show_pass();                                         //不顯示一個字
  214.                                         }
  215.                                  else
  216.                                     {                                             
  217.                                        Send_data(&hanzi[Week%16*32+h*2+737]);       //星期值
  218.                                      Send_data(&hanzi[Week%16*32+h*2+736]);
  219.                                         }     
  220.                          Send_data(&timer[0][0]);                         //不顯示
  221.                           }

  222.                         if((id==0)&(f==3)|(id>4))                                     //f為三秒轉換顯示
  223.                           {
  224.                              if((Flicker==1)&(id==5))                             //閃爍標志為1時不亮,為零時亮
  225.                                     {
  226.                                           Show_pass();                                         //不顯示一個字
  227.                                         }
  228.                                  else
  229.                                     {
  230.                                           if(Hour/16<1)
  231.                                             Send_data(&timer[0][0]);                   //時十位小于1時不顯示  
  232.                                   else
  233.                                             Send_data(&timer[Hour/16][h]);         //時值
  234.                               Send_data(&timer[Hour%16][h]);
  235.                                         }
  236.                                  Send_data(&timer[10][h]);                           //兩個點
  237.                                  
  238.                                  if((Flicker==1)&(id==6))                               //閃爍標志為1時不亮,為零時亮
  239.                                     {
  240.                                           Show_pass();                                           //不顯示一個字
  241.                                         }
  242.                                  else
  243.                                     {
  244.                                           Send_data(&timer[Cent/16][h]);   
  245.                                         Send_data(&timer[Cent%16][h]);           //分值
  246.                     }
  247.                                  Send_data(&timer[10][h]);                     //兩個點
  248.                                  if((Flicker==1)&(id==7))                               //閃爍標志為1時不亮,為零時亮
  249.                                     {                                            
  250.                                           Show_pass();                                                           //不顯示一個字
  251.                                         }
  252.                                  else
  253.                                     {
  254.                               Send_data(&timer[Sec/16][h]);            //秒
  255.                                  Send_data(&timer[Sec%16][h]);  
  256.                                       }
  257.                       }



  258.                           if((id==0)&(f==4))                                     //f為三秒轉換顯示
  259.                           {                  
  260.                              
  261.                                  
  262.                                  Send_data(&hanzi[h*2+1185]);                     //溫字符
  263.                          Send_data(&hanzi[h*2+1184]);
  264.                                  Send_data(&hanzi[h*2+1217]);                     //度字符
  265.                          Send_data(&hanzi[h*2+1216]);
  266.                                  Send_data(&timer[10][h]);                                         //兩個點               
  267.                                                 
  268.                         
  269.                      if  (tvalue/10==0x00)
  270.                      Send_data(&timer[0][0]);                  
  271.                               else
  272.                                             Send_data(&timer[tvalue/10][h]);         //溫度值的十位值
  273.                               Send_data(&timer[tvalue%10][h]);                         //溫度值的個位
  274.                                        
  275.                                            Send_data(&timer[11][h]);                         //溫度值的符號
  276.                         }


  277.                         if((id==0)&(f==5))

  278.         {
  279.         if(Month == 0x04 && Day == 0x19)
  280.         {  
  281.         while(zimuo<64)
  282.     {
  283.          while(Move<16)                                             //數(shù)據(jù)移位。
  284.        {
  285.              for(Speed=0;Speed<4;Speed++)       //移動速度
  286.               {        
  287.                     for(line=0;line<16;line++)
  288.                           {
  289.                          char s;
  290.         for(s=4;s>=0;s--)                                            //i為向后先擇字節(jié)計數(shù)器,zimuoo為向后先字計數(shù)器
  291.         {
  292.          BUFF[2*s+1]=shengri[zimuo+32*s+2*line];            //把第一個字模的第一個字節(jié)放入BUFF0中,第二個字模和第一個字節(jié)放入BUFF2中
  293.          BUFF[2*s]=shengri[zimuo+1+32*s+2*line];}                //把第一個字模的第二個字節(jié)放入BUFF1中,第二個字模的第二個字節(jié)放入BUFF3中                                     //調(diào)整移動數(shù)據(jù)
  294.                      rxd_data();
  295.                                  
  296.                       P1=sw[line];      
  297.                                                                        
  298.                 STR=1;//鎖存
  299.                 STR=0;
  300.                 UU=1;
  301.             DelayMs();         //延時,等待一段時間,讓這列顯示的內(nèi)容在人眼內(nèi)產(chǎn)生“視覺暫留”現(xiàn)象。*/
  302.                                     

  303.                         
  304.                   }
  305.                  }
  306.        Move++;                                                 //移動一步
  307.              }
  308.      Move=0;
  309.          zimuo=zimuo+32;
  310.     }        
  311.         
  312.         }                  
  313.    else        if(Month == 0x10 && Day == 0x26)
  314.                                    
  315.                            {  
  316.                              Send_data(&timer[0][0]);
  317.                              Send_data(&hanzi[h*2+1249]);                     //重陽節(jié)字符
  318.                          Send_data(&hanzi[h*2+1248]);
  319.                                  Send_data(&hanzi[h*2+1281]);                     
  320.                          Send_data(&hanzi[h*2+1280]);
  321.                                    Send_data(&hanzi[h*2+1313]);                     
  322.                          Send_data(&hanzi[h*2+1312]);
  323.                                  Send_data(&timer[0][0]);
  324.                                  }
  325.                           
  326.                           
  327.                            else if(Month == 0x11 && Day == 0x26)
  328.                           
  329.                            {
  330.                            Send_data(&timer[0][0]);
  331.                              Send_data(&hanzi[h*2+1345]);                     //感恩節(jié)字符
  332.                          Send_data(&hanzi[h*2+1344]);
  333.                                  Send_data(&hanzi[h*2+1377]);                     
  334.                          Send_data(&hanzi[h*2+1376]);
  335.                                    Send_data(&hanzi[h*2+1313]);                     
  336.                          Send_data(&hanzi[h*2+1312]);
  337.                                  Send_data(&timer[0][0]);
  338.                                  }
  339.                           
  340.                           

  341.                          else if(Month == 0x12 && Day == 0x22)
  342.                           
  343.                              {
  344.                                  Send_data(&timer[0][0]);
  345.                              Send_data(&hanzi[h*2+1409]);                     //冬至節(jié)字符
  346.                          Send_data(&hanzi[h*2+1408]);
  347.                                  Send_data(&hanzi[h*2+1441]);                     
  348.                          Send_data(&hanzi[h*2+1440]);
  349.                                    Send_data(&hanzi[h*2+1313]);                     
  350.                          Send_data(&hanzi[h*2+1312]);
  351.                                  Send_data(&timer[0][0]);
  352.                                  }
  353.                           
  354.                          else if(Month == 0x12 && Day == 0x25)
  355.                           
  356.                             {
  357.                                  Send_data(&timer[0][0]);
  358.                              Send_data(&hanzi[h*2+1473]);                     //圣誕節(jié)字符
  359.                          Send_data(&hanzi[h*2+1472]);
  360.                                  Send_data(&hanzi[h*2+1505]);                     
  361.                          Send_data(&hanzi[h*2+1504]);
  362.                                    Send_data(&hanzi[h*2+1313]);                     
  363.                          Send_data(&hanzi[h*2+1312]);
  364.                                  Send_data(&timer[0][0]);
  365.                                  }
  366.                                  
  367.                            else if (Hour>= 0x06 &&Hour<  0x18 )
  368.                            {
  369.                              Send_data(&timer[0][0]);
  370.                              Send_data(&timer[0][0]);
  371.                              Send_data(&hanzi[h*2+1537]);                     //白天字符
  372.                          Send_data(&hanzi[h*2+1536]);
  373.                                  Send_data(&hanzi[h*2+1569]);                     
  374.                          Send_data(&hanzi[h*2+1568]);
  375.                                  Send_data(&timer[0][0]);
  376.                                  Send_data(&timer[0][0]);
  377.                            }
  378.                            
  379.                          else
  380.                            {
  381.                              Send_data(&timer[0][0]);
  382.                              Send_data(&timer[0][0]);
  383.                              Send_data(&hanzi[h*2+1601]);                     //晚上字符
  384.                          Send_data(&hanzi[h*2+1600]);
  385.                                  Send_data(&hanzi[h*2+1633]);                     
  386.                          Send_data(&hanzi[h*2+1632]);
  387.                                  Send_data(&timer[0][0]);
  388.                                  Send_data(&timer[0][0]);
  389.                            }
  390.                                  }

  391.                         if(id>7)                                   //id大于7時為對顯示轉換模式設置
  392.                             {        if((Flicker==1)&(id==8))                     
  393.                                {  Show_pass();
  394.                                           Show_pass();
  395.                                           Show_pass();
  396.                                           Show_pass();
  397.                                         }
  398.                                 else if(b==0)
  399.                                    {
  400.                                       Send_data(&hanzi[h*2+993]);   //顯示漢字 “自”
  401.                                       Send_data(&hanzi[h*2+992]);
  402.                                       Send_data(&hanzi[h*2+1057]);   //顯示漢字“動”
  403.                                       Send_data(&hanzi[h*2+1056]);     
  404.                                           Send_data(&hanzi[h*2+1089]);   //顯示漢字“模”
  405.                                       Send_data(&hanzi[h*2+1088]);
  406.                                       Send_data(&hanzi[h*2+1121]);   //顯示漢字“式”
  407.                                       Send_data(&hanzi[h*2+1120]);
  408.                                    }
  409.                                 else
  410.                                    {
  411.                                       Send_data(&hanzi[h*2+1025]);   //顯示漢字“手”
  412.                                       Send_data(&hanzi[h*2+1024]);
  413.                                       Send_data(&hanzi[h*2+1057]);   //顯示漢字“動”
  414.                                       Send_data(&hanzi[h*2+1056]);     
  415.                                           Send_data(&hanzi[h*2+1089]);   //顯示漢字“模”
  416.                                       Send_data(&hanzi[h*2+1088]);
  417.                                       Send_data(&hanzi[h*2+1121]);   //顯示漢字“式”
  418.                                       Send_data(&hanzi[h*2+1120]);
  419.                                    }
  420.                                 if(id==9)
  421.                                    {
  422.                                      if(b==1)                           //手動模式
  423.                                        {
  424.                                          id=0;f=0;
  425.                                        }
  426.                                      else
  427.                                            {
  428.                                              Send_data(&hanzi[h*2+993]);    //顯示漢字“自”
  429.                                          Send_data(&hanzi[h*2+992]);
  430.                                                  Send_data(&hanzi[h*2+1057]);   //顯示漢字“動”
  431.                                          Send_data(&hanzi[h*2+1056]);
  432.                                                  if(Flicker==1)
  433.                                                    {
  434.                                                      Show_pass();
  435.                                                    }
  436.                                                  else
  437.                                                {
  438.                                                      Send_data(&timer[a/16][h]);    //轉換時間
  439.                                         Send_data(&timer[a%16][h]);
  440.                                                          }
  441.                                                  Send_data(&hanzi[h*2+1153]);   //顯示漢字“秒”
  442.                                          Send_data(&hanzi[h*2+1152]);
  443.                                            }
  444.                    }
  445.                           }

  446.       
  447.           P1=sw[h];                                      //輸出行信號
  448.           STR=1;STR=0;
  449.            UU=1;                         //鎖存為高,595鎖存信號
  450.           DelayMs();                      //延時,等待一段時間,讓這列顯示的內(nèi)容在人眼內(nèi)產(chǎn)生“視覺暫留”現(xiàn)象。*/
  451.      
  452.         }  
  453.         }        

  454. /************************************************/

  455. //temp=255-temp;
  456. //return temp;   
  457. void timer_1(void) interrupt 1         //中斷入口,閃爍
  458. {
  459.   TH0=0xC5;              //15ms定時 晶振12M
  460.   TL0=0x68;
  461.   if(msec++==40)             //1000ms
  462.    { msec=0;
  463.          x++;                           
  464.      if(x>=a)
  465.        { x=0;
  466.             if(b==0)                    //自動模式
  467.         {
  468.                 if(f++==5)
  469.               f=0;          //f顯示轉換計數(shù)器 ,d為用戶設置的自動轉換時間的值。
  470.             }
  471.            }
  472.     if(h++==4)                    //5秒后進入正常走時。
  473.        {id=0;h=0;}
  474.         }        
  475.   if(msec<20)
  476.             Flicker=0;         //閃爍標志反轉                 
  477.   else
  478.             Flicker=1;
  479.                                     
  480. }


  481. /***********************輸出一個字的不顯示數(shù)據(jù)。*****************/
  482. void Show_pass()
  483. {
  484.   Send_data(&timer[0][0]);                         //不顯示
  485.   Send_data(&timer[0][0]);                         //不顯示
  486. }

  487. /**********************************************************/
  488. void in_data(void)                                       //調(diào)整數(shù)據(jù)
  489. {
  490. char s;
  491.         for(s=4;s>=0;s--)                                            //i為向后先擇字節(jié)計數(shù)器,zimuoo為向后先字計數(shù)器
  492.         {
  493.          BUFF[2*s+1]=hanzi[zimuo+32*s+2*line];            //把第一個字模的第一個字節(jié)放入BUFF0中,第二個字模和第一個字節(jié)放入BUFF2中
  494.          BUFF[2*s]=hanzi[zimuo+1+32*s+2*line];                //把第一個字模的第二個字節(jié)放入BUFF1中,第二個字模的第二個字節(jié)放入BUFF3中

  495.         }
  496. }

  497. /***********************發(fā)送移動的數(shù)據(jù)****************************/
  498. void rxd_data(void)                            //串行發(fā)送數(shù)據(jù)
  499. {
  500.   uchar s;
  501.   uchar inc,tempyid,temp;
  502.   if(Move<8)
  503.     inc=0;
  504.   else
  505.     inc=1;
  506.   for(s=0+inc;s<8+inc;s++)                   //發(fā)送8字節(jié)數(shù)據(jù)
  507.         {
  508.          if(Move<8)
  509.        tempyid=Move;
  510.      else
  511.      tempyid=Move-8;
  512.      temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));        //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的數(shù)據(jù)。
  513. temp=255-temp;

  514.    
  515.          SBUF=temp;                      //把BUFF中的字節(jié)從大到小移位相或后發(fā)送輸出。
  516.           while(TI==0);       //等待發(fā)送完畢
  517.       TI=0;
  518.          
  519.         }
  520. }


  521. /*******************************************************/
  522. void Send_data(unsigned char *d)          /*從串口發(fā)送數(shù)據(jù)*/
  523. {
  524.      SBUF=*d;
  525.           while(TI==0);       //等待發(fā)送完畢
  526.       TI=0;
  527. }


  528. //根據(jù)選擇調(diào)整相應項目
  529. void Set(uchar sel,uchar sel_1)
  530. {
  531.   uchar address,time;
  532.   uchar max,min;
  533.   if(sel==9)  {address=0xc2; max=20;min=1;}    //自動轉換時間時最大為20秒。
  534.   if(sel==8)  {address=0xc0; max=1;min=0; }     //顯示自動轉換或手動轉換。為零自動,為1手動。
  535.   if(sel==7)  {address=0x80; max=59;min=0;}     //秒
  536.   if(sel==6)  {address=0x82; max=59;min=0;}    //分鐘
  537.   if(sel==5)  {address=0x84; max=23;min=0;}    //小時
  538.   if(sel==4)  {address=0x8a; max=7; min=1;}    //星期
  539.   if(sel==3)  {address=0x86; max=31;min=1;}    //日
  540.   if(sel==2)  {address=0x88; max=12;min=1;}    //月
  541.   if(sel==1)  {address=0x8c; max=99;min=0;}    //年
  542.   
  543.   
  544.   time=R1302(address+1)/16*10+R1302(address+1)%16;
  545.   if (sel_1==0) time++;  else time--;
  546.   if(time>max) time=min;   
  547.   if(time<min) time=max;
  548.            
  549.   W1302(0x8e,0x00);
  550.   W1302(address,time/10*16+time%10);
  551.   W1302(0x8e,0x80);  
  552. }

  553. /**************************延時***********************/

  554. void DelayMs(void)
  555. {
  556.   uchar TempCyc;
  557.   for(TempCyc=110;TempCyc>1;TempCyc--)
  558.      {;}
  559. }

  560. //********DS1302讀寫程序***************//
  561. /********************************************************************
  562. 函 數(shù) 名:RTInputByte()
  563. 功    能:實時時鐘寫入一字節(jié)
  564. 說    明:往DS1302寫入1Byte數(shù)據(jù) (內(nèi)部函數(shù))
  565. 入口參數(shù):d 寫入的數(shù)據(jù)
  566. 返 回 值:無  
  567. ***********************************************************************/
  568. void RTInputByte(uchar d)
  569. {
  570.     uchar h;
  571.     ACC = d;
  572.     for(h=8; h>0; h--)
  573.     {
  574.         T_IO = ACC0;           /*相當于匯編中的 RRC */
  575.         T_CLK = 1;
  576.         T_CLK = 0;
  577.         ACC = ACC >> 1;
  578.     }
  579. }
  580. /********************************************************************
  581. 函 數(shù) 名:RTOutputByte()
  582. 功    能:實時時鐘讀取一字節(jié)
  583. 說    明:從DS1302讀取1Byte數(shù)據(jù) (內(nèi)部函數(shù))
  584. 入口參數(shù):無  
  585. 返 回 值:ACC
  586. 設    計:zhaojunjie           日    期:2002-03-19
  587. 修    改:                     日    期:
  588. ***********************************************************************/
  589. uchar RTOutputByte(void)
  590. {
  591.     uchar h;
  592.     for(h=8; h>0; h--)
  593.     {
  594.         ACC = ACC >>1;         /*相當于匯編中的 RRC */
  595.         ACC7 = T_IO;
  596.         T_CLK = 1;
  597.         T_CLK = 0;
  598.     }
  599.     return(ACC);
  600. }
  601. /********************************************************************
  602. 函 數(shù) 名:W1302()
  603. 功    能:往DS1302寫入數(shù)據(jù)
  604. 說    明:先寫地址,后寫命令/數(shù)據(jù) (內(nèi)部函數(shù))
  605. 調(diào)    用:RTInputByte() , RTOutputByte()
  606. 入口參數(shù):ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)
  607. 返 回 值:無
  608. ***********************************************************************/
  609. void W1302(uchar ucAddr, uchar ucDa)
  610. {
  611.     T_RST = 0;
  612.     T_CLK = 0;
  613.     T_RST = 1;
  614.     RTInputByte(ucAddr);       /* 地址,命令 */
  615.     RTInputByte(ucDa);       /* 寫1Byte數(shù)據(jù)*/
  616.     T_CLK = 1;
  617.     T_RST = 0;
  618. }
  619. /********************************************************************
  620. 函 數(shù) 名:R1302()
  621. 功    能:讀取DS1302某地址的數(shù)據(jù)
  622. 說    明:先寫地址,后讀命令/數(shù)據(jù) (內(nèi)部函數(shù))
  623. 調(diào)    用:RTInputByte() , RTOutputByte()
  624. 入口參數(shù):ucAddr: DS1302地址
  625. 返 回 值:ucData :讀取的數(shù)據(jù)
  626. ***********************************************************************/
  627. uchar R1302(uchar ucAddr)
  628. {
  629.     uchar ucData;
  630.     T_RST = 0;
  631.     T_CLK = 0;
  632.     T_RST = 1;
  633.     RTInputByte(ucAddr);             /* 地址,命令 */
  634.     ucData = RTOutputByte();         /* 讀1Byte數(shù)據(jù) */
  635.     T_CLK = 1;
  636.     T_RST = 0;
  637.     return(ucData);
  638. }

  639. /********************************************************************
  640. 函 數(shù) 名:Set1302()
  641. 功    能:設置初始時間
  642. 說    明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)
  643. 調(diào)    用:W1302()
  644. 入口參數(shù):pClock: 設置時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年
  645.                                7Byte (BCD碼)1B 1B 1B 1B 1B  1B  1B
  646. 返 回 值:無
  647. ***********************************************************************/
  648. void Set1302(uchar *pClock)
  649. {
  650.     uchar h;
  651.     uchar ucAddr = 0x80;
  652.     W1302(0x8e,0x00);           /* 控制命令,WP=0,寫操作?*/
  653.     for(h =7; h>0; h--)
  654.     {
  655.         W1302(ucAddr,*pClock);  /* 秒 分 時 日 月 星期 年 */
  656.         pClock++;
  657.         ucAddr +=2;
  658.     }
  659.         W1302(0xc0,0x01);
  660.         W1302(0XC2,0X03);                        //初始自動轉換顯示時間為3秒。
  661.     W1302(0x8e,0x80);           /* 控制命令,WP=1,寫保護?*/

  662. }
  663. /******************讀取DS1302中的時間****************/
  664. void du1302()
  665. {
  666.       Sec=R1302(0x81);   //對取 秒 分 時 日 月 星期 年
  667.           Cent=R1302(0x83);
  668.           Hour=R1302(0x85);
  669.           Day=R1302(0x87);
  670.           Month=R1302(0x89);
  671.           Week=R1302(0x8b);
  672.           Year=R1302(0x8d);                                
  673.           b=R1302(0xc1);
  674.       a=R1302(0xc3);
  675.           a=a/16*10+a%16;
  676.          
  677. }



  678. /******************************ds1820程序***************************************/
  679. void delay_18B20(unsigned int i)//延時1微秒
  680. {
  681.    while(i--);
  682. }
  683. void ds1820rst()/*ds1820復位*/
  684. { unsigned char x=0;
  685. DQ = 1;          //DQ復位
  686. delay_18B20(4); //延時
  687. DQ = 0;          //DQ拉低
  688. delay_18B20(100); //精確延時大于480us
  689. DQ = 1;          //拉高
  690. delay_18B20(40);
  691.    }

  692.    uchar ds1820rd()/*讀數(shù)據(jù)*/
  693. { unsigned char i=0;
  694. unsigned char dat = 0;
  695. for (i=8;i>0;i--)
  696. {   DQ = 0; //給脈沖信號
  697.     dat>>=1;
  698.     DQ = 1; //給脈沖信號
  699.     if(DQ)
  700.     dat|=0x80;
  701.     delay_18B20(10);
  702. }
  703.    return(dat);
  704. }
  705. void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
  706. {unsigned char i=0;
  707.     for (i=8; i>0; i--)
  708.    { DQ = 0;
  709.      DQ = wdata&0x01;
  710.      delay_18B20(10);
  711.      DQ = 1;
  712.      wdata>>=1;
  713.    }
  714. }
  715. read_temp()/*讀取溫度值并轉換*/
  716. {

  717. uchar a,b;
  718. ds1820rst();   
  719. ds1820wr(0xcc);//*跳過讀序列號*/
  720. ds1820wr(0x44);//*啟動溫度轉換*/
  721. ds1820rst();   
  722. ds1820wr(0xcc);//*跳過讀序列號*/
  723. ds1820wr(0xbe);//*讀取溫度*/
  724. a=ds1820rd();
  725. b=ds1820rd();
  726. tvalue=b*16+a/16;

  727.      //tvalue=b;

  728.     //tvalue<<=8;
  729.    //tvalue=tvalue|a;
  730.     //if(tvalue<0x0fff)
  731.     //tflag=0;
  732.     // else
  733.    //{tvalue=~tvalue+1;
  734.     //tflag=1;
  735.    //}
  736. return(tvalue);
  737. }
  738. /*******************************************************************/
  739. uchar code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};/*16行段碼*/





  740. const uchar code timer[13][16]={            /*0~9字符*/

  741. /*--  文字:  0  --*/
  742. /*--  Book Antiqua12;  此字體下對應的點陣為:寬x高=8x20   --*/

  743. 0xFF,0xFF,0xE3,0xDD,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xDD,0xE3,0xFF,0xFF,
  744. /*--  文字:  1  --*/
  745. /*--  Book Antiqua12;  此字體下對應的點陣為:寬x高=8x20   --*/
  746. 0xFF,0xFF,0xEF,0xE7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF,0xFF,


  747. /*--  文字:  2  --*/
  748. /*--  Book Antiqua12;  此字體下對應的點陣為:寬x高=8x20   --*/
  749. 0xFF,0xFF,0xC7,0xBB,0x7D,0x7F,0x7F,0xBF,0xCF,0xF7,0xFB,0xFD,0xFD,0x01,0xFF,0xFF,


  750. ……………………

  751. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
16x64點陣(2).rar (115.76 KB, 下載次數(shù): 90)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区三区蜜桃久 | 欧美一级三级在线观看 | 国产永久免费 | 日韩欧美国产一区二区 | 亚洲国产精品一区二区三区 | 国产精品不卡 | 亚洲 欧美 激情 另类 校园 | 免费中文字幕 | 天天摸天天干 | 午夜日韩 | a毛片视频网站 | 国产精品免费一区二区三区四区 | 91精品国产91久久久久久 | 91av在线免费观看 | 九九免费视频 | xxxxx黄色片| 中文字幕在线免费观看 | 久久久久久久综合 | 在线观看精品 | 最新一级毛片 | 日韩精品在线观看一区二区 | 毛片在线免费 | 99看片网| 久操伊人| 国产精品视频 | 日韩欧美一区二区三区 | 麻豆久久久9性大片 | 四虎午夜剧场 | 午夜视频一区二区 | 成人av一区二区在线观看 | 波多野吉衣在线播放 | 在线欧美亚洲 | 噜噜噜色网 | 99久久国产综合精品麻豆 | 免费视频一区二区 | 一二区成人影院电影网 | 蜜臀久久99精品久久久久野外 | 黄色免费在线网址 | 毛片国产 | 三级黄片毛片 | 在线视频成人 |