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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機電壓表代碼 lcd1602顯示

查看數: 5277 | 評論數: 3 | 收藏 1
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
sxk
發布時間: 2017-6-25 10:58

正文摘要:

電壓表代碼

回復

ID:111587 發表于 2017-9-2 19:34
樓主幫忙看一下,我的測量的數據要么是0xffff 要么是 0x0b58
換算5V量程 4.92 和0.21V,有個很小的電壓就顯示0XFFFF,
keil u4 +STCI SP (v6.33)+STC12C5A60S2 (40 PIN DIP)
還有個問題,主函數中有一句 InitADS1115(); 但是在子函數中這個需要參數,不知道這一句是否在執行。先出過編譯不過,后出的警告

  1. /*********************************************************************************************
  2. 函數名:通過串口發送溫度與電壓隨時間變化
  3. 上位機軟件 LABVIEW 2015
  4. 返回值:2字節數據,溫度= (高8位*256+低8位)*0.25 ℃
  5.                 2字節數據 ,電壓=(高8位*256+低8位)*0.00007539         V
  6. 備  注:振蕩晶體為11.0592MHz,PC串口端設置 [ 9600,8,無,1,無 ]
  7. 溫度傳感器芯片 max6675
  8. 電壓傳感芯片 ADS1115
  9. /**********************************************************************************************/  

  10. #include <STC12C5A60S2.H>
  11. #include <string.h>
  12. #include<intrins.h >
  13. #include<ads1115.h>
  14. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  15.   //定義全局變量與接口
  16.           bit flag;
  17.           unsigned char LOW_1;// 存放溫度低8位
  18.           unsigned char HI_1;//存放溫度高8位,其中4位未用
  19.           unsigned char LOW_2;// 存放電壓低8位
  20.           unsigned char HI_2;//存放電壓高8位
  21.           sbit SO=P0^2;//P0.2 與SO相連 6675
  22.           sbit CS= P0^1;//P0.1 與CS相連         6675
  23.           sbit SCK=P0^0;//P0.0與SCK相連         6675
  24.           unsigned int P_Temp;

  25.          sbit SDA= P2^0; //P2.0與SDA相連 1115
  26.          sbit SCL= P2^1; //P2.1與SCL相連 1115
  27. //        ADDR 與GND相連
  28. //  ALRT  空
  29. //           
  30.         char Channel_Value;
  31.         int D_ADS;                 //轉換的數字量
  32.         unsigned int Config;
  33.         unsigned char Writebuff[4],Readbuff[3];
  34.         unsigned int Result[2];


  35. /*********************************************************************************************
  36. 函數名:UART串口初始化函數
  37. 調  用:UART_init();
  38. 參  數:無
  39. 返回值:無
  40. 結  果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(占用)
  41. 備  注:振蕩晶體為11.0592MHz,PC串口端設置 [ 19200,8,無,1,無 ]
  42. /**********************************************************************************************/
  43. void UART_init (void){
  44.         EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
  45.         ES = 1; //允許UART串口的中斷

  46.         TMOD = 0x20;        //定時器T/C1工作方式2
  47.         SCON = 0x50;        //串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
  48.         TH1 = 0xFD;        //定時器初值高8位設置
  49.         TL1 = 0xFD;        //定時器初值低8位設置
  50. //        PCON = 0x80;        //波特率倍頻(屏蔽本句波特率為9600)
  51.         TR1 = 1;        //定時器啟動   
  52. }
  53. /**********************************************************************************************/

  54. /*********************************************************************************************
  55. 函數名:UART串口接收中斷處理函數
  56. 調  用:[SBUF收到數據后中斷處理]
  57. 參  數:無
  58. 返回值:無
  59. 結  果:UART串口接收到數據時產生中斷,用戶對數據進行處理(并發送回去)
  60. 備  注:過長的處理程序會影響后面數據的接收
  61. /**********************************************************************************************/
  62. void UART_R (void) interrupt 4  using 1{ //切換寄存器組到1
  63.         unsigned char UART_data; //定義串口接收數據變量
  64.         RI = 0;                        //令接收中斷標志位為0(軟件清零)
  65.         UART_data = SBUF;        //將接收到的數據送入變量 UART_data
  66.          flag=1;
  67.         //用戶函數內容(用戶可使用UART_data做數據處理)
  68.        
  69.         //SBUF = UART_data;        //將接收的數據發送回去(刪除//即生效)
  70.         //while(TI == 0);        //檢查發送中斷標志位
  71.         //TI = 0;                //令發送中斷標志位為0(軟件清零)
  72. }       
  73. /**********************************************************************************************/


  74. /*********************************************************************************************
  75. 函數名:UART串口發送函數
  76. 調  用:UART_T (?);
  77. 參  數:需要UART串口發送的數據(8位/1字節)
  78. 返回值:無
  79. 結  果:將參數中的數據發送給UART串口,確認發送完成后退出
  80. 備  注:
  81. /**********************************************************************************************/
  82. void UART_T (unsigned char UART_data){ //定義串口發送數據變量
  83.         SBUF = UART_data;        //將接收的數據發送回去
  84.         while(TI == 0);                //檢查發送中斷標志位
  85.         TI = 0;                        //令發送中斷標志位為0(軟件清零)
  86. }
  87. /**********************************************************************************************/


  88. /*********************************************************************************************
  89. 函數名:毫秒級CPU延時函數
  90. 調  用:DELAY_MS (?);
  91. 參  數:1~65535(參數不可為0)
  92. 返回值:無
  93. 結  果:占用CPU方式延時與參數數值相同的毫秒時間
  94. 備  注:應用于1T單片機時i<600,應用于12T單片機時i<125
  95. /*********************************************************************************************/
  96. void DELAY_MS (unsigned int a){
  97.         unsigned int i;
  98.         while( a-- != 0){
  99.                 for(i = 0; i < 600; i++);
  100.         }
  101. }
  102. /*********************************************************************************************/
  103. /*********************************************************************************************
  104. 函數名:微秒級CPU延時函數
  105. 調  用:DELAY_MS (?);
  106. 參  數:1~65535(參數不可為0)
  107. 返回值:無
  108. 結  果:占用CPU方式延時與參數數值相同的毫秒時間
  109. 備  注:應用于1T單片機時i<600,應用于12T單片機時i<125
  110. /*********************************************************************************************/

  111. void delay_us (unsigned int a){
  112.     unsigned char i;
  113.         for(i = 0;i < a;i++)
  114.           _nop_();

  115. }
  116. /*********************************************************************************************
  117. 函數名:熱電偶溫度讀取
  118. 調  用:?=RE_CONVERT()
  119. 參  數:無
  120. 返回值:溫度
  121. 結  果:
  122. 備  注:
  123. /**********************************************************************************************/
  124. unsigned int Re_Convert() //熱電偶轉換
  125. {   
  126.         unsigned int i;
  127.         unsigned long Temp_2;
  128.         Temp_2=0;
  129.         CS = 0; //低電平使能,開始傳送數據
  130.         delayNOP();
  131.         SCK = 1;        // 打開時鐘
  132.         delayNOP();        
  133.         for(i=16;i>0;i--)// 讀取16位數據
  134.                 {
  135.                         Temp_2 = Temp_2<<1; // 左移一位
  136.                         delayNOP();
  137.                         SCK=1;
  138.                         if(SO == 1){
  139.                                 Temp_2 = Temp_2|0x0001;} // 若接收到的位為1,則數據的最后一位置1
  140.                         else
  141.                         Temp_2 = Temp_2 & 0xffff; // 否則數據的最后一位保持不變,置0(前6行左移自動補0)
  142.                         delayNOP();
  143.                         SCK=0;                 //時鐘滴答一次
  144.                         delayNOP();         //等待數據切換
  145.                 }
  146.                                 CS=1;// 讀數完畢,關閉低電平使能
  147.                 Temp_2=Temp_2<<1;
  148.                 Temp_2=Temp_2>>4;               
  149.                 return(Temp_2);
  150. }
  151. /*********************************************************************************************
  152. 函數名:數據發送
  153. 調  用:DATA_SEND()
  154. 參  數:無
  155. 返回值:
  156. 結  果:
  157. 備  注:2字節數據
  158. /**********************************************************************************************/
  159. void DATA_SEND(){
  160.    LOW_1=P_Temp&0x000ff;// 獲取溫度低8位
  161.    P_Temp>>=8;                //右移位,干掉低8位
  162.    HI_1=P_Temp&0x000ff;//  獲取溫度高8位

  163.    LOW_2 =D_ADS&0x000ff;// 獲取電壓低8位
  164.    D_ADS>>=8;                //右移位,干掉低8位
  165.    HI_2=D_ADS&0x000ff;//  獲取電壓高8位

  166.    UART_T(HI_1);                // 發送溫度高8位
  167.   UART_T(LOW_1);                // 發送溫度低8位
  168.   UART_T(HI_2);                         // 發送電壓高8位
  169.   UART_T(LOW_2)        ;                // 發送電壓低8位
  170. }
  171. /******************************************************************************
  172.                                                                         STM32F103RCT6 Scorpio Ver5.1

  173. By:天星科技
  174. 網址:gods-star.com
  175. 技術支持:天星科技.com
  176. 淘寶網店:gods-star.taobao.com
  177. QQ:3184693939
  178. ******************************************************************************/




  179. void ADS1115_Port_Init(void)
  180. {
  181.     ;
  182. }


  183. void ADS1115_SDAPort_IN(void)
  184. {
  185.     ;
  186. }


  187. void ADS1115_SDAPort_OUT(void)
  188. {
  189.     ;
  190. }

  191. ///*******************************************
  192. //函數名稱:Start
  193. //功    能:完成IIC的起始條件操作
  194. //參    數:無
  195. //返回值  :無
  196. //********************************************/
  197. void Start(void)
  198. {
  199.         SCL=1;
  200.         SDA=1;
  201.         delay_us(15);
  202.         SDA=0;
  203.         delay_us(15);
  204.         SCL=0;
  205.         delay_us(15);
  206. }
  207. //
  208. ///*******************************************
  209. //函數名稱:Stop
  210. //功    能:完成IIC的終止條件操作
  211. //參    數:無
  212. //返回值  :無
  213. //********************************************/
  214. void Stop(void)
  215. {
  216.     SDA=0;
  217.     delay_us(15);
  218.     SCL=1;
  219.     delay_us(15);
  220.                 SDA=1;
  221.     delay_us(15);
  222. }
  223. ///*******************************************
  224. //函數名稱:ACK
  225. //功    能:完成IIC的主機應答操作
  226. //參    數:無
  227. //返回值  :無
  228. //********************************************/
  229. void ACK(void)
  230. {
  231.     SDA=0;
  232.                 delay_us(1);
  233.     SCL=1;
  234.     delay_us(15);
  235.     SCL=0;
  236.                 delay_us(1);
  237.                 SDA=1;
  238.     delay_us(15);
  239. }
  240. //*******************************************
  241. //函數名稱:NACK
  242. //功    能:完成IIC的主機無應答操作
  243. //參    數:無
  244. //返回值  :無
  245. //********************************************/
  246. void NACK(void)
  247. {
  248.         SDA=1;
  249.         delay_us(1);
  250.         SCL=1;
  251.         delay_us(15);
  252.         SCL=0;
  253.         delay_us(1);
  254.         SDA=0;   
  255.         delay_us(15);
  256. }
  257. //**********檢查應答信號函數******************/
  258. ///*如果返回值為1則證明有應答信號,反之沒有*/
  259. ///*******************************************
  260. //函數名稱:Check
  261. //功    能:檢查從機的應答操作
  262. //參    數:無
  263. //返回值  :從機是否有應答:1--有,0--無
  264. //********************************************/
  265. unsigned char Check(void)
  266. {
  267.     unsigned char slaveack;
  268.    
  269.     SDA=1;
  270.     delay_us(1);
  271.     SCL=1;
  272.                 ADS1115_SDAPort_IN();        // SDA設置為輸入
  273.     delay_us(15);
  274.     slaveack = SDA_IN;                   //讀入SDA數值
  275.     SCL=0;
  276.     delay_us(15);
  277.                 ADS1115_SDAPort_OUT();        // SDA設置為輸出
  278.        
  279.     if(slaveack)    return FALSE;
  280.     else            return TRUE;
  281. }

  282. /***************Write a Byte****************/
  283. void Write_1_Byte(unsigned char DataByte)
  284. {
  285.         int i;

  286.         for(i=0;i<8;i++)
  287.         {
  288.                 if(DataByte&0x80)  //if((DataByte<<i)&0x80)
  289.                   SDA=1;
  290.                 else
  291.                   SDA=0;
  292.         delay_us(15);
  293.                 SCL=1;
  294.         delay_us(15);
  295.         SCL=0;
  296.         delay_us(15);
  297.         DataByte <<= 1;
  298.         }
  299.     SDA=1;
  300.     delay_us(1);
  301. }
  302. /***************Write N Byte****************/
  303. unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n)
  304. {
  305.         int i;

  306.         for(i=0;i<n;i++)
  307.         {
  308.                 Write_1_Byte(*writebuffer);
  309.                 if(Check())
  310.                 {
  311.                         writebuffer ++;
  312.                 }
  313.                 else
  314.                 {
  315.                         Stop();
  316.                     return FALSE;
  317.                 }
  318.         }
  319.         Stop();
  320.         return TRUE;
  321. }

  322. //***************Read a Byte****************/
  323. unsigned char Read_1_Byte(void)
  324. {
  325.     unsigned char data_Value = 0, FLAG, i;
  326.        
  327.     for(i=0;i<8;i++)
  328.     {
  329.         
  330.         SDA=1;
  331.         delay_us(15);
  332.     SCL=1;
  333.         ADS1115_SDAPort_IN();        // SDA設置為輸入
  334.         delay_us(15);
  335.         FLAG=SDA_IN;
  336.         data_Value <<= 1;
  337.         if( FLAG)
  338.            data_Value |= 0x01;

  339.     SCL=0;
  340.     delay_us(15);
  341.         ADS1115_SDAPort_OUT();        // SDA設置為輸出
  342.     }
  343.     return data_Value;
  344. }

  345. //***************Read N Byte****************/
  346. void Read_N_Byte(unsigned int*readbuff, unsigned char n)
  347. {
  348.         unsigned char i;
  349.        
  350.         for(i=0;i<n;i++)
  351.         {
  352.                 readbuff[i]=Read_1_Byte();
  353.                 if(i==n-1)
  354.                         NACK();  //不連續讀字節
  355.                 else
  356.                         ACK(); //連續讀字節
  357.         }
  358.         Stop();

  359. }
  360. //*****************初始化******************/
  361. void InitADS1115(unsigned char S_MUX_0, unsigned char S_MUX_1)
  362. {

  363.        
  364.         if (S_MUX_0 == 0 && S_MUX_1 == 0)
  365.         Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;
  366.         if (S_MUX_0 == 0 && S_MUX_1 == 1)
  367.         Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;
  368.         if (S_MUX_0 == 1 && S_MUX_1 == 0)
  369.         Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;
  370.         if (S_MUX_0 == 1 && S_MUX_1 == 1)
  371.         Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;
  372.    
  373.     Writebuff[0]=ADDRESS_W;
  374.     Writebuff[1]=Pointer_1;
  375.     Writebuff[2]=Config/256;
  376.     Writebuff[3]=Config%256;
  377.         
  378.     Readbuff[0]=ADDRESS_W;
  379.     Readbuff[1]=Pointer_0;
  380.         
  381.     Readbuff[2]=ADDRESS_R;
  382. }

  383. //***************Write a Word***********************/
  384. void WriteWord(void)
  385. {
  386.      int t;
  387.      Start();   //寫入4個字節
  388.      do
  389.      {
  390.           t=Write_N_Byte(Writebuff,4);
  391.      }while(t==0);
  392. }
  393. //***************Read Word***********************/
  394. void ReadWord(void)
  395. {
  396.     int t;
  397.     Start();  //寫入2個字節
  398.     do
  399.     {
  400.       t=Write_N_Byte(Readbuff,2);
  401.     }while(t==0);

  402.     Start();   //寫入2個字節
  403.     do
  404.     {
  405.       t=Write_N_Byte(&Readbuff[2],1);
  406.     }while(t==0);
  407.    
  408.     Read_N_Byte(Result,2);  //讀出2個字節

  409. }

  410. //***************ADS1115********************/
  411. unsigned int ADS1115(unsigned char Channel)
  412. {
  413.         unsigned char S_MUX_0, S_MUX_1;

  414.         switch(Channel)
  415.         {
  416.                 case 0:
  417.                         S_MUX_0 = 0;
  418.                         S_MUX_1 = 0;
  419.                         Channel_Value = Channel + '0';
  420.                         break;
  421.                 case 1:
  422.                         S_MUX_0 = 0;
  423.                         S_MUX_1 = 1;
  424.                         Channel_Value = Channel + '0';
  425.                         break;
  426.                 case 2:
  427.                         S_MUX_0 = 1;
  428.                         S_MUX_1 = 0;
  429.                         Channel_Value = Channel + '0';
  430.                         break;
  431.                 case 3:
  432.                         S_MUX_0 = 1;
  433.                         S_MUX_1 = 1;
  434.                         Channel_Value = Channel + '0';
  435.                         break;
  436.                 default :
  437.                         break;
  438.         }

  439.     InitADS1115(S_MUX_0, S_MUX_1);
  440.     WriteWord();
  441.     DELAY_MS(1);
  442.     ReadWord();
  443.        
  444.     D_ADS=Result[0]*256+Result[1];  //轉換的數字量

  445.           return D_ADS;
  446. }

  447.   main(void)
  448. {       
  449.         unsigned int ADS1115_Value;
  450.         ADS1115_Port_Init();                // ADS1115端口初始化
  451.         InitADS1115();
  452.         UART_init();// 串口初始化
  453.         CS=1;
  454.         while(1)
  455.         {
  456.                         ADS1115_Value = ADS1115(0);        //通道0的數值
  457.                    P_Temp=Re_Convert();  //獲取溫度ADC值
  458.                           DATA_SEND();// 將數據發送出去
  459.             
  460.                         DELAY_MS(1000);

  461.         }
  462. }



復制代碼



評分

參與人數 1黑幣 +50 收起 理由
admin + 50

查看全部評分

ID:111587 發表于 2017-9-2 18:00
請問,我從哪里設置量程?0-5V,稍微有個電壓都報表了
ID:58995 發表于 2017-8-6 18:05
O(∩_∩)O謝謝學習辛苦

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩av大片免费看 | 中文字幕亚洲一区二区三区 | 日韩午夜影院 | 在线第一页 | 6996成人影院网在线播放 | 国产精品日韩一区 | 在线免费看黄 | 日韩精品在线一区 | 亚洲一区二区免费 | 亚洲一区二区三区四区在线观看 | 精精国产xxxx视频在线播放7 | 国产视频一视频二 | 一级片视频免费 | 成人久久久 | 一级黄色片免费在线观看 | 成人不卡视频 | 超碰97在线免费 | 日韩一区二区免费视频 | 黄色在线观看国产 | 在线看av网址 | 午夜免费网站 | 亚洲高清av | 高清视频一区二区三区 | 久在线视频播放免费视频 | 狠狠艹| 日韩美av | 精品亚洲永久免费精品 | 成人免费视频久久 | 国产精品欧美一区二区三区不卡 | 超碰在线播 | 久久com | 伊人伊人 | 国产色爽| 成人免费精品视频 | 91视频在线看 | 中文字幕一区二区三区精彩视频 | 久久不卡 | 精品国产乱码久久久久久蜜退臀 | 国产不卡在线播放 | 亚洲欧美一区二区三区1000 | 欧美中文字幕一区 |