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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC單片機讀取LM75A溫度的代碼,以及ADC讀取電壓。給大家分享一下把

[復制鏈接]
跳轉到指定樓層
樓主
ID:475845 發表于 2020-4-29 09:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

我用的是STC8A8K64S4A12這一款單片機,模擬I2C讀取溫度,以及ADC讀取電阻分壓后電壓計算

LM75A


  1. #include"main.h"

  2. char xdata temp_[3];   //
  3. char xdata test[15];

  4. bit        temp_flag;

  5. void Delay_us(int i)   //iic延時            
  6. {
  7. int j;
  8. for(j=0;j<i;j++);
  9. }

  10. void IIC_init(void)    //iic初始化
  11. {
  12.                 SCL = 1;
  13.                 Delay_us(5);
  14.                 SDA = 1;
  15.                 Delay_us(5);
  16. }

  17. void iic_start(void)         //iic通信起始信號
  18. {
  19.             SDA = 1;
  20.           Delay_us(2);
  21.       SCL = 1;
  22.           Delay_us(2);
  23.       SDA = 0;
  24.           Delay_us(2);  
  25. }

  26. void iic_stop(void)                 //iic通信終止信號
  27. {
  28.                         SDA = 0;
  29.           Delay_us(2);
  30.       SCL = 1;
  31.           Delay_us(2);
  32.       SDA =1;
  33. }

  34. void iic_ack(void)     //發送應答信號函數                 
  35. {
  36.                         SCL = 0;
  37.       SDA = 0;
  38.           Delay_us(2);
  39.       SCL = 1;
  40.           Delay_us(2);  
  41.       SCL = 0;
  42.           Delay_us(1);
  43.       SDA = 1;
  44. }

  45. void read_ack(void)    //iic應答函數                  
  46. {  
  47.       SCL = 0;
  48.           Delay_us(2);   
  49.       SDA = 1;
  50.       SCL = 1;
  51.           Delay_us(2);
  52.       SCL = 0;  
  53. }

  54. void iic_nack()        //iic非應答函數               
  55. {   
  56.       SDA = 1;
  57.           Delay_us(2);      
  58.       SCL = 1;
  59.           Delay_us(2);      
  60.                         SCL = 0;
  61. }

  62. u8 get_byte(void)         //輸入一個字節                           
  63. {
  64.     u8 dd;
  65.     int i;
  66.    
  67.     dd=0;
  68.            SDA = 1;
  69.         for (i=0; i<8; i++)
  70.     {
  71.                  Delay_us(1);
  72.          SCL = 0;
  73.                  Delay_us(5);
  74.          SCL = 1;
  75.                  Delay_us(2);
  76.          dd<<=1;
  77.                  if (SDA)
  78.                     dd|=0x01;
  79.                  Delay_us(1);
  80.     }         
  81.     SCL = 0;
  82.         Delay_us(1);
  83.         return dd;
  84. }

  85. void out_byte(u8 dd)      //輸出一個字節              
  86. {
  87.     u8 i;

  88.     for(i=0;i<8;i++)
  89.     {  
  90.           SCL = 0;
  91.                   Delay_us(0);                        
  92.           SDA = (dd & 0x80)>>7;
  93.                   Delay_us(2);         
  94.           SCL = 1;
  95.                   Delay_us(3);
  96.           dd <<= 1;
  97.     }
  98.         SCL = 0;   
  99. }

  100. //寫入器件地址和所需讀取寄存器的地址
  101. void iic_write_addr(u8 addr,u8 data_addr)
  102. {
  103.             iic_start();
  104.       out_byte(addr);
  105.       read_ack();   
  106.       out_byte(data_addr);
  107.       read_ack();            
  108. }

  109. //iic總線讀取多個數據
  110. void IICA_Read(u8 id, u8 addr, u8 *p, u16 len)
  111. {                                                   
  112.          int i;
  113.          bit EA_SAVE = EA;

  114.              EA = 0;
  115.               iic_write_addr(id|0,addr);  
  116.               iic_start();
  117.               out_byte(id|1);
  118.               read_ack();     
  119.               for (i=0;i<len;i++)
  120.                {
  121.                          *p++ = get_byte();
  122.                           if (i!=(len-1))
  123.                                          iic_ack();                 
  124.                }      
  125.              iic_nack();        
  126.                iic_stop();
  127.               EA = EA_SAVE;
  128. }

  129. //讀取并計算當前溫度
  130. void readTemperature()
  131. {
  132.         u8 id=0x90;          //設備地址
  133.         u8 addr=0x00;        //溫度寄存器地址
  134.         u32        temp_high;        //儲存高字節
  135.         u8        temp_low;         //儲存低字節
  136.         u8 temp[2]={0};      

  137.   u8 a = 0;
  138.         
  139.         IICA_Read(id,addr,temp,2);      //將溫度的兩個字節存到temp中

  140.         temp_high = temp[0];                                //溫度高
  141.         temp_low = temp[1];                                //溫度低
  142.         
  143.         temp_high = (temp_high << 8) + temp_low;
  144.         temp_high = temp_high >> 5;
  145.         
  146.         memset(test,0,sizeof(test));
  147.         
  148.         if((temp_high & 0x0400) == 0x0400)
  149.                 test[a++] = '-';
  150.         else
  151.                 test[a++] = '+';
  152.         
  153.         temp_high = temp_high * 125;
  154.         
  155.         if(temp_high >= 25500)
  156.                 temp_flag = 1;
  157.         
  158.         if(temp_high >= 100000)
  159.                 test[a++] = temp_high / 100000 % 10 + '0';
  160.         
  161.         test[a++] = temp_high / 10000 % 10 + '0';
  162.         test[a++] = temp_high / 1000 % 10 + '0';
  163.         test[a++] = '.';
  164.         test[a++] = temp_high / 100 % 10 + '0';
  165.         test[a++] = temp_high % 100 / 10 + '0';
  166.         test[a++] = temp_high % 10 + '0';
  167.         test[a++] = 'C'; //℃
  168. }

復制代碼
ADC


  1. #include"main.h"

  2. char xdata AD1_V[7];

  3. extern bit voltage_flag;

  4. void adc_init(void)
  5. {
  6.     P1M0 &= 0x7F;                               //設置P1.7為ADC口
  7.     P1M1 |= 0x80;

  8.     ADCCFG = 0x21;                              //設置ADC時鐘為系統時鐘/2/16/16
  9.     ADC_CONTR = 0x80;                           //使能ADC模塊
  10. }

  11. int adcread()
  12. {
  13.         int res;
  14.         ADC_CONTR |= 0x47;                      //啟動AD轉換P17
  15.         _nop_();
  16.         _nop_();
  17.         while (!(ADC_CONTR & 0x20));            //查詢ADC完成標志
  18.         ADC_CONTR &= ~0x20;                     //清完成標志
  19.         res = ADC_RES;
  20.         res = (res << 8) + ADC_RESL;          //讀取ADC結果
  21.                
  22.         return res;
  23. }

  24. void adc_test(void)
  25. {
  26.         u32 AD1;
  27.         char a=0;
  28.         
  29.         AD1 = adcread();       //P17
  30.         
  31.         AD1 = AD1 * 86813;       //3555/4095
  32.         //AD1 = AD1 * 43596;       //3555/4095
  33.         AD1 = AD1 / 100000;
  34.         AD1 = (AD1 *115) / 15;  //11.5= R1+R2 分壓
  35.         AD1 = AD1 / 10;
  36.         
  37.         if(AD1 <= 2000)        //主板供電電壓小于20V報警
  38.                 voltage_flag = 1;
  39.         
  40.         memset(AD1_V,0,sizeof(AD1_V));  //清buff,防止小于10V時會出現兩個V
  41.          
  42.         if(AD1 >= 1000)
  43.                 AD1_V[a++] = AD1 / 1000 % 10 + '0';

  44.         
  45.         AD1_V[a++] = AD1 / 100 % 10 + '0';
  46.         AD1_V[a++] = '.';
  47.         AD1_V[a++] = AD1 % 100 / 10 + '0';
  48.         AD1_V[a++] = AD1 % 10 + '0';
  49.         AD1_V[a++] = 'V';

  50. }
復制代碼



以上代碼: i2c,adc.rar (2.34 KB, 下載次數: 32)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩性生活网 | 91精品久久久久久久久久入口 | 亚洲成人精品国产 | 亚洲性人人天天夜夜摸 | 精国产品一区二区三区四季综 | 久久精品国产99国产精品 | 久久久高清 | 午夜av电影 | 中国大陆高清aⅴ毛片 | 国产精品欧美一区二区三区 | av一区二区三区 | av中文字幕在线 | 国产中文区二幕区2012 | 日韩av电影院| 久在草| 午夜精品久久久久久久星辰影院 | 亚洲码欧美码一区二区三区 | 欧美一区二区三区视频在线观看 | 性欧美hd | 天天干天天干 | 国产1区| 日日摸日日爽 | 久久99精品久久久久久国产越南 | 欧美日韩精品亚洲 | 亚洲精品一区二区三区 | 中文视频在线 | 91网站在线看 | 一区二区精品电影 | www.97国产| 亚洲精品国产偷自在线观看 | 久久久久亚洲 | 18成人在线观看 | 国产情侣激情 | 本道综合精品 | 日韩久久精品 | 天天夜夜人人 | 国产欧美一区二区三区久久人妖 | 午夜不卡福利视频 | 不卡av在线| 国产精品无码久久久久 | 国产精品片aa在线观看 |