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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機ADC0832模數轉換芯片顯示采集電壓Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
最近在學習ADC0832這款芯片,雖然說型號老了點,但是學懂了這個,其他AD芯片就不是這么難了。寫了程序, 給大家學習參考!

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. //-----------------------------------------------------------------
  2. //  說明: 調整VR1時,ADC0832將模擬電壓轉換為數字電壓顯示在1602液晶
  3. //        屏第0行,液晶屏第1行同時以進程條方式顯示當前電壓大小.
  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;                //片選線(電路中固定連接低電平)
  13. sbit CLK  =  P1^1;                //時鐘線
  14. sbit DIO  =  P1^2;                //數據線
  15. //LCD1602端口定義
  16. sbit RS = P2^0;                        //寄存器選擇
  17. sbit RW = P2^1;                        //讀寫控制
  18. sbit E  = P2^2;                        //使能控制
  19. #define LCD_PORT  P0        //液晶端口
  20. uchar Disp_Buff1[] = " VOLTAGE:  0.00V";        //數字電壓顯示緩沖
  21. uchar Disp_Buff2[16];                                                //進程條圖形顯示緩沖
  22. #define delay4us() { _nop_();_nop_();_nop_();_nop_();}
  23. //-----------------------------------------------------------------
  24. // 延時函數
  25. //-----------------------------------------------------------------
  26. void delay_ms(uint x)
  27. {
  28.         uchar t; while(x--) for(t = 0; t < 120; t++);
  29. }

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

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

  51. //-----------------------------------------------------------------
  52. // 寫LCD數據
  53. //-----------------------------------------------------------------
  54. void Write_LCD_Data(uchar dat)
  55. {
  56.         while(Read_LCD_Busy_Flag());           //液晶屏忙等待
  57.         RS=1;RW=0;                             //選擇數據寄存器,準備寫
  58.         E=0; LCD_PORT=dat; delay4us();         //數據送到液晶屏端口
  59.         E=1;delay4us(); E=0;                   //寫入后禁止液晶屏
  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);             //設置顯示起始位置
  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轉換結果 ( 0通道 )
  83. //-----------------------------------------------------------------
  84. uchar Get_AD_Result()
  85. {
  86.         uchar i,dat1=0,dat2=0;
  87.         //使能ADC0832,時鐘線初始置低電平
  88.         CS=0; CLK=0;
  89.         //第1個時鐘脈沖上升沿之前,通過DIO選擇模式
  90.         DIO=1;        _nop_();_nop_();
  91.         CLK=1;        _nop_();_nop_();
  92.         //第2個時鐘脈沖上升沿之前,通過DIO選擇模式
  93.         //設DI=1選擇單端(SGL) 設DI=0 選擇分差(DIF)
  94.         //下面設置的是單端模式
  95.         CLK=0; DIO=1;  _nop_();_nop_();
  96.         CLK=1;         _nop_();_nop_();
  97.         //第2個時鐘脈沖上升沿之前,設DI=0/1,分別對應選擇CH0/CH1
  98.         CLK=0; DIO=0;  _nop_();_nop_();
  99.         CLK=1;         _nop_();_nop_();
  100.         //第3個時鐘脈沖下升沿之后置DI=1,釋放數據線,準備接收(設置原理可參考第一章端口說明)
  101.         //P1端口讀取數據時需要先寫1,否則總線將出現邏輯沖突(黃色方塊閃爍)
  102.         CLK=0; DIO=1;  _nop_();_nop_();
  103.         //根據時序圖可知,在正式讀取轉換數據之前,此時的D0將固定輸出0
  104.         //P3=(uchar)DIO;
  105.         //第4~11,共8個下降沿讀數據(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個下降沿讀數據(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讀取的結果相同則返回讀取的結果,否則返回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的類型為uint
  135.         LCD_Initialise();                        //初始化LCD
  136.         while(1)
  137.         {       
  138.                 AD=Get_AD_Result();    //獲取A/D轉換值
  139.                 //根據四舍五入法計算電壓值(放大100倍以便分解)
  140.                 d=AD*500.0*2/511.0;
  141.                 //根據舍尾取整數計算電壓值(放大100倍以便分解)
  142.                 //將d = AD*500.0/256;
  143.                 //將AD轉換后得到數據分解為三個數位
  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.                 //將模數值折算為實心方塊及空心方框字符個數,控制進程條圖形顯示
  149.         }
  150. }
復制代碼

所有資料51hei附件下載:
仿真程序.7z (34.52 KB, 下載次數: 59)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:994634 發表于 2023-12-14 08:24 | 只看該作者
注釋很到位,便于學習和參考。已下載,謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕韩在线第一页 | 国产a区 | 久久久久久成人 | 中文在线一区二区 | 精品国产免费人成在线观看 | 久久久久国产一区二区三区 | 日韩av在线免费 | 狠狠躁躁夜夜躁波多野结依 | 亚洲欧美日韩一区 | 亚洲欧美一区二区三区国产精品 | 81精品国产乱码久久久久久 | 青青伊人久久 | 婷婷二区| 99亚洲综合 | 久草色视频 | 精品国产99 | a黄在线观看 | 一区二区三区在线免费观看 | 人和拘一级毛片c | 欧美精品乱码久久久久久按摩 | 在线国产一区二区 | 亚洲国产精品va在线看黑人 | 亚洲精品第一 | 日韩精品在线播放 | 羞视频在线观看 | 国产亚洲成av人片在线观看桃 | 午夜一级做a爰片久久毛片 精品综合 | 激情毛片 | 国产亚洲成av人片在线观看桃 | 91精品国产综合久久精品 | a级大片免费观看 | 久久久久久久一区二区三区 | 国产精品18久久久久久久 | 欧美不卡一区二区 | 国产日韩欧美激情 | 97视频成人| 91亚洲国产成人久久精品网站 | 水蜜桃亚洲一二三四在线 | 一区观看 | 玖玖综合在线 | 四色永久 |