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

標(biāo)題: 請(qǐng)教各位大神為啥我把eeprom程序加進(jìn)去了就不亮了 [打印本頁(yè)]

作者: yinbo    時(shí)間: 2018-5-18 13:31
標(biāo)題: 請(qǐng)教各位大神為啥我把eeprom程序加進(jìn)去了就不亮了
  1. /**************************************************************************************
  2. *                              溫度傳感器實(shí)驗(yàn)                                                                                                  *
  3. 實(shí)現(xiàn)現(xiàn)象:        具體接線(xiàn)操作請(qǐng)看視頻。
  4.                         下載程序后,在溫度傳感器接口處,按照絲印方向插好溫度傳感器,數(shù)碼管就會(huì)顯示
  5.                         檢測(cè)的溫度值,
  6. 注意事項(xiàng):                                                                                                                                                                  
  7. ***************************************************************************************/

  8. #include <reg52.h>                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
  9. #include <stdio.h>         
  10. #include <eeprom.h>  

  11. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
  12. typedef unsigned char u8;
  13. #define WRITE24C02 0xA0   //10100000,器件地址,寫(xiě)操作   
  14. #define READ24C02 0xA1   //10100001,器件地址,讀操作

  15. sbit LSA=P2^2;
  16. sbit LSB=P2^3;
  17. sbit LSC=P2^4;
  18. sbit key1=P1^0;
  19. sbit key2=P1^1;
  20. sbit zongkong=P2^7;
  21. sbit output=P2^6;
  22. sbit SO=P3^2;   
  23. sbit CS=P3^0;   
  24. sbit SCK=P3^1;

  25. char num=0;
  26. u8 xw[8],sdwd,a=101,sjwd;
  27. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
  28. void display0 (  te );
  29.      void display1(h);
  30. #define uchar unsigned char   
  31. #define uint unsigned int   //--------------熱電偶數(shù)字轉(zhuǎn)換器MAX6675  


  32. /*******************************************************************************
  33. * 函 數(shù) 名         : delay_ms(uchar ntimes)
  34. * 函數(shù)功能                   :
  35. * 輸    入         : temp
  36. * 輸    出         : 無(wú)
  37. *******************************************************************************/  

  38.    void delay(u16 i)
  39. {
  40.         while(i--);        
  41. }

  42. /********************************  
  43. //讀取MAX6675  
  44. *********************************/   
  45. int Read_6675()   
  46. { uchar i;   
  47.   uint dat_temp;   
  48.   uint dat_6675;   
  49.   i=0;   
  50.   dat_temp=0;   
  51.   dat_6675=0;   
  52.   //ready   
  53.   CS=0;   
  54.   //delay_us(10);   
  55.   SCK=0;   
  56.   //delay_us(10);   
  57.   //get D15-D0 from 6675   
  58.   for(i=0;i<16;i++)   
  59.   {      
  60.    SCK=1;     
  61.    dat_temp=dat_temp<<1;   
  62.    if(SO==1)   
  63.     dat_temp=dat_temp|0x01;   
  64.    SCK=0;   
  65.    //delay_us(10);   
  66.   }   
  67.   CS=1;   
  68.   dat_temp=dat_temp<<1;   
  69.   dat_temp=dat_temp>>4;   
  70.   dat_temp=dat_temp/4;   
  71.   dat_6675 =    dat_temp;   
  72.   return dat_6675;   
  73. }


  74. /*******************************************************************************
  75. * 函 數(shù) 名         : datapros()
  76. * 函數(shù)功能                   : 溫度讀取處理轉(zhuǎn)換函數(shù)
  77. * 輸    入         : temp
  78. * 輸    出         : 無(wú)
  79. *******************************************************************************/

  80. void datapros(int temp)         
  81. {
  82.            float tp;  
  83.         if(temp< 0)                                //當(dāng)溫度值為負(fù)數(shù)
  84.           {
  85.                 xw[2] = 0x40;           //   -
  86.                 //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
  87.                 temp=temp-1;
  88.                 temp=~temp;
  89.                 tp=temp;
  90.                 temp=tp*0.0025*100+0.5;        
  91.                 //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  92.                 //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  93.                 //算加上0.5,還是在小數(shù)點(diǎn)后面。

  94.           }
  95.          else
  96.           {                        
  97.                 xw[0] = 0x00;
  98.                 tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
  99.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  100.                 temp=tp*0.0025*100+0.5;        
  101.                 //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  102.                 //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  103.                 //算加上0.5,還是在小數(shù)點(diǎn)后面。
  104.         }

  105.         xw[4] = smgduan[temp % 10000 / 1000];
  106.         xw[5] = smgduan[temp % 1000 / 100] | 0x80;
  107.         xw[6] = smgduan[temp % 100 / 10];
  108.         xw[7] = smgduan[temp % 10];
  109.         sjwd=temp % 10000 / 1000*10+temp % 1000 / 100;
  110. }


  111. /*******************************************************************************
  112. * 函數(shù)名         :DigDisplay()
  113. * 函數(shù)功能                 :數(shù)碼管顯示函數(shù)
  114. * 輸入           : 無(wú)
  115. * 輸出                  : 無(wú)
  116. *******************************************************************************/
  117. void DDP()
  118. {
  119.         u8 i;
  120.         for(i=0;i<8;i++)
  121.         {
  122.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  123.                 {
  124.                         case(0):
  125.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  126.                         case(1):
  127.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  128.                         case(2):
  129.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  130.                         case(3):
  131.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  132.                         case(4):
  133.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  134.                         case(5):
  135.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  136.                         case(6):
  137.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  138.                         case(7):
  139.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  140.                 }
  141.                 P0=xw[i];//發(fā)送數(shù)據(jù)        
  142.                 delay(200);
  143.                 P0=0x00;//消隱
  144.         }               
  145. }

  146. /*******************************************************************************
  147. * 函 數(shù) 名       : Initialization
  148. * 函數(shù)功能                 : 初始化函數(shù)
  149. * 輸    入       : 無(wú)
  150. * 輸    出             : 無(wú)
  151. *******************************************************************************/
  152. void Initialization()
  153. {
  154.         uchar i=0;
  155.         P0=0x00;
  156.         P1=0x00;
  157.         P2=0XFF;
  158.         P3=0XFF;
  159.         sdwd=30;
  160.         for(i=0;i++;i<8)
  161.         {
  162.                 xw[i]=0x08;        
  163.         }
  164.         readeeprom();
  165.         datapros(Read_6675() );

  166. }

  167. /*******************************************************************************
  168. * 函 數(shù) 名       : main
  169. * 函數(shù)功能                 : 主函數(shù)
  170. * 輸    入       : 無(wú)
  171. * 輸    出             : 無(wú)
  172. *******************************************************************************/
  173. void main()
  174. {        
  175.         Initialization();
  176.         delay(50);
  177.         while(1)
  178.         {
  179.                 if(zongkong==1)
  180.                 {
  181.                         while(a>100)
  182.                         {
  183.                                 a=0;
  184.                                 datapros(Read_6675() );
  185.                
  186.                         }
  187.                         a++;
  188.                         xw[0]=smgduan[sdwd/10%10];
  189.                         xw[1]=smgduan[sdwd%10];
  190.                         xw[2]=0x08;
  191.                         xw[3]=0x08;
  192.                         DDP();
  193.                         if(key1==1)
  194.                         {
  195.                                 while(key1==1)DDP();
  196.                                 sdwd++;
  197.                                 if(sdwd>50)sdwd=50;
  198.                         }
  199.                         if(key2==1)
  200.                         {
  201.                                 while(key2==1)DDP();
  202.                                 sdwd--;
  203.                                 if(sdwd<10)sdwd=10;
  204.                         }
  205.                         if(sdwd>sjwd+2)
  206.                         {
  207.                                 output=0;               
  208.                         }
  209.                         if(sdwd<sjwd+1)
  210.                         {
  211.                                 output=1;               
  212.                         }
  213.                 }
  214.                 if(zongkong==0)
  215.                 {
  216.                         while(a>100)
  217.                         {
  218.                                 a=0;
  219.                                 datapros(Read_6675() );
  220.                         
  221.                         }
  222.                         a++;
  223.                         xw[0]=smgduan[sdwd/10%10];
  224.                         xw[1]=smgduan[sdwd%10];
  225.                         xw[2]=0x08;
  226.                         xw[3]=0x08;
  227.                         DDP();
  228.                         if(key1==1)
  229.                         {
  230.                                 while(key1==1)DDP();
  231.                                 sdwd++;
  232.                                 if(sdwd>50)sdwd=50;
  233.                         }
  234.                         if(key2==1)
  235.                         {
  236.                                 while(key2==1)DDP();
  237.                                 sdwd--;
  238.                                 if(sdwd<10)sdwd=10;
  239.                         }
  240.                         output=0;
  241.                 }                                
  242.         }               
  243. }

  244. #include "reg52.h"      //包含頭文件
  245. #include"intrins.h"     //_nop_();延時(shí)函數(shù)用
  246. #include<eeprom.h>

  247. #define uchar unsigned char
  248. #define uint  unsigned int

  249. void Delay1ms(uint y)
  250. {
  251.         uint x;
  252.         for( ; y>0; y--)
  253.         {
  254.                 for(x=110; x>0; x--);
  255.         }
  256. }



  257. //**************************************************************************************************
  258. //啟動(dòng)(SCL為高,SDA由高變?yōu)榈褪且粋(gè)開(kāi)始條件)
  259. //**************************************************************************************************
  260. void start()  
  261. {        
  262.         sda=1;    //數(shù)據(jù)線(xiàn)置高,
  263.         _nop_();  //延時(shí)
  264.         scl=1;    //時(shí)鐘線(xiàn)置高
  265.         _nop_();  //延時(shí)
  266.         sda=0;    //數(shù)據(jù)線(xiàn)置低,由高變低
  267.         _nop_();  //延時(shí)
  268.         scl=0;    //時(shí)鐘線(xiàn)置低,準(zhǔn)備發(fā)送或接收數(shù)據(jù),總線(xiàn)進(jìn)入忙狀態(tài)(I2C總線(xiàn)在空閑狀態(tài)時(shí),SDA與SCL均被置高)
  269.         _nop_();  //延時(shí)
  270. }
  271. //**************************************************************************************************
  272. //停止(SCL為高,SDA由低變?yōu)楦呤且粋(gè)結(jié)束條件)
  273. //**************************************************************************************************
  274. void stop()   
  275. {
  276.         sda=0;                   //數(shù)據(jù)線(xiàn)置低
  277.         _nop_();                 //延時(shí)
  278.         scl=1;                   //時(shí)鐘線(xiàn)置高
  279.         _nop_();                 //延時(shí)
  280.         sda=1;                   //數(shù)據(jù)線(xiàn)置高,由低變高
  281.         _nop_();                 //延時(shí)
  282. }
  283. //**************************************************************************************************
  284. //檢測(cè)應(yīng)答(所有的地址和數(shù)據(jù)字都是以8bit,在第9個(gè)時(shí)鐘周期,從器件發(fā)出"0"信號(hào)來(lái)作為收到一個(gè)字的應(yīng)答信號(hào))
  285. //**************************************************************************************************
  286. void checkACK()                   //主器件檢測(cè)從器件是否返回應(yīng)答
  287. {
  288.         scl=1;                        //時(shí)鐘線(xiàn)置高
  289.         _nop_();                      //延時(shí)
  290.         while(sda==1);                //等待第9個(gè)時(shí)鐘周期器件發(fā)出的響應(yīng)信號(hào)"0"
  291.         scl=0;                        //時(shí)鐘線(xiàn)置低
  292.         _nop_();                      //延時(shí)
  293. }
  294. //**************************************************************************************************
  295. //發(fā)送應(yīng)答(發(fā)送方為主器件,接收方為從器件,控制器作為從器件接收完1數(shù)據(jù)時(shí),發(fā)送應(yīng)答信號(hào)
  296. //**************************************************************************************************
  297. void sendACK(bit ACK)                  
  298. {
  299.     if(ACK)sda=1;            //如果i位為1則發(fā)送1,即發(fā)送"非應(yīng)答信號(hào)"
  300.       else sda=0;            //如果i位為0則發(fā)送0,即發(fā)送"應(yīng)答信號(hào)"        
  301.     scl=1;                   //時(shí)鐘線(xiàn)置高,給一個(gè)脈沖
  302.         _nop_();                 //延時(shí)
  303.         scl=0;                   //時(shí)鐘線(xiàn)置低
  304.         _nop_();                 //延時(shí)
  305. }
  306. //**************************************************************************************************
  307. //寫(xiě)一字節(jié)
  308. //**************************************************************************************************
  309. void send_byte(uchar date)       //寫(xiě)一個(gè)8位字
  310. {
  311.         uchar i,temp;                //定義局部變量
  312.         temp=date;                   //待發(fā)8位數(shù)據(jù)賦予temp
  313.         for(i=0;i<8;i++)             //循環(huán)8次,每次寫(xiě)入1位,從最高位開(kāi)始發(fā)送
  314.         {
  315.         if(temp&0x80)sda=1;      //如果temp最高位為1則發(fā)送1
  316.           else sda=0;            //如果temp最高位為0則發(fā)送0
  317.             _nop_();                 //延時(shí)
  318.                 scl=1;                   //給一個(gè)脈沖,發(fā)送sda當(dāng)前這位數(shù)據(jù)
  319.                 _nop_();                 //延時(shí),需大于4us(參考數(shù)據(jù)手冊(cè)時(shí)序圖)
  320.                 _nop_();              
  321.                 _nop_();                 
  322.                 _nop_();                 
  323.                 _nop_();               
  324.                 scl=0;                   //時(shí)鐘線(xiàn)置低,準(zhǔn)備下一脈沖
  325.             _nop_();                 //延時(shí),需大于4.7us(參考數(shù)據(jù)手冊(cè)時(shí)序圖)
  326.                 _nop_();              
  327.                 _nop_();                 
  328.                 _nop_();                 
  329.                 _nop_();  
  330.                 temp=temp<<1;            //左移1位,準(zhǔn)備好下1位待發(fā)送的數(shù)據(jù)
  331.         }
  332.         checkACK();                  //查詢(xún)是否返回應(yīng)答信號(hào)
  333. }
  334. //**************************************************************************************************
  335. //讀一字節(jié)
  336. //**************************************************************************************************
  337. uchar receive_byte()         //讀一個(gè)8位字
  338. {
  339.         uchar i,temp;            //定義局部變量
  340.         sda=1;                   //設(shè)置數(shù)據(jù)線(xiàn)為輸入
  341.         _nop_();                 //延時(shí)
  342.         for(i=0;i<8;i++)         //循環(huán)8次,每次讀取1位,從最高位開(kāi)始接收
  343.         {
  344.                 scl=1;               //給一脈沖,準(zhǔn)備發(fā)送1位數(shù)據(jù)            
  345.                 _nop_();             //延時(shí),需大于4us(參考數(shù)據(jù)手冊(cè)時(shí)序圖)
  346.                 _nop_();              
  347.                 _nop_();                 
  348.                 _nop_();                 
  349.                 _nop_();
  350.                 temp=(temp<<1)|sda;  //讀取1位數(shù)據(jù),放在temp最低位
  351.                 scl=0;               //準(zhǔn)備給下1個(gè)脈沖
  352.             _nop_();             //延時(shí),需大于4.7us(參考數(shù)據(jù)手冊(cè)時(shí)序圖)
  353.                 _nop_();              
  354.                 _nop_();                 
  355.                 _nop_();                 
  356.                 _nop_();      
  357.         }
  358.         return temp;             //返回讀取的8位數(shù)據(jù)
  359. }
  360. //**************************************************************************************************
  361. //向某I2C器件的某字地址寫(xiě)一字節(jié)數(shù)據(jù)
  362. //**************************************************************************************************
  363. void write_word(uchar device_add,uchar word_add,uchar date)  //寫(xiě)進(jìn)去一個(gè)存儲(chǔ)數(shù)據(jù)
  364. {
  365.         start();                  //啟動(dòng)
  366.         send_byte(device_add);    //選擇從器件地址,RW位為0,即選擇寫(xiě)命令
  367.         send_byte(word_add);      //寫(xiě)字地址
  368.         send_byte(date);          //寫(xiě)數(shù)據(jù)
  369.         stop();                   //停止        
  370. }
  371.   //**************************************************************************************************
  372. //向某I2C器件的某字地址讀一字節(jié)數(shù)據(jù)
  373. //**************************************************************************************************
  374. uchar read_word(uchar device_add,uchar word_add)   //讀出一個(gè)存儲(chǔ)的數(shù)據(jù)
  375. {
  376.         uchar date;
  377.         start();                 //啟動(dòng)
  378.         send_byte(device_add);   //選擇從器件地址,RW位為0,即選擇寫(xiě)命令
  379.         send_byte(word_add);     //寫(xiě)字地址
  380.         start();                 //啟動(dòng)
  381.         send_byte(device_add+1); //選擇從器件地址,RW位為1,即選擇讀命令
  382.         date=receive_byte();     //讀數(shù)據(jù)
  383.     sendACK(1);              //發(fā)送非應(yīng)答信號(hào)
  384.         stop();                  //停止
  385.         return date;             //返回讀取結(jié)果數(shù)據(jù)
  386. }
  387. //**************************************************************************************************
  388. //主函數(shù)
  389. //**************************************************************************************************
  390. int readeeprom()
  391. {        
  392.    uchar temp;                   //定義中間變量
  393.    temp=read_word(0xa0,0);       //從I2C器件a0的第0個(gè)地址讀出數(shù)據(jù)賦予temp
  394.    write_word(0xa0,0,temp+1);    //向I2C器件a0的第0個(gè)地址寫(xiě)etmp+1
  395.          Delay1ms(50);            
  396.    while(1)                      //死循環(huán)
  397.     {
  398.           temp=read_word(0xa0,0);    //從第0個(gè)地址讀出一個(gè)數(shù)據(jù)
  399.                  Delay1ms (10);
  400.       P1=~temp;                  //送數(shù)據(jù)到P1口顯示

  401.         }
  402. }
復(fù)制代碼









歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美一级黄带 | 国产精品一区二区三区在线 | 欧美电影在线观看网站 | 亚洲免费一区二区 | 日韩一区二区在线视频 | 亚洲一区免费 | 九一视频在线播放 | 国产在线观看 | 亚洲成人一级 | 欧美一级免费 | 午夜影院在线观看 | 国产精品一区二区三区在线 | 天天插日日操 | 国产伦精品一区二区三区四区视频 | 日韩精品一区二区久久 | 国产精品毛片一区二区三区 | 亚洲精品一区二区三区四区高清 | 成人在线视频免费观看 | 国产成人综合一区二区三区 | 精品亚洲一区二区三区 | 国产一区二区三区在线看 | 麻豆视频在线看 | 成人精品影院 | 91精品久久久久久久久中文字幕 | 欧美激情一区二区三区 | 8x国产精品视频一区二区 | 国产视频久久 | 欧美精品久久久久 | 成人二区 | 欧美啪啪| 亚洲在线久久 | 免费艹逼视频 | 成人a视频 | 国产做a爱免费视频 | 国产天天操| 久久97精品 | 欧美一级淫片免费视频黄 | 91xxx在线观看 | 国产日韩欧美激情 | 久久伊人久久 | 一级免费看片 |