欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1240|回復: 7
收起左側

求大神幫我看看這個程序

[復制鏈接]
ID:881715 發表于 2021-11-5 11:56 | 顯示全部樓層 |閱讀模式
          各位大神大家好,一個程序我弄了很久多天了實在弄不了,特來求教!!! 程序功能:我設置了四個按鍵,一個加鍵(k1jia),一個減鍵(k2jian),用來設置數據的,開機從24C02里讀取數據,用這兩鍵調節讀出的數據,這數據是調用延時函數次數的,如不調節則調用延時函數的次數為讀出的數據
,第三個鍵是開關鍵(kaiguan),點動一下開關鍵,小燈(out)點亮,經延時后熄滅。第四個鍵是寫入鍵(k3ws),按下后將數據寫入AT24C02為下次上電做讀數據準備。
  1. #include<reg51.h>               
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. sbit k1jia=P1^1;
  5. sbit k2jian=P1^3;
  6. sbit k3ws=P1^4;        //寫入數據鍵
  7. sbit out=P2^7; //小燈,為1時點亮
  8. sbit scl=P2^0;
  9. sbit sda=P2^1;
  10. sbit kaiguan=P3^3;//開關鍵
  11. unsigned char a=0,b=1,c;
  12. void delay100ms()   //誤差 0us
  13. {
  14.     unsigned char a,b,c;
  15.     for(c=7;c>0;c--)
  16.         for(b=74;b>0;b--)
  17.             for(a=95;a>0;a--);
  18. }
  19. void delay88ms()
  20.   
  21. {
  22.     unsigned char a,b,c;
  23.     for(c=5;c>0;c--)
  24.         for(b=212;b>0;b--)
  25.             for(a=40;a>0;a--);
  26. }
  27. uchar anzhi()
  28. {
  29. if((k1jia==0)&&(a<36))
  30.   {        delay88ms();
  31.         if((k1jia==0)&&(a<36))
  32.          {        a=a+1;
  33.                 while(!k1jia);
  34.                 return a;
  35.          }
  36. }
  37.   if((k2jian==0)&&(a>1))
  38.   {        delay88ms();
  39.         if((k2jian==0)&&(a>1))
  40.          {        a=a-1;
  41.                 while(!k2jian);
  42.                 return a;
  43.          }

  44.   }
  45.    else
  46.    return a;
  47. }

  48. void delay7us()  //  延時函數
  49. {                                                 
  50.     unsigned char a;
  51.     for(a=2;a>0;a--);
  52. }
  53.    void init()
  54. {sda=1;
  55.   delay7us();
  56.    scl=1;
  57. delay7us();
  58. }        
  59. /*啟動信號函數*/
  60. void start()  //啟動信號函數
  61. { scl=1;         
  62.    sda=1;
  63.    delay7us();
  64.   sda=0;
  65.    delay7us();       
  66. }       
  67. /*寫一個字節的函數*/
  68. void write_iic_byte(uchar dat)       
  69.                               
  70. { uchar i;
  71.    scl=0;  /*主機拉低為的是SDA數據線
  72.                    可以發生變化并為SDA拉高,讓
  73.                    接受設備接收數據做準備*/
  74.         /*發送八位數據*/
  75.    for(i=0;i<8;i++)
  76.     { if(dat&0X80)
  77.              sda=1;/*主機將數據1存入SDA*/
  78.          else
  79.                  sda=0;/*主機將數據0存入SDA
  80.                                 ,也可認為是存入一個
  81.                                 存儲器*/
  82.           scl=1;  /*主機將時鐘數據線拉高*/
  83.            delay7us(); /*延時接收設備在此期間
  84.                                   自動取走*/
  85.            dat=dat<<1;/* 數據左移一位,次高位
  86.                               變成發送數據位*/
  87.                 scl=0;/*時鐘線拉低為更改發送數據
  88.                            位做準備,只有其為低數據線
  89.                            上的數據才會發生改變。*/
  90.            delay7us();                  
  91. }         
  92.      sda=1;
  93.               /*釋放數據線*/       
  94.   }                        
  95. /*讀一個字節的函數*/
  96. uchar read_iic_byte()
  97. { uchar i,v;/*暫時為空變量,8次后
  98.                              存儲要保存的數據*/
  99.    sda=1;/*主機釋放數據線,這數據
  100.                   狀態以后有發送設備決定*/
  101.    scl=0;/*主機將時鐘信號線拉低,
  102.                    /*SDA線上的數據才會改變*/
  103.    /*從設備發送八位數據*/
  104.    for(i=0;i<8;i++)
  105.         { v=v<<1; /*第一次循環無意義,以后
  106.                           發送用*/
  107.           scl=1;  /*以后發送期間數據穩定*/
  108.          delay7us();/*延時使主機有時間取走
  109.                            數據*/
  110.          if(sda) /*SDA發送從設備里最高位數據
  111.                           1,第一次循環從此發送第一
  112.                           位數據*/
  113.                 v=v|0X01;/*把1傳入變量V的最低位*/
  114.         scl=0;         /*時鐘線拉低發送數據由發送
  115.                            設備自動改變*/

  116.         delay7us();/*延時使時鐘線可靠拉低
  117.                                  ,有充足時間數據被讀走
  118.                                  */
  119.         }
  120.         return v; /*被讀的數據存在V中,
  121.                           作為返回值/*返回*/
  122. }        
  123.           
  124. void stop()//停止信號函數
  125. {scl=1;
  126.   sda=0;
  127.   delay7us();
  128.   sda=1;
  129.   delay7us();
  130. }          
  131.   /*檢測應答信號        */
  132. void checkack()
  133. {uchar i;
  134.   scl=0;
  135.   sda=0;
  136.   delay7us();       
  137.   scl=1;       
  138.   delay7us();
  139.   while((sda==1)&&(i<250) )
  140.            i++;
  141.    scl=0;
  142.    }
  143. /* 產生非應答信號*/         
  144. void noack()
  145. {scl=0;
  146.   sda=1;
  147.   delay7us();
  148.   scl=1;
  149.   delay7us();
  150.   scl=0;
  151. }
  152. /*產生應答*/
  153. /*void ack()
  154. { scl=0;
  155.    sda=0;
  156.    delay7us();
  157.    scl=1;
  158.    delay7us();
  159.    scl=0;
  160. }        */          
  161. void main()
  162. {EA=1;
  163. IT0=0;
  164. EX0=1;
  165. while(1)
  166.   {         
  167.   do
  168.     {
  169.           init();
  170.           start();
  171.           write_iic_byte(0XA0);
  172.           checkack();
  173.           write_iic_byte(0);
  174.           checkack();
  175.           start();
  176.           write_iic_byte(0XA1);
  177.           checkack();
  178.            a=read_iic_byte();
  179.            noack();
  180.            stop();
  181.           
  182.           // delay88ms();
  183.           // b=b-1;       
  184.         }
  185.         while(0);

  186.          out=0;
  187.          
  188.                
  189.                 }  
  190.                  
  191.         while(1)

  192.           {if(kaiguan==0)
  193.            {out=1;
  194.                 for(c=0;c<a;c++)
  195.                       {
  196.                             delay100ms();
  197.                    }
  198.                   out=0;
  199.            }
  200.         }
  201.         }
  202. void ex0_iic() interrupt 0
  203. {         
  204.                init();
  205.                   start();
  206.                   write_iic_byte(0XA0);
  207.                   checkack();
  208.                              write_iic_byte(0);
  209.                            checkack();
  210.                           write_iic_byte(a);
  211.                            checkack();
  212.                            stop();

  213. }
  214.           
復制代碼


回復

使用道具 舉報

ID:313048 發表于 2021-11-5 13:58 | 顯示全部樓層
首先,你在main函數里面的第一個do{}while讀取EEPROM數據最好是寫個函數封裝一下,然后在進入main函數初始化之后調用,這樣代碼看起來順心點。
其次是ex0的外部中斷,這個里面不建議做這么麻煩的eeprom數據的讀寫操作,你可以同樣封裝為一個函數,然后放在main函數的while里面,通過標志位去操作。在外部中斷里面只執行標志位置位的操作。
最后不知道你到底是想問什么問題,你把你的功能說出來了,然后放一段代碼在這兒讓別人看,能看出啥,是功能無法實現還是代碼哪里有問題?單純的一段代碼反正我是沒心情看下去的,更何況是這種層次感不明確的代碼。
回復

使用道具 舉報

ID:401564 發表于 2021-11-5 15:03 | 顯示全部樓層
我在另一個帖子里就告訴你了, sda=0;再應答是錯誤的,就是不理會
回復

使用道具 舉報

ID:881715 發表于 2021-11-5 15:05 來自觸屏版 | 顯示全部樓層
我的功能是用兩個按鍵改變量數值,把數值再用另一個按鍵寫入2402,然后再次上電后讀取數據,謝謝您的指導,我封裝一下函致試試看,如果不封函數,而是在主函數中寫出讀寫操作的流程程序,兩個語句中加了個while結果仿真就既不讀也不寫干脆罷工了,電平指示不在交替變化了,if語句也不行
回復

使用道具 舉報

ID:881715 發表于 2021-11-5 15:08 來自觸屏版 | 顯示全部樓層
Y_G_G 發表于 2021-11-5 15:03
我在另一個帖子里就告訴你了, sda=0;再應答是錯誤的,就是不理會

多謝指導
回復

使用道具 舉報

ID:881715 發表于 2021-11-5 15:12 來自觸屏版 | 顯示全部樓層
Y_G_G 發表于 2021-11-5 15:03
我在另一個帖子里就告訴你了, sda=0;再應答是錯誤的,就是不理會

大神我這是單字節操作,應答函數并沒有調用呀?我注釋掉了呀?怎么還會出問題嗎
回復

使用道具 舉報

ID:401564 發表于 2021-11-5 15:28 | 顯示全部樓層
創造生活 發表于 2021-11-5 15:12
大神我這是單字節操作,應答函數并沒有調用呀?我注釋掉了呀?怎么還會出問題嗎

checkack();
這個函數是錯誤的
每個向24Cxx寫入一個字節的數據之后都要應答
回復

使用道具 舉報

ID:881715 發表于 2021-11-5 15:33 來自觸屏版 | 顯示全部樓層
原來是主機檢測應答錯了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表