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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

如何把這個單片機的ADC改為16位,把電壓顯示轉為對照度的顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:345989 發表于 2019-6-22 18:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是網從上下載的一段程序代碼,我們的設計是把其中的ADC改為16位,把電壓顯示轉為對照度的顯示,其中也需要用proteus進行一下仿真,因為對單片機這一塊不太了解,請熱心人士不吝指教。

單片機源程序如下:
  1. //控制口定義
  2. #include<reg52.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define   ad0_7  P1
  7. sbit CS=P1^0;
  8. sbit CLK=P1^1;
  9. sbit DIO=P1^2;
  10. sbit RS=P3^5;
  11. sbit RW=P3^6;
  12. sbit E=P3^7;
  13. sbit BF=P0^7;



  14. void delay (uint t)
  15. {uint i;
  16.         uchar j;
  17.                 for(i=t;i>0;i--);
  18.                         for(j=0;j<200;j++);
  19. }

  20. //AD轉換子程序
  21. unsigned char  A_D()
  22. {
  23.   unsigned char i,dat;
  24.    CS=1;   //一個轉換周期開始
  25.    CLK=0;  //為第一個脈沖作準備
  26.    CS=0;  //CS置0,片選有效

  27.    DIO=1;    //DIO置1,規定的起始信號  
  28.    CLK=1;   //第一個脈沖
  29.    CLK=0;   //第一個脈沖的下降沿,此前DIO必須是高電平
  30.    DIO=1;   //DIO置1, 通道選擇信號  
  31.    CLK=1;   //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
  32.    CLK=0;   //第二個脈沖下降沿
  33.    DIO=0;   //DI置0,選擇通道0
  34.    CLK=1;    //第三個脈沖
  35.    CLK=0;    //第三個脈沖下降沿
  36.    DIO=1;    //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
  37.    CLK=1;    //第四個脈沖
  38.    for(i=0;i<8;i++)  //高位在前
  39.     {
  40.       CLK=1;         //第四個脈沖
  41.       CLK=0;
  42.       dat<<=1;       //將下面儲存的低位數據向右移
  43.                 dat|=(unsigned char)DIO;          //將輸出數據DIO通過或運算儲存在dat最低位
  44.     }                                  
  45.     CS=1;          //片選無效
  46.          return dat;         //將讀書的數據返回     
  47.   }

  48. unsigned char code digit[10]={"0123456789"};   //定義字符數組顯示數字
  49. unsigned char code Str1[]={"LX="};            //說明顯示的是電壓
  50. unsigned char code Str2[]={"nine"};
  51. /*******************************************************************************
  52. 以下是對液晶模塊的操作程序
  53. *******************************************************************************/

  54. /*****************************************************
  55. 函數功能:延時1ms
  56. (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
  57. ***************************************************/
  58. void delay1ms()
  59. {
  60.    unsigned char i,j;       
  61.          for(i=0;i<10;i++)
  62.           for(j=0;j<33;j++)
  63.            ;                 
  64. }
  65. /*****************************************************
  66. 函數功能:延時若干毫秒
  67. 入口參數:n
  68. ***************************************************/
  69. void delaynms(unsigned char n)
  70. {
  71.    unsigned char i;
  72.         for(i=0;i<n;i++)
  73.            delay1ms();
  74. }
  75. /*****************************************************
  76. 函數功能:判斷液晶模塊的忙碌狀態
  77. 返回值:result。result=1,忙碌;result=0,不忙
  78. ***************************************************/
  79. bit BusyTest(void)
  80.   {
  81.     bit result;
  82.         RS=0;       //根據規定,RS為低電平,RW為高電平時,可以讀狀態
  83.     RW=1;
  84.     E=1;        //E=1,才允許讀寫
  85.     _nop_();   //空操作
  86.     _nop_();
  87.     _nop_();
  88.     _nop_();   //空操作四個機器周期,給硬件反應時間       
  89.     result=BF;  //將忙碌標志電平賦給result
  90.    E=0;         //將E恢復低電平
  91.    return 0;
  92.   }
  93. /*****************************************************
  94. 函數功能:將模式設置指令或顯示地址寫入液晶模塊
  95. 入口參數:dictate
  96. ***************************************************/
  97. void WriteInstruction (unsigned char dictate)
  98. {   
  99.     while(BusyTest()==1);   //如果忙就等待
  100.          RS=0;                  //根據規定,RS和R/W同時為低電平時,可以寫入指令
  101.          RW=0;   
  102.          E=0;                   //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  103.                            // 就是讓E從0到1發生正跳變,所以應先置"0"
  104.          _nop_();
  105.          _nop_();               //空操作兩個機器周期,給硬件反應時間
  106.          P0=dictate;            //將數據送入P0口,即寫入指令或地址
  107.          _nop_();
  108.          _nop_();
  109.          _nop_();
  110.          _nop_();               //空操作四個機器周期,給硬件反應時間
  111.          E=1;                   //E置高電平
  112.          _nop_();
  113.          _nop_();
  114.          _nop_();
  115.          _nop_();               //空操作四個機器周期,給硬件反應時間
  116.           E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  117. }
  118. /*****************************************************
  119. 函數功能:指定字符顯示的實際地址
  120. 入口參數:x
  121. ***************************************************/
  122. void WriteAddress(unsigned char x)
  123. {
  124.      WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
  125. }
  126. /*****************************************************
  127. 函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊
  128. 入口參數:y(為字符常量)
  129. ***************************************************/
  130. void WriteData(unsigned char y)
  131. {
  132.     while(BusyTest()==1);  
  133.           RS=1;           //RS為高電平,RW為低電平時,可以寫入數據
  134.           RW=0;
  135.           E=0;            //E置低電平(根據表8-6,寫指令時,E為高脈沖,
  136.                      // 就是讓E從0到1發生正跳變,所以應先置"0"
  137.           P0=y;           //將數據送入P0口,即將數據寫入液晶模塊
  138.           _nop_();
  139.           _nop_();
  140.           _nop_();
  141.      _nop_();       //空操作四個機器周期,給硬件反應時間
  142.           E=1;           //E置高電平
  143.           _nop_();
  144.           _nop_();
  145.           _nop_();
  146.          _nop_();        //空操作四個機器周期,給硬件反應時間
  147.          E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  148. }
  149. /*****************************************************
  150. 函數功能:對LCD的顯示模式進行初始化設置
  151. ***************************************************/
  152. void LcdInitiate(void)
  153. {
  154.     delaynms(15);               //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  155.     WriteInstruction(0x38);     //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
  156.         delaynms(5);                //延時5ms ,給硬件一點反應時間
  157.     WriteInstruction(0x38);
  158.         delaynms(5);               //延時5ms ,給硬件一點反應時間
  159.         WriteInstruction(0x38);     //連續三次,確保初始化成功
  160.         delaynms(5);               //延時5ms ,給硬件一點反應時間
  161.         WriteInstruction(0x0c);     //顯示模式設置:顯示開,無光標,光標不閃爍
  162.         delaynms(5);               //延時5ms ,給硬件一點反應時間
  163.         WriteInstruction(0x06);     //顯示模式設置:光標右移,字符不移
  164.         delaynms(5);                //延時5ms ,給硬件一點反應時間
  165.         WriteInstruction(0x01);     //清屏幕指令,將以前的顯示內容清除
  166.         delaynms(5);             //延時5ms ,給硬件一點反應時間

  167. }
  168. /**************************************************************************
  169. 以下是電壓顯示的說明
  170. **************************************************************************/
  171. /*****************************************************
  172. 函數功能:顯示電壓符號
  173. ***************************************************/   
  174. void display_volt(void)
  175. {
  176.     unsigned char i;
  177.          WriteAddress(0x01);    //寫顯示地址,將在第2行第1列開始顯示
  178.          i = 0;                //從第一個字符開始顯示
  179.          while(Str1[i] != '\0')  //只要沒有寫到結束標志,就繼續寫
  180.           {                                               
  181.                  WriteData(Str1[i]);   //將字符常量寫入LCD
  182.                  i++;                 //指向下一個字符                               
  183.                 }
  184.                
  185.                
  186. }


  187. void display3(void)
  188. {
  189.     unsigned char i;
  190.          WriteAddress(0x80+0x41);    //寫顯示地址,將在第2行第1列開始顯示
  191.          i = 0;                //從第一個字符開始顯示
  192.          while(Str2[i] != '\0')  //只要沒有寫到結束標志,就繼續寫
  193.           {                                               
  194.                  WriteData(Str2[i]);   //將字符常量寫入LCD
  195.                  i++;                 //指向下一個字符                               
  196.                 }
  197.                
  198.                
  199. }

  200. /*****************************************************
  201. 函數功能:顯示電壓的小數點
  202. ***************************************************/   
  203. void         display_dot(void)
  204. {         
  205.          WriteAddress(0x09);          //寫顯示地址,將在第1行第10列開始顯示                  
  206.          WriteData('.');       //將小數點的字符常量寫入LCD               
  207. }

  208. /*****************************************************
  209. 函數功能:顯示電壓的單位(V)
  210. ***************************************************/   
  211. void         display_V(void)
  212. {
  213.     WriteAddress(0x0e); //寫顯示地址,將在第2行第13列開始顯示       
  214.          WriteData('V');     //將字符常量寫入LCD                       
  215.                        
  216. }
  217. /*****************************************************
  218. 函數功能:顯示電壓的整數部分
  219. 入口參數:x
  220. ***************************************************/
  221. void display1(unsigned char x)
  222. {

  223.         WriteAddress(0x08);    //寫顯示地址,將在第2行第7列開始顯示
  224.         WriteData(digit[x]);    //將百位數字的字符常量寫入LCD
  225. }
  226. /*****************************************************
  227. 函數功能:顯示電壓的小數數部分
  228. 入口參數:x
  229. ***************************************************/
  230. void display2(unsigned char x)
  231. {
  232.         unsigned char i,j;
  233.         i=x/10;            //取十位(小數點后第一位)
  234.         j=x%10;            //取個位(小數點后第二位)
  235.    WriteAddress(0x0a);      //寫顯示地址,將在第1行第11列開始顯示
  236.         WriteData(digit[i]);     //將小數部分的第一位數字字符常量寫入LCD
  237.         WriteData(digit[j]);     //將小數部分的第一位數字字符常量寫入LCD
  238. }
  239. main(void)
  240. {
  241.   unsigned int AD_val;    //儲存A/D轉換后的值
  242.   unsigned char Int,Dec;   //分別儲存轉換后的整數部分與小數部分
  243.    LcdInitiate();         //將液晶初始化
  244.    delaynms(50);           //延時5ms給硬件一點反應時間       
  245.    display3();
  246.         display_volt();        //顯示溫度說明
  247.    display_dot();         //顯示溫度的小數點
  248.    display_V();           //顯示溫度的單位
  249.    while(1)
  250.       {
  251.                   AD_val= A_D();    //進行A/D轉換
  252.                  
  253.                   Int=(AD_val)/51;  //計算整數部分
  254.                   Dec=(AD_val%51)*100/51;    //計算小數部分
  255.                   display1(Int);     //顯示整數部分
  256.                   display2(Dec);     //顯示小數部分
  257.                   delaynms(500);     //延時250ms
  258.                 }
  259.                     
  260. }
復制代碼

所有資料51hei提供下載:
單片機照度計.zip (22.06 KB, 下載次數: 9)


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

使用道具 舉報

沙發
ID:552614 發表于 2019-6-24 17:00 | 只看該作者
AD轉換不是應該看芯片類型嗎?,我進來學習一下,不懂怎么轉換
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区在线播放 | 久草中文网 | 亚洲欧洲日韩精品 中文字幕 | 欧美激情欧美激情在线五月 | 久久久国产一区二区三区 | 欧美在线a | 亚洲久久在线 | 粉嫩一区二区三区四区公司1 | 国产精品毛片av一区 | 天天艹天天干天天 | 日韩超碰 | 一级黄色片日本 | 欧美在线日韩 | 欧美www在线 | 中文字幕 在线观看 | 91精品国产自产在线老师啪 | 国产精品一区二 | 波霸ol一区二区 | 欧美日韩久久精品 | 国产99久久精品一区二区永久免费 | 午夜精品一区二区三区在线 | 欧美a级成人淫片免费看 | 男女免费网站 | 久久精品国产精品青草 | 亚州精品天堂中文字幕 | 91高清在线视频 | 久久大 | 亚洲一区二区在线 | 宅男噜噜噜66一区二区 | 日韩在线精品视频 | 91久色 | 亚洲国产精品一区 | 欧美色综合一区二区三区 | 91精品国产综合久久久久久漫画 | 免费国产黄网站在线观看视频 | 少妇黄色 | 日本久久综合网 | 噜噜噜噜狠狠狠7777视频 | 亚洲成人精品一区二区 | 国产精品2 | 欧美日韩综合精品 |