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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10884|回復: 8
收起左側

AD采集光敏電阻值1602顯示 單片機程序 附帶開發板資料

[復制鏈接]
ID:217269 發表于 2017-7-6 08:53 | 顯示全部樓層 |閱讀模式
  1. /********************************************

  2. 讀取DS18B20溫度,通過LCD1602顯示出來
  3. 第一行: 實時溫度值
  4. 第二行: 最大值和最小值
  5. ********************************************/



  6. /*頭文件*/
  7. #include <reg52.h>      
  8. #include <intrins.h>
  9. #define uint unsigned int
  10. #define uchar unsigned char

  11. #define AddWr 0x90   //寫數據地址
  12. #define AddRd 0x91   //讀數據地址
  13. unsigned char ReadADC(unsigned char Chl);                                 
  14. bit ack;                      //應答標志位

  15. sbit SDA=P2^0;
  16. sbit SCL=P2^1;

  17. sbit lcd_rs_port = P3^5;  /*定義LCD控制端口*/
  18. sbit lcd_rw_port = P3^6;
  19. sbit lcd_en_port = P3^4;
  20. #define lcd_data_port P0
  21. ////////////////////////////////////////
  22. sbit WELA=P2^7; //數碼管的位選信號
  23. void delay1 (void)//關閉數碼管延時程序
  24. {
  25.         int k;
  26.         for (k=0; k<1000; k++);

  27. }

  28. void _Nop(void)//I2C延時程序
  29. {
  30.         int k;
  31.         for (k=0; k<10; k++);

  32. }

  33. //////////////////////////////////////


  34. /*------------------------------------------------
  35.                     啟動總線
  36. ------------------------------------------------*/
  37. void Start_I2c()
  38. {
  39.   SDA=1;   //發送起始條件的數據信號
  40.   _Nop();
  41.   SCL=1;
  42.   _Nop();    //起始條件建立時間大于4.7us,延時
  43.   _Nop();
  44.   _Nop();
  45.   _Nop();
  46.   _Nop();   
  47.   SDA=0;     //發送起始信號
  48.   _Nop();    //起始條件鎖定時間大于4μ
  49.   _Nop();
  50.   _Nop();
  51.   _Nop();
  52.   _Nop();      
  53.   SCL=0;    //鉗住I2C總線,準備發送或接收數據
  54.   _Nop();
  55.   _Nop();
  56. }
  57. /*------------------------------------------------
  58.                     結束總線
  59. ------------------------------------------------*/
  60. void Stop_I2c()
  61. {
  62.   SDA=0;    //發送結束條件的數據信號
  63.   _Nop();   //發送結束條件的時鐘信號
  64.   SCL=1;    //結束條件建立時間大于4μ
  65.   _Nop();
  66.   _Nop();
  67.   _Nop();
  68.   _Nop();
  69.   _Nop();
  70.   SDA=1;    //發送I2C總線結束信號
  71.   _Nop();
  72.   _Nop();
  73.   _Nop();
  74.   _Nop();
  75. }




  76. /*----------------------------------------------------------------
  77.                  字節數據傳送函數               
  78. 函數原型: void  SendByte(unsigned char c);
  79. 功能:  將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
  80.      此狀態位進行操作.(不應答或非應答都使ack=0 假)     
  81.      發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
  82. ------------------------------------------------------------------*/
  83. void  SendByte(unsigned char c)
  84. {
  85. unsigned char BitCnt;

  86. for(BitCnt=0;BitCnt<8;BitCnt++)  //要傳送的數據長度為8位
  87.     {
  88.      if((c<<BitCnt)&0x80)SDA=1;   //判斷發送位
  89.        else  SDA=0;               
  90.      _Nop();
  91.      SCL=1;               //置時鐘線為高,通知被控器開始接收數據位
  92.       _Nop();
  93.       _Nop();             //保證時鐘高電平周期大于4μ
  94.       _Nop();
  95.       _Nop();
  96.       _Nop();         
  97.      SCL=0;
  98.     }

  99.     _Nop();
  100.     _Nop();
  101.     SDA=1;               //8位發送完后釋放數據線,準備接收應答位
  102.     _Nop();
  103.     _Nop();   
  104.     SCL=1;
  105.     _Nop();
  106.     _Nop();
  107.     _Nop();
  108.     if(SDA==1)ack=0;     
  109.        else ack=1;        //判斷是否接收到應答信號
  110.     SCL=0;
  111.     _Nop();
  112.     _Nop();
  113. }







  114. /*----------------------------------------------------------------
  115.                  字節數據傳送函數               
  116. 函數原型: unsigned char  RcvByte();
  117. 功能:  用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
  118.      發完后請用應答函數。  
  119. ------------------------------------------------------------------*/        
  120. unsigned char  RcvByte()
  121. {
  122.   unsigned char retc;
  123.   unsigned char BitCnt;

  124.   retc=0;
  125.   SDA=1;             //置數據線為輸入方式
  126.   for(BitCnt=0;BitCnt<8;BitCnt++)
  127.       {
  128.         _Nop();           
  129.         SCL=0;       //置時鐘線為低,準備接收數據位
  130.         _Nop();
  131.         _Nop();      //時鐘低電平周期大于4.7us
  132.         _Nop();
  133.         _Nop();
  134.         _Nop();
  135.         SCL=1;       //置時鐘線為高使數據線上數據有效
  136.         _Nop();
  137.         _Nop();
  138.         retc=retc<<1;
  139.         if(SDA==1)retc=retc+1; //讀數據位,接收的數據位放入retc中
  140.         _Nop();
  141.         _Nop();
  142.       }
  143.   SCL=0;   
  144.   _Nop();
  145.   _Nop();
  146.   return(retc);
  147. }



  148. /*----------------------------------------------------------------
  149.                      應答子函數
  150. 原型:  void Ack_I2c(void);

  151. ----------------------------------------------------------------*/
  152. /*void Ack_I2c(void)
  153. {

  154.   SDA=0;     
  155.   _Nop();
  156.   _Nop();
  157.   _Nop();      
  158.   SCL=1;
  159.   _Nop();
  160.   _Nop();              //時鐘低電平周期大于4μ
  161.   _Nop();
  162.   _Nop();
  163.   _Nop();  
  164.   SCL=0;               //清時鐘線,鉗住I2C總線以便繼續接收
  165.   _Nop();
  166.   _Nop();   
  167. }*/
  168. /*----------------------------------------------------------------
  169.                      非應答子函數
  170. 原型:  void NoAck_I2c(void);

  171. ----------------------------------------------------------------*/
  172. void NoAck_I2c(void)
  173. {

  174.   SDA=1;
  175.   _Nop();
  176.   _Nop();
  177.   _Nop();      
  178.   SCL=1;
  179.   _Nop();
  180.   _Nop();              //時鐘低電平周期大于4μ
  181.   _Nop();
  182.   _Nop();
  183.   _Nop();  
  184.   SCL=0;                //清時鐘線,鉗住I2C總線以便繼續接收
  185.   _Nop();
  186.   _Nop();   
  187. }

  188. /////////////////////////////////////


  189. //////////////以下是LCD1602驅動程序////////////////

  190. void lcd_delay(uchar ms) /*LCD1602 延時*/
  191. {
  192.     uchar j;
  193.     while(ms--){
  194.         for(j=0;j<250;j++)
  195.             {;}
  196.         }   
  197. }


  198. void lcd_busy_wait() /*LCD1602 忙等待*/
  199. {
  200.     lcd_rs_port = 0;
  201.     lcd_rw_port = 1;
  202.     lcd_en_port = 1;
  203.     lcd_data_port = 0xff;
  204.     while (lcd_data_port&0x80);
  205.     lcd_en_port = 0;

  206. }


  207. void lcd_command_write(uchar command) /*LCD1602 命令字寫入*/
  208. {
  209.     lcd_busy_wait();
  210.     lcd_rs_port = 0;
  211.     lcd_rw_port = 0;
  212.     lcd_en_port = 0;
  213.     lcd_data_port = command;
  214.     lcd_en_port = 1;
  215.     lcd_en_port = 0;     
  216. }



  217. void lcd_system_reset() /*LCD1602 初始化*/
  218. {
  219.     lcd_delay(20);
  220.     lcd_command_write(0x38);
  221.     lcd_delay(100);
  222.     lcd_command_write(0x38);
  223.     lcd_delay(50);
  224.     lcd_command_write(0x38);
  225.     lcd_delay(10);
  226.     lcd_command_write(0x08);
  227.     lcd_command_write(0x01);
  228.     lcd_command_write(0x06);
  229.     lcd_command_write(0x0c);
  230. }



  231. void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /*LCD1602 字符寫入*/
  232. {
  233.     x_pos &= 0x0f; /* X位置范圍 0~15 */
  234.     y_pos &= 0x01; /* Y位置范圍 0~ 1 */
  235.     if(y_pos==1) x_pos += 0x40;
  236.     x_pos += 0x80;
  237.     lcd_command_write(x_pos);
  238.     lcd_busy_wait();
  239.     lcd_rs_port = 1;
  240.     lcd_rw_port = 0;
  241.     lcd_en_port = 0;
  242.     lcd_data_port = lcd_dat;
  243.     lcd_en_port = 1;
  244.     lcd_en_port = 0;
  245. }



  246. void lcd_bad_check() /*LCD1602 壞點檢查*/
  247. {
  248.     char i,j;
  249.     for(i=0;i<2;i++){
  250.         for(j=0;j<16;j++) {
  251.             lcd_char_write(j,i,0xff);
  252.             }
  253.         }
  254.     lcd_delay(200);
  255.     lcd_delay(200);
  256.         lcd_delay(200);
  257.         lcd_delay(100);
  258.         lcd_delay(200);
  259.     lcd_command_write(0x01); /* clear lcd disp */
  260. }
  261. //////////////////以上是LCD1602驅動程序////////////////



  262. //////////////////以下是DS18B20驅動程序////////////////

  263. //////////////////以上是DS18B20驅動程序////////////////




  264. /*定義數字ascii編碼*/
  265. unsigned char mun_char_table[]={"0123456789abcdef"};

  266. unsigned char temp_table[] ={"light:   "};




  267. /*1MS為單位的延時程序*/
  268. void delay_1ms(uchar x)
  269. {
  270.     uchar j;
  271.     while(x--){
  272.         for(j=0;j<125;j++)
  273.             {;}
  274.         }   
  275. }

  276. main()
  277. {        
  278.         
  279.         unsigned int i=0;

  280.         

  281.         lcd_system_reset(); /*LCD1602 初始化*/
  282. ////////////////////////////////////////////////////////////////
  283.         P0=0X00;//關掉數碼管的位選信號。阻止數碼管受到P0口信號的影響。
  284.         delay1();
  285.         WELA=1;
  286.         delay1();
  287.         WELA=0;
  288. ////////////////////////////////////////////////////////////////
  289.         lcd_bad_check(); /*LCD1602 壞點檢查*/
  290.                 for (i=0;i<9;i++) lcd_char_write(i,0,temp_table[i]);  


  291.         while(1){
  292.         i=255-ReadADC(1);//值取差值,用于顯示光強越小,數值越小

  293.                 lcd_char_write(7,0,mun_char_table[i/100]);  /*把溫度顯示出來*/
  294.                 lcd_char_write(8,0,mun_char_table[i%100/10]);
  295.                 lcd_char_write(9,0,mun_char_table[i%10]);
  296.                 delay_1ms(100);
  297.                 }
  298. }
  299. /*------------------------------------------------
  300.              讀AD轉值程序
  301. 輸入參數 Chl 表示需要轉換的通道,范圍從0-3
  302. 返回值范圍0-255
  303. ------------------------------------------------*/
  304. unsigned char ReadADC(unsigned char Chl)
  305. {
  306.    unsigned char Val;
  307.    Start_I2c();               //啟動總線
  308.    SendByte(AddWr);             //發送器件地址
  309.      if(ack==0)return(0);
  310.    SendByte(0x40|Chl);            //發送器件子地址
  311.      if(ack==0)return(0);
  312.    Start_I2c();
  313.    SendByte(AddWr+1);
  314.       if(ack==0)return(0);
  315.    Val=RcvByte();
  316.    NoAck_I2c();                 //發送非應位
  317.    Stop_I2c();                  //結束總線
  318.   return(Val);
  319. }
復制代碼

51開發板使用手冊.pdf

12.32 MB, 下載次數: 64, 下載積分: 黑幣 -5

(51開發板)

回復

使用道具 舉報

ID:278864 發表于 2018-1-23 11:31 | 顯示全部樓層
這個適合普中科技的板子么,能不能發我下,
回復

使用道具 舉報

ID:278864 發表于 2018-1-23 11:36 | 顯示全部樓層
可以的話加我下,謝謝773783173
回復

使用道具 舉報

ID:246078 發表于 2018-1-23 13:55 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:246078 發表于 2018-1-23 13:56 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:260785 發表于 2018-1-23 15:23 | 顯示全部樓層
謝謝為壇子付出和貢獻,付出是有回報的
回復

使用道具 舉報

ID:358960 發表于 2018-6-26 06:14 | 顯示全部樓層

謝謝分享
回復

使用道具 舉報

ID:371629 發表于 2018-7-17 23:04 | 顯示全部樓層
下載了,學習一下,不會的可能要請教一下
回復

使用道具 舉報

ID:802594 發表于 2020-7-13 15:18 | 顯示全部樓層
十分有用感謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 观看毛片 | 精品视频免费 | 久久视频精品在线 | 国产一区二区 | 国产精品国产自产拍高清 | 91中文字幕在线观看 | 精品久久久久国产免费第一页 | 蜜桃视频一区二区三区 | 99久久久久久久久 | 狠狠插狠狠操 | 亚洲 欧美 日韩 在线 | 日韩欧美一区二区三区四区 | 久久综合伊人一区二区三 | 国产一区二区欧美 | 无码一区二区三区视频 | 久久久久亚洲 | 日韩三区 | 国产高清视频在线 | 日韩成人影院在线观看 | 精品久久久久久久久久 | 欧美精品电影一区 | 欧美5区| 久久久久久国产精品免费免费狐狸 | 亚洲欧美一区二区三区在线 | 久久99久久99精品免视看婷婷 | 欧美精品网 | 成人免费av在线 | 黄色大片免费网站 | 天天操天天干天天曰 | 欧美一二区 | 精品三级在线观看 | 精品国产一区二区三区性色 | 国产精品午夜电影 | av网站在线看 | 日韩一及片 | 亚洲国产精品99久久久久久久久 | 久久久久一区 | 怡红院怡春院一级毛片 | 国产精品综合久久 | av黄色在线观看 | 色久五月 |