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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1363|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

C51單片機(jī)設(shè)定位閃爍關(guān)閉不掉 附程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:611626 發(fā)表于 2023-8-9 17:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5.         #define AT24C02_ADDRESS  0xA0 //0xA0 1010 00000寫地址
  6. uint Count;
  7. uint Set_Count;

  8. uint Num_L;
  9. uint Num_H;

  10. uint num1;
  11. char  num2=0;

  12. sbit I2C_SCL= P1^6;
  13. sbit I2C_SDA= P1^7;

  14. sbit Start_Dianji=P3^0; //電機(jī)啟動(dòng)_dianji
  15. sbit  forward=P3^1; //正轉(zhuǎn)檢測
  16. //sbit  back=P3^1;    //反轉(zhuǎn)檢測
  17. sbit  run=P3^7;      //運(yùn)行信號(hào)
  18. sbit  jia_up=P1^0;// 增加鍵
  19. sbit  jian_down=P1^1;//減少鍵
  20. sbit  yiwei_up=P1^2; //移位鍵
  21. sbit  qingling=P1^3; //清零鍵
  22. uchar code ledcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};         //共陰數(shù)碼管編碼0-9    modtable={ {0,0,0,0},{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1} ,{1,1,1,1} }
  23. uchar data Ledbuff[]={0, 0, 0, 0, 0, 0, 0, 0};//顯示緩沖區(qū)
  24. unsigned char n = 0, n_50ms; //添加閃爍.n=數(shù)碼管移動(dòng)位數(shù)
  25. bit flag;   //添加閃爍

  26. #define I2CDelay_us(){_nop_();_nop_();_nop_();_nop_();}//voidI2CDelay_us
  27. /***********************
  28. AT24C初始化I2C_init
  29. *************************/
  30. void I2C_init()
  31. {
  32.         I2C_SCL=1;
  33.         I2C_SDA=1;//首先確保SCL SDA都是高電平        
  34. }

  35. /***********************
  36. 產(chǎn)生總線起始信號(hào)I2C_Start
  37. *************************/
  38. void I2C_Start(void )
  39. {
  40.   I2C_SDA=1;//首先確保SCL SDA都是高電平
  41.         I2C_SCL=1; //確保SCL高電平
  42.         I2C_SDA=0;//先在SCL為高時(shí)拉低SDA,即為起始信號(hào)
  43.         I2C_SCL=0; //在拉低 SCL,鉗住I2C總線準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  44. }
  45. /***********************
  46. 產(chǎn)生總線停止信號(hào):先拉低SDA在拉低SCL
  47. *************************/

  48.   void I2C_Stop(void )
  49. {
  50.         I2C_SDA=0;//首先確保SCL SDA都是低電平
  51.         I2C_SCL=1; //先拉高 SCL
  52.         I2C_SDA=1;//在拉高 SDA
  53. }
  54. /*******************************************************************************
  55. *@brief I2C發(fā)送一個(gè)字節(jié)數(shù)據(jù)
  56. *@param Byte要發(fā)送的字節(jié)
  57. *@retval 無
  58. 起始信號(hào)后必須送一個(gè)從機(jī)地址(7)位,1-7位為要接收器件的地址,第八位讀寫位0發(fā)送1接收,第9位ACK應(yīng)答位,
  59. 緊接著為第一個(gè)數(shù)據(jù)字節(jié),然后一位應(yīng)答位ACK后面繼續(xù)第二個(gè)數(shù)據(jù)字節(jié)
  60. **********************************************************************************/
  61. void  I2C_SendByte(unsigned char Byte)
  62. {
  63. unsigned char i;
  64.         for(i=0;i<8;i++)
  65.            {
  66.                 I2C_SDA=Byte&(0x80>>i);  //1000 0000右移 i個(gè)位
  67.                 I2C_SCL=1; //先拉高 SCL
  68.                   I2C_SCL=0; //SCL        
  69.              }
  70. }
  71. /***********************************************************************************************
  72. *@brief I2C讀取 接收一個(gè)字節(jié)
  73. *@param 無
  74. *@retval  讀取 接收到的一個(gè)字節(jié)數(shù)據(jù)
  75. ********************************************************************************************/
  76. unsigned char I2C_ReceiveByte(void)
  77. {
  78. unsigned char i,Byte=0x00;//
  79.         I2C_SDA=1; //
  80.         for(i=0;i<8;i++)
  81.         {
  82.         I2C_SCL=1; //先拉高 SCL
  83.         if(I2C_SDA){Byte |= (0x80>>i); }
  84.         I2C_SCL=0; //SCL        
  85.         }
  86. return Byte;
  87. }
  88. /*********************
  89. *@brief I2C發(fā)送應(yīng)答Ack
  90. *@param AckBit應(yīng)答位 0為應(yīng)答(成功) 1為非應(yīng)答(失敗)
  91. *@retval 無
  92. ************************/
  93. void I2C_SendAck(unsigned char AckBit)
  94. {
  95.         I2C_SDA=AckBit;
  96.         I2C_SCL=1; //先拉高 SCL
  97.         I2C_SCL=0; //SCL        
  98. }
  99. /*********************
  100. *@brief I2C接收應(yīng)答位
  101. *@param 無
  102. *@retval AckBit應(yīng)答位 0為應(yīng)答(成功) 1為非應(yīng)答(失敗)
  103. ************************/
  104. unsigned char I2C_ReceiveAck(void)
  105. {
  106. unsigned char AckBit;
  107.         I2C_SDA=1;
  108.         I2C_SCL=1; //先拉高 SCL
  109.   AckBit=I2C_SDA;
  110.         I2C_SCL=0; //SCL
  111.        I2C_SDA=1;//少此行錯(cuò)誤不能讀取

  112. return AckBit; //返回值
  113. }
  114. /**********向AT24C寫數(shù)據(jù)***********
  115. *@brief AT24C寫入一個(gè)字節(jié)
  116. *@param WordAddress要寫入字節(jié)的地址
  117. *@param Data要寫入的數(shù)據(jù)
  118. *@retval無
  119. 寫多字節(jié)時(shí),寫入一個(gè)字節(jié)。在寫一個(gè)字節(jié)前,必須延時(shí)5ms
  120. ************************/
  121. void AT24C_WriteByte(unsigned char WordAddress,Data)
  122. {
  123.   I2C_Start();//啟動(dòng)總線
  124.   I2C_SendByte(AT24C02_ADDRESS);//發(fā)送寫操作地址+寫數(shù)據(jù)(0xa0)
  125.         I2C_ReceiveAck();                      //等待應(yīng)答
  126.         I2C_SendByte(WordAddress);//要寫入的地址
  127.         I2C_ReceiveAck();       //等待應(yīng)答完成
  128.    I2C_SendByte(Data);  //要寫入的數(shù)據(jù),第一字節(jié) ,第二字節(jié)注意:每個(gè)字節(jié)都回應(yīng)一個(gè)應(yīng)答位0,如果沒有回應(yīng)說明寫入不成功
  129.         I2C_ReceiveAck();       //等待完成  注意:每個(gè)字節(jié)都回應(yīng)一個(gè)應(yīng)答位0,如果沒有回應(yīng)說明寫入不成功
  130.         I2C_Stop(); //發(fā)送結(jié)束信號(hào):停止總線
  131. }
  132. /************從AT24C中讀出數(shù)據(jù)*********
  133. *@brief AT24C讀取一個(gè)字節(jié)
  134. *@param WordAddress要讀出字節(jié)的地址
  135. *@param 無
  136. *@retval要讀出的數(shù)據(jù)
  137. ************************/
  138. unsigned char AT24C_ReadByte(unsigned char WordAddress) //void
  139. {
  140.         unsigned char Data;
  141.   I2C_Start();                    //發(fā)送起始信號(hào):啟動(dòng)總線
  142.    I2C_SendByte(AT24C02_ADDRESS);  //接上首字節(jié),發(fā)送器件寫操作地址+寫數(shù)據(jù)(0xa0)這里寫操作時(shí)維綸把所要讀的數(shù)據(jù)地址AT24C02_ADDRESS通知讀取哪個(gè)地址信息
  143.         I2C_ReceiveAck(); //等待完成應(yīng)答
  144.         I2C_SendByte(WordAddress);//發(fā)送要讀取內(nèi)存的地址(WORD ADDRESS)
  145.         I2C_ReceiveAck();       //等待應(yīng)答完成
  146.          I2C_Start();//在次啟動(dòng)總線
  147.         I2C_SendByte(AT24C02_ADDRESS| 0x01);  //對(duì)E2PROM進(jìn)行讀操作(0XA1)E2PROM會(huì)自動(dòng)向主機(jī)發(fā)回?cái)?shù)據(jù),讀取一個(gè)字節(jié)后回應(yīng)一個(gè)應(yīng)答位,后會(huì)繼續(xù)傳送下一個(gè)地址的數(shù)據(jù)0xa1
  148.         I2C_ReceiveAck();       //等待完成
  149.         Data= I2C_ReceiveByte();  //要讀出的數(shù)據(jù)到Data
  150.    I2C_SendAck(1);       //等待完成::如果不想讀了,就發(fā)送一個(gè)非應(yīng)答位NAK(1),發(fā)送結(jié)束,停止總線
  151.         I2C_Stop(); //停止總線
  152.         return Data ;//返回值
  153. }

  154. /************延時(shí)函數(shù)***********************/
  155. void delay_ms(uint ms)

  156. {
  157.   uchar k;
  158. while(ms--)
  159.       {
  160.           for(k = 0; k < 120; k++);
  161.        }
  162. }
  163. ///////////////////////////////////////////////////////////////

  164. void display()                        //顯示程序display(uchar a,b,c,d,e)        

  165. {
  166.     unsigned char  i,w = 1;//添加閃爍  i, w = 128

  167. /********************************/
  168.         switch(i)//使用多分支選擇語句 i=count display 0x代表16進(jìn)制
  169.         {
  170.                 case(0):Ledbuff[7]=Set_Count/1000;break;   //取設(shè)定千位字符送緩存
  171.                 case(1):Ledbuff[6]=Set_Count/100%10;break; //取設(shè)定百位字符送緩沖
  172.                 case(2):Ledbuff[5]=Set_Count/10%10;break;   //取設(shè)定十位字符送緩沖
  173.                 case(3):Ledbuff[4]=Set_Count%10;break;     //取設(shè)定個(gè)位字符送緩存
  174.                   
  175.                 case(4):Ledbuff[3]=Count/1000;break;         //取計(jì)數(shù)千位字符送緩存
  176.                 case(5):Ledbuff[2]=Count/100%10;break;
  177.                 case(6):Ledbuff[1]=Count/10%10;break;
  178.                 case(7):Ledbuff[0]=Count%10;break;
  179.         }

  180.         P0=0x00;   //消陰:段碼全部低電平關(guān)閉
  181.           //添加閃爍: 閃爍字符 0,N閃爍位置  Ledbuff[n] = 10;          Ledbuff[ n ] = i  Ledbuff[ n+3 ] 是從第四個(gè)字符開始閃爍
  182.          if (flag)   Ledbuff[ n+3 ]  = 245 ;   //共陰字碼表取反10 ,共陽=10 因?yàn)閚是從1開始,所以第一個(gè)閃爍的是Ledbuff[4]  ~10=(0000 1010)
  183.         /**********************************/
  184.         P2=~(0x01<<i); //P2位選,左移i位取反        
  185.         P0=ledcode[Ledbuff[i]];  //P0字符刷新顯示
  186.         delay_ms(1); //顯示2MS
  187.         i=++i%8;   //自加1
  188. }

  189. void  Adjust()        //按鍵設(shè)定匝數(shù),用P2.4個(gè)位-P2.7(千位)前四位數(shù)碼管顯示void
  190.   {
  191. // **********原程序************************   
  192.       if(yiwei_up==0) //移位按鍵按下
  193.                   {
  194.                    //********這里開啟定時(shí)中斷,進(jìn)入閃爍計(jì)時(shí)**************************
  195.                          while(!yiwei_up); //等待移位按鍵松開                        
  196.                            {                             
  197.                             n ++;    if(n>4)   n=1; //移位:左移一位        ,移到千位后,在按返回個(gè)位                       
  198.                            }         
  199.                            ET0=1; //開啟T0
  200.                           TR0 = 1;      //   啟動(dòng)T0 工作開始 選擇的數(shù)碼管開始閃爍
  201.                     }
  202.            
  203.         //加減按鍵檢測        
  204.         if(Set_Count>=0 && Set_Count<9999)//最大9999yiwei_Count=0; //設(shè)定加 jia_up==0                    
  205.                   {
  206.                      if (jia_up==0)   //增加按鍵按下                                                     
  207.                         {        
  208.                          while(!jia_up);//等待加按鍵松開
  209.                             num1=Set_Count ;
  210.                                 {
  211.                                        if (n  ==  1 )        //               
  212.                                             {
  213.                                              Set_Count += 1;         //設(shè)定+1
  214.                                              }
  215.                                    if ( n  == 2 &&Set_Count<9990)
  216.                                             {
  217.                                                    Set_Count += 10;         //設(shè)定+10
  218.                                             }
  219.                                   if ( n  == 3 && Set_Count<9900 )
  220.                                            {
  221.                                                     Set_Count += 100;         //設(shè)定+100
  222.                                            }        
  223.                                   if ( n  == 4 &&  Set_Count<9000 )
  224.                                           {
  225.                                                   Set_Count += 1000;         //設(shè)定+1000
  226.                                           }
  227.                                 }        
  228.                       }                  
  229.               if (jian_down==0)   //減少按鍵按下                                                     
  230.                      {        
  231.                         while(!jian_down);//等待按鍵松開
  232.                             num1=Set_Count ;
  233.                                 {
  234.                                       if ( n ==1 && Set_Count>1 )        //        移位在個(gè)位        
  235.                                        {
  236.                                         Set_Count -= 1;         //設(shè)定-1
  237.                                         }
  238.                                 if ( n  == 2 && Set_Count>9)
  239.                                        {
  240.                                          Set_Count -= 10;         //設(shè)定+1
  241.                                        }
  242.                                if (n == 3 && Set_Count>99 )
  243.                                       {
  244.                                               Set_Count -= 100;         //設(shè)定-100
  245.                                        }        
  246.                              if ( n == 4 && Set_Count>999 )
  247.                                     {
  248.                                            Set_Count -= 1000;         //設(shè)定+1
  249.                                     }
  250.                             }        
  251.                  }

  252.             if ( num1 != Set_Count )     //   設(shè)定值有變化,存入24c
  253.                  {
  254.                               //寫入數(shù)據(jù)
  255.                      AT24C_WriteByte(0,Set_Count%256);
  256.                      delay_ms(5) ; //顯示2MS
  257.                      AT24C_WriteByte(1,Set_Count/256);
  258.                     delay_ms(5); //顯示2MS
  259.                  }
  260.            }        
  261.         if( num2==3)   //設(shè)定超時(shí)保存后,閃爍幾次關(guān)閉閃爍
  262.           {ET0=1;TR0 = 0;    num2=0 ;}   //num2++ ;                     
  263.           num1=Set_Count ;                        //保存完成 將設(shè)定值送到設(shè)定值變化緩存        
  264.         
  265. }        
  266.                
  267. /**********************************************************
  268. 主函數(shù) ET=1 // 是打開定時(shí)器0中斷允許,EA = 1; // 是打開總中斷允許
  269. **********************************************************/               
  270. void main()
  271. {
  272.         /*****************Y添加閃爍中斷初始化**********************/
  273.      TMOD = 0x01;     //是配置定時(shí)器0為16位定時(shí)模式
  274.     TH0 = 0x3C;      //  設(shè)定高位初值
  275.     TL0 = 0xB0;   //  設(shè)定低位初值
  276.     EA=1 ;        //開啟總中斷
  277.   //  IE = 0x82;   //中斷允許寄存器0x82=10000010開了總中斷 ,相當(dāng)于EA=1打開總中斷 ;ET0=1;打開T0
  278.    /*********************************************************************/
  279.    I2C_init();  //初始化24C02
  280.   //讀取低八位從24C-02的0x00讀取到Num_L,高八位從0x01讀取到Num_H
  281.         Num_L = AT24C_ReadByte(0);
  282.         Num_H  |=AT24C_ReadByte(1)<<8; //左移8位
  283.         Set_Count = Num_H+Num_L;  //高八位加上低八位

  284. while(1)
  285.         {        
  286.           Adjust();         
  287.         display();               
  288.        }
  289. }

  290. //-------------閃爍中斷--------------------------

  291. void T0_INT() interrupt 1
  292. {
  293.     TH0 = 0x3C;  //  設(shè)定低位初值
  294.     TL0 = 0xB0;   //  設(shè)定高位初值
  295.     n_50ms++;    //  進(jìn)入中斷自加
  296.     n_50ms %= 6;   //10對(duì)應(yīng)1Hz  取余后如果=6
  297.     if(!n_50ms)
  298.     {
  299.        flag = ~flag;
  300.        if ( num1 != Set_Count )  //設(shè)定后延時(shí)關(guān)閉閃爍
  301.           {
  302.            num2++ ;         
  303.    //  if( num2==3)
  304.         //    { flag =0;ET0=1;TR0 = 0;    num2=0 ; num1=Set_Count ;}   //num2++ ;               
  305.           }
  306.     }
  307. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:611626 發(fā)表于 2023-8-9 20:31 | 只看該作者
   設(shè)置了一個(gè)標(biāo)志位,可以了
if ( num1 != Set_Count )     //   設(shè)定值有變化,存入24c
                 {
                              //寫入數(shù)據(jù)
                     AT24C_WriteByte(0,Set_Count%256);
                     delay_ms(5) ; //顯示2MS
                     AT24C_WriteByte(1,Set_Count/256);
                    delay_ms(5); //顯示2MS
                    bc_Flag=1;   //保存完成標(biāo)志
                              num1=Set_Count ;                        //保存完成 將設(shè)定值送到設(shè)定值變化緩存
                 }
           }       
        if( num2==3)   //設(shè)定超時(shí)保存后,閃爍幾次關(guān)閉閃爍
          {ET0=1;TR0 = 0;    num2=0 ;   bc_Flag=0;flag=0;}   //num2++ ;                                    
}       

//中斷內(nèi)
   if (    bc_Flag==1 )  //設(shè)定后延時(shí)關(guān)閉閃爍
          {
           num2++ ;               
          }

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久夜夜 | 一区二区三区四区在线免费观看 | 日韩国产欧美视频 | 欧美精品一区二区三区蜜桃视频 | 美女露尿口视频 | 日韩av一区二区在线观看 | 久在线视频播放免费视频 | 午夜免费视频 | 91视频国产精品 | 日韩中文一区 | 蜜桃在线视频 | 伊人久久麻豆 | 成人在线精品视频 | 视频一区在线播放 | 插插插干干干 | 日韩视频在线一区 | 久久久久久中文字幕 | 欧美一级免费看 | 国产91av视频 | 午夜国产 | 久久久久久国产精品 | 成人免费影院 | 亚洲精品在线视频 | 久久久久久久久久久久久久av | 亚洲视频二区 | 欧美男人的天堂 | 日韩欧美在线免费观看视频 | 精品欧美一区二区三区久久久 | 久久国产亚洲精品 | 99久久婷婷国产综合精品电影 | 日本一区二区三区在线观看 | 一区二区在线观看免费视频 | 久久三级av | 武道仙尊动漫在线观看 | 成人免费网站www网站高清 | аⅴ资源新版在线天堂 | 天天天天操 | 亚洲电影一区二区三区 | 爱爱爱av | 国产亚洲欧美日韩精品一区二区三区 | 亚洲综合无码一区二区 |