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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10918|回復: 8
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:217269 發(fā)表于 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   //寫數(shù)據(jù)地址
  12. #define AddRd 0x91   //讀數(shù)據(jù)地址
  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; //數(shù)碼管的位選信號
  23. void delay1 (void)//關(guān)閉數(shù)碼管延時程序
  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;   //發(fā)送起始條件的數(shù)據(jù)信號
  40.   _Nop();
  41.   SCL=1;
  42.   _Nop();    //起始條件建立時間大于4.7us,延時
  43.   _Nop();
  44.   _Nop();
  45.   _Nop();
  46.   _Nop();   
  47.   SDA=0;     //發(fā)送起始信號
  48.   _Nop();    //起始條件鎖定時間大于4μ
  49.   _Nop();
  50.   _Nop();
  51.   _Nop();
  52.   _Nop();      
  53.   SCL=0;    //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
  54.   _Nop();
  55.   _Nop();
  56. }
  57. /*------------------------------------------------
  58.                     結(jié)束總線
  59. ------------------------------------------------*/
  60. void Stop_I2c()
  61. {
  62.   SDA=0;    //發(fā)送結(jié)束條件的數(shù)據(jù)信號
  63.   _Nop();   //發(fā)送結(jié)束條件的時鐘信號
  64.   SCL=1;    //結(jié)束條件建立時間大于4μ
  65.   _Nop();
  66.   _Nop();
  67.   _Nop();
  68.   _Nop();
  69.   _Nop();
  70.   SDA=1;    //發(fā)送I2C總線結(jié)束信號
  71.   _Nop();
  72.   _Nop();
  73.   _Nop();
  74.   _Nop();
  75. }




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

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

  99.     _Nop();
  100.     _Nop();
  101.     SDA=1;               //8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位
  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.                  字節(jié)數(shù)據(jù)傳送函數(shù)               
  116. 函數(shù)原型: unsigned char  RcvByte();
  117. 功能:  用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應答信號),
  118.      發(fā)完后請用應答函數(shù)。  
  119. ------------------------------------------------------------------*/        
  120. unsigned char  RcvByte()
  121. {
  122.   unsigned char retc;
  123.   unsigned char BitCnt;

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



  148. /*----------------------------------------------------------------
  149.                      應答子函數(shù)
  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總線以便繼續(xù)接收
  165.   _Nop();
  166.   _Nop();   
  167. }*/
  168. /*----------------------------------------------------------------
  169.                      非應答子函數(shù)
  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總線以便繼續(xù)接收
  185.   _Nop();
  186.   _Nop();   
  187. }

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


  189. //////////////以下是LCD1602驅(qū)動程序////////////////

  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驅(qū)動程序////////////////



  262. //////////////////以下是DS18B20驅(qū)動程序////////////////

  263. //////////////////以上是DS18B20驅(qū)動程序////////////////




  264. /*定義數(shù)字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;//關(guān)掉數(shù)碼管的位選信號。阻止數(shù)碼管受到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);//值取差值,用于顯示光強越小,數(shù)值越小

  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轉(zhuǎn)值程序
  301. 輸入?yún)?shù) Chl 表示需要轉(zhuǎn)換的通道,范圍從0-3
  302. 返回值范圍0-255
  303. ------------------------------------------------*/
  304. unsigned char ReadADC(unsigned char Chl)
  305. {
  306.    unsigned char Val;
  307.    Start_I2c();               //啟動總線
  308.    SendByte(AddWr);             //發(fā)送器件地址
  309.      if(ack==0)return(0);
  310.    SendByte(0x40|Chl);            //發(fā)送器件子地址
  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();                 //發(fā)送非應位
  317.    Stop_I2c();                  //結(jié)束總線
  318.   return(Val);
  319. }
復制代碼

51開發(fā)板使用手冊.pdf

12.32 MB, 下載次數(shù): 64, 下載積分: 黑幣 -5

(51開發(fā)板)

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

使用道具 舉報

沙發(fā)
ID:278864 發(fā)表于 2018-1-23 11:31 | 只看該作者
這個適合普中科技的板子么,能不能發(fā)我下,
回復

使用道具 舉報

板凳
ID:278864 發(fā)表于 2018-1-23 11:36 | 只看該作者
可以的話加我下,謝謝773783173
回復

使用道具 舉報

地板
ID:246078 發(fā)表于 2018-1-23 13:55 | 只看該作者
謝謝分享
回復

使用道具 舉報

5#
ID:246078 發(fā)表于 2018-1-23 13:56 | 只看該作者
謝謝分享
回復

使用道具 舉報

6#
ID:260785 發(fā)表于 2018-1-23 15:23 | 只看該作者
謝謝為壇子付出和貢獻,付出是有回報的
回復

使用道具 舉報

7#
ID:358960 發(fā)表于 2018-6-26 06:14 | 只看該作者

謝謝分享
回復

使用道具 舉報

8#
ID:371629 發(fā)表于 2018-7-17 23:04 | 只看該作者
下載了,學習一下,不會的可能要請教一下
回復

使用道具 舉報

9#
ID:802594 發(fā)表于 2020-7-13 15:18 | 只看該作者
十分有用感謝
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频一区 | 黄色片免费看视频 | 久热中文字幕 | 在线免费看黄 | 天天色天天射天天干 | 中文字幕国| 亚洲视频欧美视频 | 免费看一区二区三区 | 9久久精品 | 亚洲成人av | 99色在线| 欧美一二三区 | 韩日在线视频 | 亚洲精品福利在线 | 91天堂| 成人在线看片 | 精品国产乱码久久久久久老虎 | 亚洲福利一区二区 | 免费高清av | 久久大陆| 亚洲天堂中文字幕 | 国产精品一区二区三区四区 | 一级网站 | 国产视频1 | 欧美激情欧美激情在线五月 | 性生生活大片免费看视频 | 亚洲一级二级三级 | 一久久久 | 91色网站 | 草草草草视频 | 夏同学福利网 | 亚洲一区二区精品视频 | 国产精品日日摸夜夜添夜夜av | 91亚洲国产成人久久精品网站 | 欧美操操操 | 亚洲vs天堂| 紧缚调教一区二区三区视频 | 超碰在线播 | 在线视频91 | 中文字幕av一区 | 日本一区二区三区四区 |