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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的adc0832雙路電壓表Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg51.h>    //包含單片機寄存器的頭文件
  2. #include<intrins.h>  //包含_nop_()函數定義的頭文件
  3. sbit CS=P3^4;       //將CS位定義為P3.4引腳
  4. sbit CLK=P1^0;      //將CLK位定義為P1.0引腳
  5. sbit DIO=P1^1;       //將DIO位定義為P1.1引腳
  6. //////////////////////////////////////////////////////////////////
  7. unsigned char code digit[10]={"0123456789"};   //定義字符數組顯示數字
  8. unsigned char code Str[]={"Volt="};            //說明顯示的是電壓
  9. /*******************************************************************************
  10. 以下是對液晶模塊的操作程序
  11. *******************************************************************************/
  12. sbit RS=P2^0;           //寄存器選擇位,將RS位定義為P2.0引腳
  13. sbit RW=P2^1;           //讀寫選擇位,將RW位定義為P2.1引腳
  14. sbit E=P2^2;            //使能信號位,將E位定義為P2.2引腳
  15. sbit BF=P0^7;           //忙碌標志位,,將BF位定義為P0.7引腳
  16. /*****************************************************
  17. 函數功能:延時1ms
  18. (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
  19. ***************************************************/
  20. void delay1ms()
  21. {
  22.    unsigned char i,j;   
  23.      for(i=0;i<10;i++)
  24.       for(j=0;j<33;j++)
  25.        ;         
  26. }
  27. /*****************************************************
  28. 函數功能:延時若干毫秒
  29. 入口參數:n
  30. ***************************************************/
  31. void delaynms(unsigned char n)
  32. {
  33.    unsigned char i;
  34.     for(i=0;i<n;i++)
  35.        delay1ms();
  36. }
  37. /*****************************************************
  38. 函數功能:判斷液晶模塊的忙碌狀態
  39. 返回值:result。result=1,忙碌;result=0,不忙
  40. ***************************************************/
  41. bit BusyTest(void)
  42.   {
  43.     bit result;
  44.     RS=0;       //根據規定,RS為低電平,RW為高電平時,可以讀狀態
  45.     RW=1;
  46.     E=1;        //E=1,才允許讀寫
  47.     _nop_();   //空操作
  48.     _nop_();
  49.     _nop_();
  50.     _nop_();   //空操作四個機器周期,給硬件反應時間   
  51.     result=BF;  //將忙碌標志電平賦給result
  52.    E=0;         //將E恢復低電平
  53.    return result;
  54.   }
  55. /*****************************************************
  56. 函數功能:將模式設置指令或顯示地址寫入液晶模塊
  57. 入口參數:dictate
  58. ***************************************************/
  59. void WriteInstruction (unsigned char dictate)
  60. {   
  61.     while(BusyTest()==1);   //如果忙就等待
  62.      RS=0;                  //根據規定,RS和R/W同時為低電平時,可以寫入指令
  63.      RW=0;   
  64.      E=0;                   //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  65.                            // 就是讓E從0到1發生正跳變,所以應先置"0"
  66.      _nop_();
  67.      _nop_();               //空操作兩個機器周期,給硬件反應時間
  68.      P0=dictate;            //將數據送入P0口,即寫入指令或地址
  69.      _nop_();
  70.      _nop_();
  71.      _nop_();
  72.      _nop_();               //空操作四個機器周期,給硬件反應時間
  73.      E=1;                   //E置高電平
  74.      _nop_();
  75.      _nop_();
  76.      _nop_();
  77.      _nop_();               //空操作四個機器周期,給硬件反應時間
  78.       E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  79. }
  80. /*****************************************************
  81. 函數功能:指定字符顯示的實際地址
  82. 入口參數:x
  83. ***************************************************/
  84. void WriteAddress(unsigned char x)
  85. {
  86.      WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
  87. }
  88. /*****************************************************
  89. 函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊
  90. 入口參數:y(為字符常量)
  91. ***************************************************/
  92. void WriteData(unsigned char y)
  93. {
  94.     while(BusyTest()==1);  
  95.       RS=1;           //RS為高電平,RW為低電平時,可以寫入數據
  96.       RW=0;
  97.       E=0;            //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  98.                      // 就是讓E從0到1發生正跳變,所以應先置"0"
  99.       P0=y;           //將數據送入P0口,即將數據寫入液晶模塊
  100.       _nop_();
  101.       _nop_();
  102.        _nop_();
  103.      _nop_();       //空操作四個機器周期,給硬件反應時間
  104.       E=1;           //E置高電平
  105.       _nop_();
  106.       _nop_();
  107.       _nop_();
  108.      _nop_();        //空操作四個機器周期,給硬件反應時間
  109.      E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  110. }
  111. /*****************************************************
  112. 函數功能:對LCD的顯示模式進行初始化設置
  113. ***************************************************/
  114. void LcdInitiate(void)
  115. {
  116.     delaynms(15);               //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  117.     WriteInstruction(0x38);     //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
  118.     delaynms(5);                //延時5ms ,給硬件一點反應時間
  119.     WriteInstruction(0x38);
  120.     delaynms(5);               //延時5ms ,給硬件一點反應時間
  121.     WriteInstruction(0x38);     //連續三次,確保初始化成功
  122.     delaynms(5);               //延時5ms ,給硬件一點反應時間
  123.     WriteInstruction(0x0c);     //顯示模式設置:顯示開,無光標,光標不閃爍
  124.     delaynms(5);               //延時5ms ,給硬件一點反應時間
  125.     WriteInstruction(0x06);     //顯示模式設置:光標右移,字符不移
  126.     delaynms(5);                //延時5ms ,給硬件一點反應時間
  127.     WriteInstruction(0x01);     //清屏幕指令,將以前的顯示內容清除
  128.     delaynms(5);             //延時5ms ,給硬件一點反應時間

  129. }
  130. /**************************************************************************
  131. 以下是電壓顯示的說明
  132. **************************************************************************/
  133. /*****************************************************
  134. 函數功能:顯示電壓符號
  135. ***************************************************/   
  136. void display_volt(void)
  137. {
  138.     unsigned char i;
  139.      WriteAddress(0x03);    //寫顯示地址,將在第2行第1列開始顯示
  140.      i = 0;                //從第一個字符開始顯示
  141.      while(Str[i] != '\0')  //只要沒有寫到結束標志,就繼續寫
  142.       {                        
  143.          WriteData(Str[i]);   //將字符常量寫入LCD
  144.          i++;                 //指向下一個字符               
  145.         }   
  146. }
  147. void display_volt2(void)
  148. {
  149.     unsigned char i;
  150.      WriteAddress(0x43);    //寫顯示地址,將在第2行第1列開始顯示
  151.      i = 0;                //從第一個字符開始顯示
  152.      while(Str[i] != '\0')  //只要沒有寫到結束標志,就繼續寫
  153.       {                        
  154.          WriteData(Str[i]);   //將字符常量寫入LCD
  155.          i++;                 //指向下一個字符               
  156.         }   
  157. }

  158. /*****************************************************
  159. 函數功能:顯示電壓的小數點
  160. ***************************************************/   
  161. void display_dot(void)
  162. {         
  163.      WriteAddress(0x09);      //寫顯示地址,將在第1行第10列開始顯示           
  164.      WriteData('.');       //將小數點的字符常量寫入LCD        
  165. }
  166. void display_dot2(void)
  167. {         
  168.      WriteAddress(0x49);      //寫顯示地址,將在第1行第10列開始顯示           
  169.      WriteData('.');       //將小數點的字符常量寫入LCD        
  170. }
  171. /*****************************************************
  172. 函數功能:顯示電壓的單位(V)
  173. ***************************************************/   
  174. void  display_V(void)
  175. {
  176.     WriteAddress(0x0c); //寫顯示地址,將在第2行第13列開始顯示   
  177.      WriteData('V');     //將字符常量寫入LCD            
  178.             
  179. }
  180. void  display_V2(void)
  181. {
  182.     WriteAddress(0x4c); //寫顯示地址,將在第2行第13列開始顯示   
  183.      WriteData('V');     //將字符常量寫入LCD            
  184.             
  185. }
  186. /*****************************************************
  187. 函數功能:顯示電壓的整數部分
  188. 入口參數:x
  189. ***************************************************/
  190. void display1(unsigned char x)
  191. {

  192.     WriteAddress(0x08);    //寫顯示地址,將在第2行第7列開始顯示
  193.     WriteData(digit[x]);    //將百位數字的字符常量寫入LCD
  194. }
  195. void display1_2(unsigned char x)
  196. {

  197.     WriteAddress(0x48);    //寫顯示地址,將在第2行第7列開始顯示
  198.     WriteData(digit[x]);    //將百位數字的字符常量寫入LCD
  199. }
  200. /*****************************************************
  201. 函數功能:顯示電壓的小數數部分
  202. 入口參數:x
  203. ***************************************************/
  204. void display2(unsigned char x)
  205. {
  206.      unsigned char i,j;
  207.     i=x/10;            //取十位(小數點后第一位)
  208.     j=x%10;            //取個位(小數點后第二位)
  209.    WriteAddress(0x0a);      //寫顯示地址,將在第1行第11列開始顯示
  210.     WriteData(digit[i]);     //將小數部分的第一位數字字符常量寫入LCD
  211.     WriteData(digit[j]);     //將小數部分的第一位數字字符常量寫入LCD
  212. }
  213. void display2_2(unsigned char x)
  214. {
  215.      unsigned char i,j;
  216.     i=x/10;            //取十位(小數點后第一位)
  217.     j=x%10;            //取個位(小數點后第二位)
  218.    WriteAddress(0x4a);      //寫顯示地址,將在第1行第11列開始顯示
  219.     WriteData(digit[i]);     //將小數部分的第一位數字字符常量寫入LCD
  220.     WriteData(digit[j]);     //將小數部分的第一位數字字符常量寫入LCD
  221. }
  222. /*****************************************************
  223. 函數功能:將模擬信號轉換成數字信號
  224. ***************************************************/
  225. unsigned char  A_D()
  226. {
  227.   unsigned char i,dat;
  228.    CS=1;   //一個轉換周期開始
  229.    CLK=0;  //為第一個脈沖作準備
  230.    CS=0;  //CS置0,片選有效

  231.    DIO=1;    //DIO置1,規定的起始信號  
  232.    CLK=1;   //第一個脈沖
  233.    CLK=0;   //第一個脈沖的下降沿,此前DIO必須是高電平
  234.    DIO=1;   //DIO置1, 通道選擇信號  
  235.    CLK=1;   //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
  236.    CLK=0;   //第二個脈沖下降沿
  237.    DIO=0;   //DI置0,選擇通道0
  238.    CLK=1;    //第三個脈沖
  239.    CLK=0;    //第三個脈沖下降沿
  240.    DIO=1;    //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
  241.    CLK=1;    //第四個脈沖
  242.    for(i=0;i<8;i++)  //高位在前
  243.     {
  244.       CLK=1;         //第四個脈沖
  245.       CLK=0;
  246.       dat<<=1;       //將下面儲存的低位數據向右移
  247.         dat|=(unsigned char)DIO;      //將輸出數據DIO通過或運算儲存在dat最低位
  248.     }                     
  249.     CS=1;          //片選無效
  250.      return dat;     //將讀書的數據返回     
  251.   }


復制代碼

全部資料51hei下載地址:
基于ADC0832的數字電壓表.zip (80.33 KB, 下載次數: 150)

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

使用道具 舉報

沙發
ID:236933 發表于 2024-1-15 17:43 | 只看該作者
為什么測試發現,任意調節一個滑動變阻器,LCD顯示的兩個通道的電壓值會一起變動為一個值
回復

使用道具 舉報

板凳
ID:1108782 發表于 2024-1-16 09:24 | 只看該作者
芯片通信時序的第二第三個脈沖代表通道,你只選了通道0。還有你主函數呢?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品久久久久久久久久久久久 | 亚洲成av| 亚洲视频精品在线 | 免费av手机在线观看 | 日韩一区二区在线视频 | 久久久婷婷| 国产成人免费视频网站高清观看视频 | 欧美日韩精品区 | 久久国产精品精品 | 国产一区二区三区日韩 | 99r在线 | 国产91在线播放 | 中文字幕视频网 | www.youjizz.com日韩 | 久久99精品久久久 | 激情五月综合 | 国内激情av片 | 午夜影院在线观看免费 | 91精品成人久久 | av免费电影在线 | 精品国产欧美一区二区三区成人 | 久久久久成人精品亚洲国产 | 91视频网 | 欧美精品在线免费 | 欧美久久久久久 | 日韩久久中文字幕 | 成人一区二区三区在线观看 | 亚洲精品日韩一区二区电影 | 精品不卡| 日本精品在线观看 | 国产成人福利 | 亚洲国产看片 | 99精品久久 | 91精品入口蜜桃 | 日韩欧美在线视频一区 | 成人免费黄色片 | 精品欧美一区二区三区久久久 | 欧美乱大交xxxxx另类电影 | 欧美日产国产成人免费图片 | 亚洲狠狠爱 | 亚洲精品乱码久久久久v最新版 |