找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4110|回复: 5
打印 上一主题 下一主题
收起左侧

GP2Y10单片机驱动程序和资料下载

[复制链接]
跳转到指定楼层
楼主
gp2y10的驱动程序
晶振:12.000MHz

传感器接口:
1、6引脚接+5V电源
2、4引脚接GND
3引脚接PWM信号——T0CLKO=P3.4或PWM00=P2.0
5引脚接AD引脚——单片机的P1.0引脚
显示接口:
J3接LCD1602
参考文献:
《集体智慧编程》
《机器学习实战》

单片机源程序:
  1. /********************************************************************************
  2. *  描述:                LCD1602 滚动显示                                       *
  3. * 显示方式:                                                                   *
  4. * 1、从左到右逐字显示,闪动二次,清屏。                                        *
  5. * 2、再从右到左逐字显示,闪动二次,清屏。                                      *
  6. * 3、周期性地重复上述显示方式。                                                *                           
  7. ********************************************************************************/
  8. #include <reg51.h>        //51寄存器文件
  9. #include <intrins.h>
  10. /**********Define Variable**********/
  11. #define ulong unsigned long
  12. #define uint  unsigned int
  13. #define uchar unsigned char
  14. #define bool  bit       
  15. /***Define ADC operation const for ADC_CONTR***/
  16. #define ADC_POWER   0x80
  17. #define ADC_FLAG    0x10
  18. #define ADC_START   0x08
  19. #define ADC_SPEEDLL 0x00
  20. #define ADC_SPEEDL  0x20
  21. #define ADC_SPEEDH  0x40
  22. #define ADC_SPEEDHH 0x60
  23. //ADRJ位复位时为0,此时AD值格式:
  24. //取10位时,(ADC_RES[7:0],ADC_RES[1:0])=1024*Vin/Vcc
  25. //取8位时,(ADC_RES[7:0])=256*Vin/Vcc
  26. //ADRJ为1,此时AD值格式:
  27. //取10位时,(ADC_RES[1:0],ADC_RES[7:0])=1024*Vin/Vcc

  28. /*******Declare SFR associated with the ADC****/
  29. sfr ADC_CONTR=0xBC;
  30. sfr ADC_RES=0xBD;
  31. sfr ADC_LOW2=0xBE;
  32. sfr P1ASF=0x9D;
  33. /*****Declare SFR associated with  the P1******/
  34. sfr P1M1=0x91;
  35. sfr P1M0=0x92;
  36. /***Declare SFR associated with  the Timer****/
  37. sfr  AUXR=0x8E;
  38. sfr  INT_CLKO=0x8F;
  39. sbit T0CLKO=P3^4;
  40. sbit PWM00=P2^0;
  41. /*****Declare SFR associated with  the PCA*****/
  42. sfr  CCON=0xD8;
  43. sbit CCF0=CCON^0;
  44. sbit CCF1=CCON^1;
  45. sbit CR=CCON^6;
  46. sbit CF=CCON^7;
  47. sfr  CMOD=0xD9;
  48. sfr  CL=0xE9;
  49. sfr  CH=0xF9;
  50. sfr  CCAPM0=0xDA;
  51. sfr  CCAP0L=0xEA;
  52. sfr  CCAP0H=0xFA;
  53. sfr  CCAPM1=0xDB;
  54. sfr  CCAP1L=0xEB;
  55. sfr  CCAP1H=0xFB;
  56. sfr  PCAPWM0=0xF2;
  57. sfr  PCAPWM1=0xF3;
  58. /****1602 LCD****************/
  59. sbit LCD_RS = P2^6;  //复位端            
  60. sbit LCD_RW = P2^5;         //写数据端
  61. sbit LCD_EP = P2^7;         //使能端
  62. uchar display1[6];
  63. bit flag;
  64. uint addata;
  65. /****************延时函数************************/       
  66. delay(uint ms)
  67. {                    //延时子程序
  68.         uint i;
  69.         while(ms--)
  70.         {
  71.                 for(i = 0; i< 250; i++)
  72.                 {
  73.                         _nop_();          //空执行
  74.                         _nop_();
  75.                         _nop_();
  76.                         _nop_();
  77.                 }
  78.         }
  79. }
  80. /************************************************/
  81. void Delay880us()                //@12.000MHz
  82. {
  83.         unsigned char i, j;

  84.         i = 11;
  85.         j = 66;
  86.         do
  87.         {
  88.                 while (--j);
  89.         } while (--i);
  90. }
  91. /****************侧忙函数************************/               
  92. bool lcd_bz()
  93. {                        
  94.         bool result;
  95.         LCD_RS = 0;
  96.         LCD_RW = 1;
  97.         LCD_EP = 1;
  98.         _nop_();
  99.         _nop_();
  100.         _nop_();
  101.         _nop_();
  102.         result = (bool)(P0 & 0x80);         //检测P0最高位是否为1
  103.         LCD_EP = 0;
  104.         return result;//返回侧忙结果
  105. }

  106. /****************写命令函数************************/       
  107. lcd_wcmd(uchar cmd)
  108. {                          // 写入指令数据到LCD
  109.         while(lcd_bz());
  110.         LCD_RS = 0;
  111.         LCD_RW = 0;
  112.         LCD_EP = 0;
  113.         _nop_();
  114.         _nop_();
  115.         P0 = cmd; //将8位指令通过P0口传给1602
  116.         _nop_();
  117.         _nop_(); //用于产生一个脉冲宽度
  118.         _nop_();
  119.         _nop_();
  120.         LCD_EP = 1;
  121.         _nop_();
  122.         _nop_();
  123.         _nop_();
  124.         _nop_();
  125.         LCD_EP = 0;  
  126. }
  127.        
  128. lcd_pos(uchar pos)
  129. {                          //设定显示位置
  130.         lcd_wcmd(pos | 0x80);
  131. }

  132. /****************写数据函数************************/       
  133. lcd_wdat(uchar dat)
  134. {                   //写入字符显示数据到LCD
  135.         while(lcd_bz());
  136.         LCD_RS = 1;
  137.         LCD_RW = 0;
  138.         LCD_EP = 0;
  139.         P0 = dat;  //将8位数据通过P0口传给1602
  140.         _nop_();
  141.         _nop_();   //用于产生一个脉冲宽度
  142.         _nop_();
  143.         _nop_();
  144.         LCD_EP = 1;
  145.         _nop_();
  146.         _nop_();
  147.         _nop_();
  148.         _nop_();
  149.         LCD_EP = 0;
  150. }
  151. /****************LCD 初始化************************/       
  152. lcd_init()
  153. {                   //LCD初始化设定
  154.         lcd_wcmd(0x38);     //16*2显示,5*7点阵,8位数据
  155.         delay(1);
  156.         lcd_wcmd(0x0c);     //显示开,关光标
  157.         delay(1);
  158.         lcd_wcmd(0x06);     //移动光标
  159.         delay(1);
  160.         lcd_wcmd(0x01);     //清除LCD的显示内容
  161.         delay(1);
  162. }
  163. /*****************Initial ADC sfr***************/
  164. void InitADC()
  165. {
  166.         //P1ASF=0xff;//Open 8 channels ADC function
  167.         P1ASF=0x01;//Open P1.0 channels ADC function
  168.         ADC_RES=0;//Clear previous result
  169.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
  170.         delay(2);//ADC power-on and delay
  171. }
  172. /****************Get ADC result*****************/
  173. uchar GetADCResult(uchar ch)
  174. {
  175.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
  176.         _nop_();//Must wait before inqurity
  177.         _nop_();
  178.         _nop_();
  179.         _nop_();
  180.         while(!(ADC_CONTR&ADC_FLAG));//Wait complete flag
  181.         ADC_CONTR&=~ADC_FLAG;//Close ADC

  182.         return ADC_RES;
  183. }

  184. void tm0() interrupt 1 using 1
  185. {
  186.         flag=!flag;
  187.         if(flag)
  188.         {
  189.                 TL0=0xC0;
  190.                 TH0=0xFE;
  191.                 PWM00=1;
  192.         }
  193.         else
  194.         {
  195.                 TL0=0x30;
  196.                 TH0=0xDA;
  197.                 PWM00=0;
  198.                 Delay880us();
  199.                 addata=GetADCResult(0);
  200.         }
  201. }


  202. /****************主函数****************************/
  203. main()
  204. {
  205.         uchar i;
  206.         //uint addata;
  207.         P1M1=P1M1|0x01;
  208.         P1M0=P1M0|0x00;//P1.0为输入口
  209.         lcd_init();// 初始化LCD
  210.         InitADC();//初始化ADC
  211.         //AUXR=0x80;//定时器0设置为1T模式
  212.         INT_CLKO=0x01;//使能定时器0时钟输出使能
  213.         TMOD=0x01;//设置定时器0为模式1(16位自动重装载模式)
  214.         TL0=0x30;
  215.         TH0=0xDA;
  216.         T0CLKO=0;
  217.         flag=0;
  218.         TR0=1;
  219.         ET0=1;
  220.         EA=1;
  221.         delay(10);
  222.         addata=998;
  223.         display1[0]=addata/1000+0x30;
  224.         addata=addata%1000;
  225.         display1[1]=addata/100+0x30;
  226.         addata=addata%100;
  227.         display1[2]=addata/10+0x30;       
  228.         display1[3]=addata%10+0x30;
  229.         lcd_wcmd(0x06);//向右移动光标
  230.         lcd_pos(0);//设置显示位置为第一行的第1个字符
  231.         for(i=0;i<4;i++)
  232.         {
  233.                 lcd_wdat(display1[i]);
  234.                 delay(30);//控制两字之间显示速度
  235.         }
  236.         delay(1500);//控制停留时间       
  237.         lcd_wcmd(0x01);//清除LCD的显示内容
  238.         while(1)
  239.         {
  240.                 //addata=GetADCResult(0);//8为AD转换
  241.                 //addata=(addata<<2)+ADC_LOW2;//10位AD转换
  242.                 display1[0]=addata/1000+0x30;
  243.                 addata=addata%1000;
  244.                 display1[1]=addata/100+0x30;
  245.                 addata=addata%100;
  246.                 display1[2]=addata/10+0x30;       
  247.                 display1[3]=addata%10+0x30;
  248.                 lcd_wcmd(0x06);//向右移动光标
  249.                 lcd_pos(0);//设置显示位置为第一行的第1个字符
  250.                 for(i=0;i<4;i++)
  251.                 {
  252.                         lcd_wdat(display1[i]);
  253.                         delay(30);//控制两字之间显示速度
  254.                 }
  255.                 delay(500);//控制停留时间       
  256.                 lcd_wcmd(0x01);//清除LCD的显示内容
  257.         }
  258. }

  259. /**************************************************/
  260. /*********test T0 PWM*******
  261. main()
  262. {
  263.         //AUXR=0x80;//定时器0设置为1T模式
  264.         INT_CLKO=0x01;//使能定时器0时钟输出使能
  265.         TMOD=0x01;//设置定时器0为模式1(16位自动重装载模式)
  266.         TL0=0x30;
  267.         TH0=0xDA;
  268.         T0CLKO=0;
  269.         flag=0;
  270.         TR0=1;
  271.         ET0=1;
  272.         EA=1;
  273.         while(1)
  274.         {
  275.                 ;
  276.         }
  277. }
  278. ***************************/
  279. /***********test PWM*************
  280. main()
  281. {
  282.         CCON=0;
  283.         CL=0;
  284.         CH=0;
  285.         CMOD=0x02;
  286.        
  287.         CCAP0H=0x80;
  288.         CCAP0L=0x80;
  289.         CCAPM0=0x42;
  290.         ***************************
  291.         //实测结果与程序相符
  292.         //Focs=12MHz,Fpca=(1/2)*Focs=6MHz,
  293.         //Fpwm=

  294. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
testGP2Y10.rar (169.42 KB, 下载次数: 52)

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

使用道具 举报

沙发
ID:229992 发表于 2017-9-11 20:30 | 只看该作者
谢谢大神
回复

使用道具 举报

板凳
ID:432418 发表于 2018-11-24 17:02 | 只看该作者
求助 为什么我烧录进去lcd显示出来的是0946这四个数呢?
回复

使用道具 举报

地板
ID:432418 发表于 2018-11-24 17:15 | 只看该作者
楼主 为什么我烧录进单片机之后 lcd只显示0946四个数字啊?
回复

使用道具 举报

5#
ID:644316 发表于 2019-11-19 08:59 | 只看该作者
求完整源码
回复

使用道具 举报

6#
ID:472431 发表于 2019-12-19 23:40 | 只看该作者
布吉岛 发表于 2018-11-24 17:15
楼主 为什么我烧录进单片机之后 lcd只显示0946四个数字啊?

解决了吗?可以的话请您发到491222058@qq.com
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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