找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10422|回复: 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开发板)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:278864 发表于 2018-1-23 11:31 | 只看该作者
这个适合普中科技的板子么,能不能发我下,
回复

使用道具 举报

板凳
ID:278864 发表于 2018-1-23 11:36 | 只看该作者
可以的话加我下,谢谢773783173
回复

使用道具 举报

地板
ID:246078 发表于 2018-1-23 13:55 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:246078 发表于 2018-1-23 13:56 | 只看该作者
谢谢分享
回复

使用道具 举报

6#
ID:260785 发表于 2018-1-23 15:23 | 只看该作者
谢谢为坛子付出和贡献,付出是有回报的
回复

使用道具 举报

7#
ID:358960 发表于 2018-6-26 06:14 | 只看该作者

谢谢分享
回复

使用道具 举报

8#
ID:371629 发表于 2018-7-17 23:04 | 只看该作者
下载了,学习一下,不会的可能要请教一下
回复

使用道具 举报

9#
ID:802594 发表于 2020-7-13 15:18 | 只看该作者
十分有用感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表