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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求大神幫我看看這個程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:881715 發(fā)表于 2021-11-5 11:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
          各位大神大家好,一個程序我弄了很久多天了實在弄不了,特來求教!!! 程序功能:我設(shè)置了四個按鍵,一個加鍵(k1jia),一個減鍵(k2jian),用來設(shè)置數(shù)據(jù)的,開機從24C02里讀取數(shù)據(jù),用這兩鍵調(diào)節(jié)讀出的數(shù)據(jù),這數(shù)據(jù)是調(diào)用延時函數(shù)次數(shù)的,如不調(diào)節(jié)則調(diào)用延時函數(shù)的次數(shù)為讀出的數(shù)據(jù)
,第三個鍵是開關(guān)鍵(kaiguan),點動一下開關(guān)鍵,小燈(out)點亮,經(jīng)延時后熄滅。第四個鍵是寫入鍵(k3ws),按下后將數(shù)據(jù)寫入AT24C02為下次上電做讀數(shù)據(jù)準(zhǔn)備。
  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;        //寫入數(shù)據(jù)鍵
  7. sbit out=P2^7; //小燈,為1時點亮
  8. sbit scl=P2^0;
  9. sbit sda=P2^1;
  10. sbit kaiguan=P3^3;//開關(guān)鍵
  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()  //  延時函數(shù)
  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. /*啟動信號函數(shù)*/
  60. void start()  //啟動信號函數(shù)
  61. { scl=1;         
  62.    sda=1;
  63.    delay7us();
  64.   sda=0;
  65.    delay7us();       
  66. }       
  67. /*寫一個字節(jié)的函數(shù)*/
  68. void write_iic_byte(uchar dat)       
  69.                               
  70. { uchar i;
  71.    scl=0;  /*主機拉低為的是SDA數(shù)據(jù)線
  72.                    可以發(fā)生變化并為SDA拉高,讓
  73.                    接受設(shè)備接收數(shù)據(jù)做準(zhǔn)備*/
  74.         /*發(fā)送八位數(shù)據(jù)*/
  75.    for(i=0;i<8;i++)
  76.     { if(dat&0X80)
  77.              sda=1;/*主機將數(shù)據(jù)1存入SDA*/
  78.          else
  79.                  sda=0;/*主機將數(shù)據(jù)0存入SDA
  80.                                 ,也可認(rèn)為是存入一個
  81.                                 存儲器*/
  82.           scl=1;  /*主機將時鐘數(shù)據(jù)線拉高*/
  83.            delay7us(); /*延時接收設(shè)備在此期間
  84.                                   自動取走*/
  85.            dat=dat<<1;/* 數(shù)據(jù)左移一位,次高位
  86.                               變成發(fā)送數(shù)據(jù)位*/
  87.                 scl=0;/*時鐘線拉低為更改發(fā)送數(shù)據(jù)
  88.                            位做準(zhǔn)備,只有其為低數(shù)據(jù)線
  89.                            上的數(shù)據(jù)才會發(fā)生改變。*/
  90.            delay7us();                  
  91. }         
  92.      sda=1;
  93.               /*釋放數(shù)據(jù)線*/       
  94.   }                        
  95. /*讀一個字節(jié)的函數(shù)*/
  96. uchar read_iic_byte()
  97. { uchar i,v;/*暫時為空變量,8次后
  98.                              存儲要保存的數(shù)據(jù)*/
  99.    sda=1;/*主機釋放數(shù)據(jù)線,這數(shù)據(jù)
  100.                   狀態(tài)以后有發(fā)送設(shè)備決定*/
  101.    scl=0;/*主機將時鐘信號線拉低,
  102.                    /*SDA線上的數(shù)據(jù)才會改變*/
  103.    /*從設(shè)備發(fā)送八位數(shù)據(jù)*/
  104.    for(i=0;i<8;i++)
  105.         { v=v<<1; /*第一次循環(huán)無意義,以后
  106.                           發(fā)送用*/
  107.           scl=1;  /*以后發(fā)送期間數(shù)據(jù)穩(wěn)定*/
  108.          delay7us();/*延時使主機有時間取走
  109.                            數(shù)據(jù)*/
  110.          if(sda) /*SDA發(fā)送從設(shè)備里最高位數(shù)據(jù)
  111.                           1,第一次循環(huán)從此發(fā)送第一
  112.                           位數(shù)據(jù)*/
  113.                 v=v|0X01;/*把1傳入變量V的最低位*/
  114.         scl=0;         /*時鐘線拉低發(fā)送數(shù)據(jù)由發(fā)送
  115.                            設(shè)備自動改變*/

  116.         delay7us();/*延時使時鐘線可靠拉低
  117.                                  ,有充足時間數(shù)據(jù)被讀走
  118.                                  */
  119.         }
  120.         return v; /*被讀的數(shù)據(jù)存在V中,
  121.                           作為返回值/*返回*/
  122. }        
  123.           
  124. void stop()//停止信號函數(shù)
  125. {scl=1;
  126.   sda=0;
  127.   delay7us();
  128.   sda=1;
  129.   delay7us();
  130. }          
  131.   /*檢測應(yīng)答信號        */
  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. /* 產(chǎn)生非應(yīng)答信號*/         
  144. void noack()
  145. {scl=0;
  146.   sda=1;
  147.   delay7us();
  148.   scl=1;
  149.   delay7us();
  150.   scl=0;
  151. }
  152. /*產(chǎn)生應(yīng)答*/
  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.           
復(fù)制代碼


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

使用道具 舉報

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

使用道具 舉報

板凳
ID:401564 發(fā)表于 2021-11-5 15:03 | 只看該作者
我在另一個帖子里就告訴你了, sda=0;再應(yīng)答是錯誤的,就是不理會
回復(fù)

使用道具 舉報

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

使用道具 舉報

5#
ID:881715 發(fā)表于 2021-11-5 15:08 來自觸屏版 | 只看該作者
Y_G_G 發(fā)表于 2021-11-5 15:03
我在另一個帖子里就告訴你了, sda=0;再應(yīng)答是錯誤的,就是不理會

多謝指導(dǎo)
回復(fù)

使用道具 舉報

6#
ID:881715 發(fā)表于 2021-11-5 15:12 來自觸屏版 | 只看該作者
Y_G_G 發(fā)表于 2021-11-5 15:03
我在另一個帖子里就告訴你了, sda=0;再應(yīng)答是錯誤的,就是不理會

大神我這是單字節(jié)操作,應(yīng)答函數(shù)并沒有調(diào)用呀?我注釋掉了呀?怎么還會出問題嗎
回復(fù)

使用道具 舉報

7#
ID:401564 發(fā)表于 2021-11-5 15:28 | 只看該作者
創(chuàng)造生活 發(fā)表于 2021-11-5 15:12
大神我這是單字節(jié)操作,應(yīng)答函數(shù)并沒有調(diào)用呀?我注釋掉了呀?怎么還會出問題嗎

checkack();
這個函數(shù)是錯誤的
每個向24Cxx寫入一個字節(jié)的數(shù)據(jù)之后都要應(yīng)答
回復(fù)

使用道具 舉報

8#
ID:881715 發(fā)表于 2021-11-5 15:33 來自觸屏版 | 只看該作者
原來是主機檢測應(yīng)答錯了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品18毛片一区二区 | 国产原创在线观看 | 成人二区 | 伊人网综合在线 | 久久99精品久久久久久国产越南 | 天天操天天摸天天干 | av一级久久| 最新国产在线 | 久久免费福利 | 日韩免费视频 | 国产精品一区二区三区久久久 | 国产精品久久久久久久久大全 | 黄色av网站在线观看 | 九一视频在线观看 | 亚洲免费一区二区 | 日韩一级免费电影 | 国产午夜久久 | www.久久.com| 美女黄网站视频免费 | 91精品国产综合久久精品 | 欧美色性 | 日韩精品成人一区二区三区视频 | 婷婷色在线 | 国产精品一区二区免费看 | 中文字幕亚洲一区二区三区 | 91久久综合亚洲鲁鲁五月天 | 自拍视频国产 | 中文字幕一区二区三区四区 | 在线欧美激情 | 日批av| 精品成人一区 | 91在线视频免费观看 | 久久草在线视频 | 亚洲国产精品精华素 | 美女福利网站 | 成人一区二区三区在线观看 | 成人免费在线观看 | 中文字幕一区二区三区四区 | 91国语清晰打电话对白 | 亚洲免费视频网站 | 亚洲精品乱码久久久久久蜜桃91 |