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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1731|回復(fù): 3
收起左側(cè)

單片機(jī)+ADC0832 如何修正AD顯示值并判斷電壓是否符合要求?附程序

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 50 黑幣 回復(fù)本帖可獲得 10 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
ID:1045846 發(fā)表于 2024-1-20 17:39 | 顯示全部樓層 |閱讀模式
這個(gè)程序也是在本論壇上找的,在使用ADC0832模塊讀取電壓值時(shí),發(fā)現(xiàn)轉(zhuǎn)換的電壓值同電壓表顯示的有偏差,現(xiàn)在想通過(guò)修正使兩者基本一致,即不同的電壓范圍加上相應(yīng)的數(shù)字,條件如下:
1.AD值在0.2以下時(shí)不加;
2.大于0.2,小于1.0時(shí)加0.05;
3.大于1.0,小于3.0時(shí)加0.1
4.大于3.0,小于4.0時(shí)加0.13
5.大于4.0時(shí),加0.16

還有一個(gè)需求:
電壓值在0.2以下或1.5-3.0范圍時(shí)點(diǎn)亮P3.0,其它的值均點(diǎn)亮P3.1。

感謝各位老師。

以下是目前使用的單片機(jī)程序:

  1. //-----------------------------------------------------------------
  2. //  說(shuō)明: 調(diào)整VR1時(shí),ADC0832將模擬電壓轉(zhuǎn)換為數(shù)字電壓顯示在1602液晶
  3. //        屏第0行,液晶屏第1行同時(shí)以進(jìn)程條方式顯示當(dāng)前電壓大小.
  4. //
  5. //-----------------------------------------------------------------
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. #include <string.h>
  9. #define uchar  unsigned char
  10. #define uint unsigned int
  11. //ADC0832引腳定義
  12. sbit CS   =  P1^0;                //片選線(xiàn)(電路中固定連接低電平)
  13. sbit CLK  =  P1^1;                //時(shí)鐘線(xiàn)
  14. sbit DIO  =  P1^2;                //數(shù)據(jù)線(xiàn)
  15. //LCD1602端口定義
  16. sbit RS = P2^5;                        //寄存器選擇
  17. sbit RW = P2^6;                        //讀寫(xiě)控制
  18. sbit E  = P2^7;                        //使能控制
  19. #define LCD_PORT  P0        //液晶端口
  20. uchar Disp_Buff1[] = " VOLTAGE:  0.00V";        //數(shù)字電壓顯示緩沖
  21. uchar Disp_Buff2[16];                                                //進(jìn)程條圖形顯示緩沖
  22. #define delay4us() { _nop_();_nop_();_nop_();_nop_();}
  23. //-----------------------------------------------------------------
  24. // 延時(shí)函數(shù)
  25. //-----------------------------------------------------------------
  26. void delay_ms(uint x)
  27. {
  28.         uchar t; while(x--) for(t = 0; t < 120; t++);
  29. }

  30. //-----------------------------------------------------------------
  31. // 讀LCD忙狀態(tài)
  32. //-----------------------------------------------------------------
  33. bit Read_LCD_Busy_Flag()
  34. {
  35.         uchar result;
  36.         LCD_PORT=0xff;                        //液晶屏端口電平拉高
  37.         RS=0;RW=1;                            //選擇命令寄存器,準(zhǔn)備讀
  38.         E=1;delay4us(); result=P0; E=0;       //下降沿讀命令寄存器
  39.         return (result&0x80)? 1 : 0;          //返回忙狀態(tài)
  40. }

  41. //-----------------------------------------------------------------
  42. // 寫(xiě)LCD命令
  43. //-----------------------------------------------------------------
  44. void Write_LCD_Command(uchar cmd)        
  45. {
  46.         while(Read_LCD_Busy_Flag());           //液晶屏忙等待
  47.         RS=0;RW=0;                             //選擇命令寄存器,準(zhǔn)備寫(xiě)
  48.         E=0; _nop_();_nop_();LCD_PORT=cmd;     //數(shù)據(jù)送到液晶屏端口
  49.         delay4us();E=1;delay4us();E=0;         //寫(xiě)入后禁止液晶屏
  50. }

  51. //-----------------------------------------------------------------
  52. // 寫(xiě)LCD數(shù)據(jù)
  53. //-----------------------------------------------------------------
  54. void Write_LCD_Data(uchar dat)
  55. {
  56.         while(Read_LCD_Busy_Flag());           //液晶屏忙等待
  57.         RS=1;RW=0;                             //選擇數(shù)據(jù)寄存器,準(zhǔn)備寫(xiě)
  58.         E=0; LCD_PORT=dat; delay4us();         //數(shù)據(jù)送到液晶屏端口
  59.         E=1;delay4us(); E=0;                   //寫(xiě)入后禁止液晶屏
  60. }

  61. //-----------------------------------------------------------------
  62. // 在LCD指定行/列位置顯示字符串
  63. //-----------------------------------------------------------------
  64. void LCD_Show_String(uchar r,uchar c, char *s)
  65. {
  66.         uchar i=0;
  67.         uchar code DDRAM[]={0x80,0xc0};              //液晶屏上下兩行的DDRAM首地址   
  68.         Write_LCD_Command(DDRAM[r] | c);             //設(shè)置顯示起始位置
  69.         while(s[i] && i<16) Write_LCD_Data(s[i++]);  //輸出顯示字符
  70. }

  71. //-----------------------------------------------------------------
  72. // LCD初始化
  73. //-----------------------------------------------------------------
  74. void LCD_Initialise()
  75. {
  76.         Write_LCD_Command(0x38); delay_ms(1);
  77.         Write_LCD_Command(0x0C); delay_ms(1);
  78.         Write_LCD_Command(0x06); delay_ms(1);
  79.         Write_LCD_Command(0x01); delay_ms(1);
  80. }

  81. //-----------------------------------------------------------------
  82. // 獲取AD轉(zhuǎn)換結(jié)果 ( 0通道 )
  83. //-----------------------------------------------------------------
  84. uchar Get_AD_Result()
  85. {
  86.         uchar i,dat1=0,dat2=0;
  87.         //使能ADC0832,時(shí)鐘線(xiàn)初始置低電平
  88.         CS=0; CLK=0;
  89.         //第1個(gè)時(shí)鐘脈沖上升沿之前,通過(guò)DIO選擇模式
  90.         DIO=1;        _nop_();_nop_();
  91.         CLK=1;        _nop_();_nop_();
  92.         //第2個(gè)時(shí)鐘脈沖上升沿之前,通過(guò)DIO選擇模式
  93.         //設(shè)DI=1選擇單端(SGL) 設(shè)DI=0 選擇分差(DIF)
  94.         //下面設(shè)置的是單端模式
  95.         CLK=0; DIO=1;  _nop_();_nop_();
  96.         CLK=1;         _nop_();_nop_();
  97.         //第2個(gè)時(shí)鐘脈沖上升沿之前,設(shè)DI=0/1,分別對(duì)應(yīng)選擇CH0/CH1
  98.         CLK=0; DIO=0;  _nop_();_nop_();
  99.         CLK=1;         _nop_();_nop_();
  100.         //第3個(gè)時(shí)鐘脈沖下升沿之后置DI=1,釋放數(shù)據(jù)線(xiàn),準(zhǔn)備接收(設(shè)置原理可參考第一章端口說(shuō)明)
  101.         //P1端口讀取數(shù)據(jù)時(shí)需要先寫(xiě)1,否則總線(xiàn)將出現(xiàn)邏輯沖突(黃色方塊閃爍)
  102.         CLK=0; DIO=1;  _nop_();_nop_();
  103.         //根據(jù)時(shí)序圖可知,在正式讀取轉(zhuǎn)換數(shù)據(jù)之前,此時(shí)的D0將固定輸出0
  104.         //P3=(uchar)DIO;
  105.         //第4~11,共8個(gè)下降沿讀數(shù)據(jù)(MSB-LSB)
  106.         for(i=0;i<8;i++)
  107.         {
  108.                 CLK=1;        _nop_();_nop_();
  109.                 CLK=0;        _nop_();_nop_();
  110.                 dat1<<=1;
  111.                 if(DIO)
  112.                         dat1=dat1+0x01;
  113.         }
  114.         //第11~18,共8個(gè)下降沿讀數(shù)據(jù)(LSB——MSB)
  115.         for(i=0;i<8;i++)
  116.         {
  117.                 dat2>>=1;
  118.                 if(DIO)
  119.                         dat2=dat2+0x80;
  120.                 CLK=1;       _nop_();_nop_();
  121.                 CLK=0;       _nop_();_nop_();
  122.         }
  123.         CS=1; //禁止ADC0832
  124.         //如果MSB——LSB和LSB——MSB讀取的結(jié)果相同則返回讀取的結(jié)果,否則返回0
  125.         if(dat1==dat2)
  126.                 return dat1;
  127.         return 0x00;
  128. }

  129. //-----------------------------------------------------------------
  130. // 主程序
  131. //-----------------------------------------------------------------
  132. void main()
  133. {
  134.         uchar  AD; uint        d;                //注意d的類(lèi)型為uint
  135.         LCD_Initialise();                        //初始化LCD
  136.         while(1)
  137.         {        
  138.                 AD=Get_AD_Result();    //獲取A/D轉(zhuǎn)換值
  139.                 //根據(jù)四舍五入法計(jì)算電壓值(放大100倍以便分解)
  140.                 d=AD*500.0*2/511.0;
  141.                 //根據(jù)舍尾取整數(shù)計(jì)算電壓值(放大100倍以便分解)
  142.                 //將d = AD*500.0/256;
  143.                 //將AD轉(zhuǎn)換后得到數(shù)據(jù)分解為三個(gè)數(shù)位
  144.                 Disp_Buff1[11] = d / 100     +'0';
  145.                 Disp_Buff1[13] = d / 10 %10  +'0';
  146.                 Disp_Buff1[14] = d % 10      +'0';
  147.                 LCD_Show_String(0,0,Disp_Buff1);
  148.                 //將模數(shù)值折算為實(shí)心方塊及空心方框字符個(gè)數(shù),控制進(jìn)程條圖形顯示
  149.         }
  150. }
復(fù)制代碼

電壓值

電壓值

ADC0832模數(shù)轉(zhuǎn)換與LCD顯示.rar

87.87 KB, 下載次數(shù): 2

回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2024-1-20 21:40 | 顯示全部樓層
你的做法相當(dāng)?shù)牟缓,因(yàn)榕R界點(diǎn)會(huì)出現(xiàn)數(shù)值跳動(dòng),太假了。

你應(yīng)該用最小二乘法把校準(zhǔn)數(shù)據(jù)擬合成二次曲線(xiàn)。
回復(fù)

使用道具 舉報(bào)

ID:893997 發(fā)表于 2024-1-22 15:17 | 顯示全部樓層
你這樣簡(jiǎn)單,但是結(jié)果可信度不高,最好還是用高精度萬(wàn)用表測(cè)一下全范圍數(shù)據(jù),然后求偏差曲線(xiàn)。
回復(fù)

使用道具 舉報(bào)

ID:1045846 發(fā)表于 2024-1-22 20:33 | 顯示全部樓層
感謝兩位老師的建議。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产在线播放 | 免费网站观看www在线观 | 日韩一级二级三级 | 久久久久国产精品夜夜夜夜夜 | 亚洲国产精品一区二区三区 | 免费黄色在线 | 欧美一二| 久久综合热 | 欧美美女一区二区 | 九九热视频在线观看 | 中文字幕网址在线 | 久草福利视频 | 久久久久久黄色 | 黄色片免费在线观看 | 亚洲激情综合网 | 美日韩丰满少妇在线观看 | 精品日韩在线 | 亚洲精品一二三区 | 五月婷婷开心 | 亚洲日本国产 | 国产午夜精品视频 | 一级做a爰片久久毛片潮喷 视频一二区 | 色婷婷基地 | 少妇一级淫片免费观看 | 99香蕉视频| 亚洲高清视频在线 | 一区二区三区黄色 | 欧美日韩性| 一区二区高清视频 | 在线性视频 | 日韩精品视频一区二区三区 | 亚洲三级av | 国产欧美一区二区精品性色超碰 | 亚洲第十页 | 日本一级淫片 | 狠狠干av | 四虎在线视频 | 亚洲无人区一线二线三线 | 日本视频在线播放 | 奇米影视亚洲春色 | 欧美性生交xxxxx |