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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1968|回復: 0
打印 上一主題 下一主題
收起左側

單片機時鐘顯示程序 要怎么提取出平面指針的代碼?

[復制鏈接]
跳轉到指定樓層
樓主
ID:298554 發表于 2020-12-23 15:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
30黑幣
最近在玩旋轉led屏幕,想單獨屏面顯示指針時鐘,側面數字時鐘或者日期也行,但是就是提取不了商家的代碼用后面老是有錯
  1. /*************************************************************
  2.                      時鐘顯示程序
  3. 單片機 IAP15W4K61S4  或者其他51         晶振頻率 18.432M  
  4. 字模軟件用  PC2002
  5. 逐列取模方式

  6. 電機旋轉方向 順時針
  7. /***********************************************************
  8. 說明:本程序支持配套遙控器調整時間
  9. 播放按鍵  切換調整 時、分、秒、月、日
  10. 加 按鍵:增加
  11. 減 按鍵:減少
  12. menu按鍵: 時鐘復位

  13. 遙控器按鍵1 :平面顯示文字+側面顯示時鐘         可調時
  14. 遙控器按鍵2 :平面指針時鐘+側面顯示文字
  15. *************************************************************/
  16. #include "NEW_8051.H"
  17. #include "intrins.h"
  18. #include "task.h"
  19. #define FOSC 18432000L          //系統頻率
  20. #define BAUD 115200             //串口波特率
  21. bit Scan_bit=0;         
  22. uint Offset=0;
  23. bit BIT_timeout=0;
  24. uchar ucMode=1;         //模式
  25. bit Time0_flag=0;        //定時器T0中斷標志位
  26. uchar DISP_LINE=0;
  27. uint Pt=50,S0,T,D;                //計數用的變量
  28. uchar ucAdder=0;
  29. uchar code TAB_12369[]=
  30. {

  31.         0xFF,0x03,0xFF,0xB3,0x6B,0x6B,0x9B,0xFF,               
  32.         0x8F,0x77,0x7F,0x8F,0x7F,0x77,0x8F,0xFF,//3
  33.         0xFF,0xFF,0x9F,0x6D,0x6D,0x6B,0x87,0xFF,//6        
  34.         0x9F,0xEF,0xF7,0x87,0x77,0x77,0x8F,0xFF,///9


  35. };
  36. /*********中斷子程序**********/
  37. void int0() interrupt 0        //使用外部中斷0
  38. {
  39.         BIT_timeout=1; //起點標志位
  40.         if(ucMode!=1)
  41.         {        

  42.                         D+=(DISP_LINE-180)*2;   //修正值
  43.                            Pt=205+D;
  44.             //得到定時器T0的初設值
  45.                 TH0=-Pt/256;
  46.                 TL0=-Pt%256;   //設置定時器T0的初設值
  47.                 DISP_LINE=0;   //計數器清零,將重新計數        
  48.                 switch (ucMode)
  49.                 {
  50.                         case 0x02:
  51.                                 du1302();//獲取時間
  52.                                 Sec=Sec/16*10+Sec%16 ;
  53.                     Cent=Cent/16*10+Cent%16 ;
  54.                         Hour=Hour/16*10+Hour%16 ;
  55.                                 if(Hour>11)
  56.                                 {
  57.                                         Hour=Hour-12;        
  58.                                 }
  59.                                 Sec=Sec*3;//秒針定位="秒"*3
  60.                                 Hour=(Hour*15)+(Cent/4);//時針定位="時"*15+"分"/4
  61.                                 Cent=Cent*3;//分針定位="分"*3
  62.                                 Offset++;
  63.                                 if(Offset>672)//側面有多少文字 這個值就對應改成  多少字*16
  64.                                 Offset=0;        
  65.                                 break;
  66.                         case 0x03:
  67.                                 du1302();//獲取時間
  68.                                 Sec=Sec/16*10+Sec%16 ;
  69.                     Cent=Cent/16*10+Cent%16 ;
  70.                         Hour=Hour/16*10+Hour%16 ;
  71.                                 if(Hour>12)
  72.                                 {
  73.                                         Hour=Hour-12;        
  74.                                 }
  75.                                 break;
  76.                         default:
  77.                                 break;
  78.                 }
  79.         }
  80. }
  81. /******************************************/
  82. void Send_uart(unsigned char d)          /*從串口發送數據*/
  83. {
  84.           ES=0;
  85.       SBUF=d;
  86.           while(TI==0);       //等待發送完畢
  87.       TI=0;
  88.           ES=1;
  89. }
  90. /*************************************/
  91. //圖片切換以及模擬表盤顯示函數
  92. void display_pic()
  93. {
  94.         //uchar date1,date2,date3,date4;
  95.         if(DISP_LINE<180)
  96.         {
  97.                 if(Time0_flag)
  98.                 {
  99.                          Time0_flag=0;
  100.                         Close();
  101.                         if(ucMode==2)
  102.                         {
  103.                                   //DISP_LINE=DISP_LINE-1;
  104.                                       //標整點,以及顯示數字12,3,6,9
  105.                               if ( (DISP_LINE >= 175) || (DISP_LINE <= 3))  //12點
  106.                               {
  107.                                ucAdder=DISP_LINE+4 ;
  108.                                if ( ucAdder>=180) ucAdder=ucAdder-180 ;
  109.                               }
  110.                               else if ( (DISP_LINE >= 41) && (DISP_LINE <= 48)) //3點
  111.                               {
  112.                                ucAdder=DISP_LINE-41+8*1 ;
  113.                               }
  114.                               else if ( (DISP_LINE >= 86) && (DISP_LINE <= 93)) //6點
  115.                               {
  116.                                ucAdder=DISP_LINE-86+8*2 ;
  117.                               }
  118.                               else if ( (DISP_LINE >= 131) && (DISP_LINE <= 138)) //9點
  119.                               {
  120.                                ucAdder=DISP_LINE-131+8*3 ;
  121.                               }
  122.                                   else
  123.                                   {
  124.                                          ucAdder=250;
  125.                                         /*************形成表盤*******************/
  126.                                    switch (DISP_LINE)   
  127.                                {
  128.                                         case 180*1/12 :    //1點
  129.                                         case 180*2/12 :    //2點
  130.                                         case 180*4/12 :    //4點
  131.                                         case 180*5/12 :    //5點
  132.                                         case 180*7/12 :    //6點
  133.                                         case 180*8/12 :    //7點
  134.                                         case 180*10/12 :   //10點
  135.                                         case 180*11/12 :   //11點
  136.                                           //LED=0;
  137.                                                   PortA(0X0F);
  138.                                          break;
  139.                                }
  140.                                    }
  141.                                    if ( ucAdder < 32 )
  142.                                     {
  143.                                                 PortA(TAB_12369[ucAdder]) ; //查表顯示12,3,6,9
  144.                                                 
  145.                                         }
  146.                            /****************************************/   
  147.                                      //顯示指針"時"
  148.                         //           i = Hour ;
  149.                         //       j = Hour ;
  150.                         //      if ( ++i > 179 ) i=0 ;    //i+1,結果>179,則清零
  151.                         //      if ( --j > 179 ) i=179 ;   //j-1,結果為負,則重新賦值179
  152.                                 if(( (Hour-2)<=DISP_LINE)&&((Hour+2)>=DISP_LINE) )
  153.                                 {
  154.                                         if(((Hour-1)==DISP_LINE)||((Hour+1)==DISP_LINE))
  155.                                         {
  156.                                                 PortD(0XFF);
  157.                                                 PortC(0XBF);
  158.                                        
  159.                                         }
  160.                                         else if(((Hour-2)==DISP_LINE)||((Hour+2)==DISP_LINE))
  161.                                         {
  162.                                                 PortD(0XFF);
  163.                                                 PortC(0XDF);
  164.                                                 
  165.                                         }        
  166.                                 }
  167.                                    if(Hour==DISP_LINE)//||(DISP_LINE==i)||(DISP_LINE==j
  168.                             {
  169.                                 
  170.                                 PortD(0X80) ;
  171.                                         PortC(0X00);
  172.                             }   
  173.                             //顯示指針"分"
  174.                                 if(( (Cent-2)<=DISP_LINE)&&((Cent+2)>=DISP_LINE) )
  175.                                 {
  176.                                         if(((Cent-1)==DISP_LINE)||((Cent+1)==DISP_LINE))
  177.                                         {
  178.                                                 PortC(0XFF);
  179.                                                 PortB(0XFB);
  180.                                                 PortD(0XFF);
  181.                                        
  182.                                         }        
  183.                                         else if(((Cent-2)==DISP_LINE)||((Cent+2)==DISP_LINE))
  184.                                         {
  185.                                                 PortC(0XFF);
  186.                                                 PortB(0XFD);
  187.                                                 PortD(0XFF);
  188.                                                 
  189.                                         }
  190.                                        
  191.                                 }
  192.                                 if(Cent==DISP_LINE)
  193.                             {
  194.                                 //PortB=(0X00);
  195.                                         PortC(0X00);
  196.                                         PortB(0XF0);
  197.                                         PortD(0X80);                                       
  198.                             }
  199.                                 //顯示指針"秒"
  200.                                 if(( (Sec-2)<=DISP_LINE)&&((Sec+2)>=DISP_LINE) )
  201.                                 {
  202.                                         if(((Sec-1)==DISP_LINE)||((Sec+1)==DISP_LINE))
  203.                                         {
  204.                                                 PortB(0XBF);
  205.                                                 PortC(0XFF);
  206.                                                 PortD(0XFF);                                       
  207.                                         }
  208.                                         else if(((Sec-2)==DISP_LINE)||((Sec+2)==DISP_LINE))
  209.                                         {
  210.                                                 PortB(0XDF);
  211.                                                 PortC(0XFF);
  212.                                                 PortD(0XFF);
  213.                                         }                                                
  214.                                 }
  215.                             if(Sec==DISP_LINE)
  216.                             {
  217.                                 PortB(0X00);
  218.                                         PortC(0X00);
  219.                                         PortD(0X80);                       
  220.                             }
  221.                                 //DISP_LINE=DISP_LINE+1;
  222.                           Show_R(Lzimo[(DISP_LINE+Offset)*2],Lzimo[(DISP_LINE+Offset)*2+1]);//送16*16文字顯示        
  223.                         }
  224.                 }
  225.       }
  226. }
  227. /*********************************************/
  228. void Init(void)
  229. {
  230.            P0M0=0X00;//初始化IO口 為準雙向口
  231.         P0M1=0X00;

  232.         P1M0=0X00;
  233.         P1M1=0X00;

  234.         P2M0=0X00;
  235.         P2M1=0X00;

  236.         P3M0=0X00;
  237.         P3M1=0X00;

  238.         P4M0=0X00;
  239.         P4M1=0X00;

  240.         P5M0=0X00;
  241.         P5M1=0X00;

  242.         P6M0=0X00;
  243.         P6M1=0X00;

  244.         P7M0=0X00;
  245.         P7M1=0X00;

  246.         Show_R(0x55,0x55);//測試
  247.         Show_L(0x55,0x55,0x55,0x55);//測試

  248.   AUXR &= 0x7F;                //定時器時鐘12T模式  //200us
  249.         TMOD &= 0xF0;                //設置定時器模式
  250.         TMOD |= 0x01;                //設置定時器模式
  251.         TL0 = 0xCD;                //設置定時初值
  252.         TH0 = 0xFE;                //設置定時初值
  253.         TF0 = 0;                //清除TF0標志
  254.         TR0 = 1;                //定時器0開始計時
  255.         ET0=1;

  256.         AUXR &= 0xBF;                //定時器時鐘12T模式
  257.         TMOD &= 0x0F;                //設置定時器模式
  258.         TMOD |= 0x20;                //設置定時器模式
  259.         TL1 = 0x12;                //設置定時初值 155US
  260.         TH1 = 0x12;                //設置定時重載值
  261.         TF1 = 0;                //清除TF1標志
  262.         ET1=1;
  263.         TR1 = 0;                //定時器1開始計時

  264.         SCON = 0x50;
  265.          T2L = (65536 - (FOSC/4/BAUD));   //設置波特率重裝值
  266.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  267.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  268.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器
  269.    // ES = 1;                     //使能串口1中斷

  270.      IT0 = 1;    //外部中斷為邊沿觸發
  271.                    //設置INT0的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
  272.      EX0 = 1;  //使能INT0中斷

  273.          IT1=1;
  274.          EX1=1;//外部中斷1 下降沿 中斷
  275.          EA = 1;                 
  276. }
  277. /************************************/
  278. void Timer0Interrupt(void) interrupt 1
  279. {                        
  280.     Time0_flag=1;                   //定時中斷標志位置1;
  281.         TH0=-Pt/256;TL0=-Pt%256;   //設置定時器T0的初設值
  282.         DISP_LINE++;                    //計數
  283. }
  284. /*****主函數*****/
  285. void main(void)
  286. {
  287.         Init();
  288.         Auto_Set1302(starts_time);//自動初始化時鐘
  289.         Send_uart(0x55);
  290.         
  291.     //主程序
  292.            while(1)
  293.     {                       
  294.                 if((ucMode==2)||(ucMode==3))
  295.                 {
  296.                         display_pic();
  297.                 }
  298.                  //BIT_timeout=1;
  299.                 if(BIT_timeout==1)        //起點判斷
  300.                  {                        
  301.                         BIT_timeout=0; //清零
  302.                         
  303.                         Scan_bit=1;// 起點檢測到后 LED不再流水測試
  304.                         if( new_code ) //有紅外按鍵
  305.                         {
  306.                                 new_code=0;
  307.                                 switch( key_code ) //根據不同的按鍵值執行不同的動作
  308.                                 {        
  309.                                    case 0x0C:
  310.                                         ucMode=0x01;//數字鐘模式+側面文字
  311.                                         TR0 = 0;        
  312.                                 break;

  313.                                 case 0x18:
  314.                                         ucMode=0x02;//指針式時鐘模式
  315.                                         TR0 = 1;
  316.                                 break;
  317.                                 case 0x5E:
  318.                                 //        ucMode=0x03;//指針時鐘模式
  319.                                         TR0=1;                                 
  320.                                 break;
  321.                                         case 0x40:         //調時加
  322.                                                 Set(id,1);

  323.                                         break;
  324.         
  325.                                         case 0x19: //調時減                                
  326.                                                         Set(id,0);
  327.                                        
  328.                                         break;
  329.                                        
  330.                                         case 0x15://調時切換
  331.                                                                 id++;                                                
  332.                                                                    if(id>5)
  333.                                                                 {
  334.                                                                     id=0;
  335.                                                                 }
  336.                                         break;
  337.                                         case 0x47://時鐘初始化
  338.                                                         Set1302(starts_time);    //初始化
  339.                                                         W1302(0x8e,0x00); //控制命令,WP=0,寫操作               
  340.                                                         W1302(0x90,0xa5); //打淶二級? 一個二級管串聯一個2K玷
  341.                                                         //write_1302Data(DISP_TIME_adder,160);
  342.                                         break;
  343.         
  344.                                         default: break;
  345.                                 }
  346.                                 key_code=0;
  347.                         }
  348.                
  349.                         if(ucMode==1)
  350.                         {
  351.                                 du1302();//讀取時鐘芯片 的時鐘數據
  352.                                 Show_line_time();//顯示時間
  353.                         }           
  354.                     }   
  355.    
  356.                 }
  357. }

復制代碼


實驗4、 指針式時鐘顯示程序.zip

124.2 KB, 下載次數: 2

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产粉嫩尤物极品99综合精品 | 中文一区 | 91久久久精品国产一区二区蜜臀 | 免费电影av | 久久99精品久久久久久青青日本 | 欧美一区二区三区四区视频 | 玖玖在线精品 | 国产日韩一区 | 亚洲一区二区电影在线观看 | 成人伊人 | 精品96久久久久久中文字幕无 | 成人精品一区二区三区中文字幕 | 久久久久久九九九九 | 国产高清精品一区 | 女同久久另类99精品国产 | 成人美女免费网站视频 | 91资源在线 | 亚洲国产高清在线观看 | 天天射天天干 | 在线看av的网址 | 国产欧美在线观看 | 夜夜草| 国产成人精品久久二区二区91 | 天天天天天天天干 | 蜜臀网 | 亚洲国产成人精品女人久久久野战 | 久久三级影院 | 久久久久久九九九九 | 亚洲欧美中文日韩在线v日本 | 日韩一级免费看 | 欧美成人aaa级毛片在线视频 | 日韩男人天堂 | 成人精品国产 | 一本色道久久综合亚洲精品高清 | 黄色毛片免费视频 | 理论片免费在线观看 | 国产精品欧美一区二区三区不卡 | 操到爽 | 国产免费让你躁在线视频 | 久草综合在线视频 | av官网在线|