找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1401|回复: 0
收起左侧

分享一份超声波测距LCD12864显示的单片机源码

[复制链接]
ID:235638 发表于 2018-10-12 18:30 | 显示全部楼层 |阅读模式
分享一份超声波测距LCD12864显示!!!!!

单片机源程序如下:
  1. /******************************************************************************/
  2. /*  Name:  LCD12864(St7920/St7921)+超声波测距模块+STC89C52                    */
  3. /*  HC-SR04 超声波测距模块 DEMO 程序                                                                              */
  4. /*  晶振:11.0592M                                                            */
  5.                                                   */
  6. /*  接线:模块TRIG接 P1.2  ECH0 接P1.1                                                                                  */
  7. /*      RS(CS)    接  P3.3;                                                                                                       */
  8. /*      RW(SID)   接  P3.4;                                                                                              */
  9. /*      E(SCLK)   接  P3.5;                                                                                                  */
  10. /*      PSB       接  GND 串行模式                                                                                      */
  11. /******************************************************************************/
  12.     #include   <AT89X51.H>
  13.         #include   <intrins.h>       
  14. //引脚定义
  15.     sbit     RX    =  P1 ^ 1;
  16.     sbit     TX    =  P1 ^ 2;
  17.     sbit     CS    =  P3 ^ 3;        //片选 高电平有效 单片LCD使用时可固定高电平
  18.     sbit     SID   =  P3 ^ 4;        //数据
  19.     sbit     SCLK  =  P3 ^ 5;        //时钟

  20. //Function Definition 函数声明
  21. void Delay(int num);
  22. void Init_DS18B20(void);
  23. unsigned char ReadOneChar(void);
  24. void WriteOneChar(unsigned char dat);
  25. unsigned int ReadTemperature(void);
  26. void clock_out(unsigned char dd);
  27. unsigned char clock_in(void);
  28. unsigned char read_clock(unsigned char ord);
  29. void write_clock(unsigned char ord, unsigned char dd);
  30. void Disp(void);
  31. void id_case1_key(void);
  32. void id_case2_key(void);
  33. void Set_time(unsigned char sel,bit sel_1);
  34. void Timer0_Init(void);
  35. void Init_1302(void);
  36. void Set_Bell(unsigned char sel, bit sel_1);
  37. void Bell(void);
  38. //12864
  39. void Write_char(bit start, unsigned char ddata);
  40. void Send_byte(unsigned char bbyte);
  41. void Delaynms(unsigned int di);
  42. void Lcd_init(void);
  43. void Disp_img(unsigned char *img);
  44. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
  45. void LCD_set_xy( unsigned char x, unsigned char y );
  46. unsigned char code num[]={"0123456789 :.-"};
  47. unsigned char code waves[]={"超声波测距系统"};
  48. unsigned char code znwk[] ={"智能微控工作室"};
  49. unsigned char code CM[] =  {"M"};
  50. unsigned int  time=0;
  51.          long S=0;
  52.          bit  flag =0;
  53. unsigned char disbuff[4]           ={ 0,0,0,0,};
  54. unsigned char code logo[]={  
  55. /*--  调入了一幅图像:logo.bmp  -- */
  56. /*--  宽度x高度=128x64 欢迎使用本产品LOGO --*/
  57. /*--  调入了一幅图像:C:\Documents and Settings\lwd\桌面\新建文件夹\X.bmp  --*/
  58. /*--  宽度x高度=128x64  --*/
  59. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  60. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  61. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  62. 0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,
  63. 0x00,0x00,0x00,0xE0,0x00,0x00,0x0C,0x00,0x00,0x40,0x70,0x00,0x00,0x00,0x80,0x00,
  64. 0x00,0x00,0x00,0xE0,0x00,0x00,0x1E,0x00,0x00,0x60,0x70,0x00,0x00,0x0F,0xE0,0x00,
  65. 0x00,0x00,0x01,0xC0,0x00,0x60,0x3C,0x00,0x00,0xE0,0x60,0x00,0x1F,0xFF,0xE0,0x00,
  66. 0x00,0x00,0x03,0x80,0x00,0x70,0x70,0x40,0x00,0xE0,0x7E,0x00,0x1F,0xE0,0xC0,0x00,
  67. 0x00,0x00,0x03,0x00,0x00,0x73,0xC3,0xF0,0x01,0xC3,0xFC,0x00,0x38,0xE1,0xC0,0x00,
  68. 0x00,0x03,0xC6,0x3C,0x00,0x33,0x9F,0xF0,0x03,0x8F,0xC0,0x00,0x30,0xC1,0xC0,0x00,
  69. 0x00,0x3F,0xEF,0xFE,0x00,0x03,0x1C,0xE0,0x07,0x01,0xCC,0x00,0x31,0xF1,0x80,0x00,
  70. 0x00,0x79,0xDF,0xBC,0x00,0x06,0x18,0xC0,0x0E,0x01,0xFE,0x00,0x77,0xF9,0x80,0x00,
  71. 0x00,0x01,0xB0,0x30,0x01,0xC6,0x19,0xC0,0x1E,0x7F,0xDE,0x00,0x6F,0x83,0x80,0x00,
  72. 0x00,0x23,0xAC,0x60,0x0F,0xE6,0xF1,0x80,0x3E,0x7B,0x38,0x00,0x61,0x83,0x00,0x00,
  73. 0x00,0x37,0x0E,0x00,0x0F,0xC7,0xB7,0x80,0xEC,0x63,0x30,0x00,0xE3,0x03,0x00,0x00,
  74. 0x00,0x3E,0x0E,0x00,0x01,0x8F,0x37,0x01,0xCC,0x6F,0xF0,0x00,0xC7,0xF7,0x00,0x00,
  75. 0x00,0x1E,0x0C,0x00,0x03,0x1E,0x66,0x03,0x0C,0x7F,0x00,0x01,0xFF,0xE6,0x00,0x00,
  76. 0x00,0x1E,0x1C,0x00,0x03,0x1C,0x60,0x02,0x19,0xAC,0x00,0x01,0x96,0x06,0x00,0x00,
  77. 0x00,0x3E,0x3E,0x00,0x03,0x18,0x60,0x00,0x19,0xFC,0x00,0x03,0x86,0x0E,0x00,0x00,
  78. 0x00,0x7E,0x36,0x00,0x03,0x00,0xC0,0x00,0x38,0x78,0x00,0x03,0x06,0x0C,0x00,0x00,
  79. 0x00,0xE6,0x67,0x00,0x03,0x00,0xC0,0x00,0x30,0x78,0x00,0x06,0x0C,0x0C,0x00,0x00,
  80. 0x01,0xC6,0xC3,0x80,0x7F,0xF0,0xC0,0x00,0x30,0xFE,0x00,0x0E,0x0C,0x1C,0x00,0x00,
  81. 0x03,0x81,0x83,0xC0,0x78,0xFF,0x80,0x00,0x61,0xCF,0x80,0x1C,0x08,0x18,0x00,0x00,
  82. 0x06,0x07,0x03,0xE0,0x00,0x1F,0xFF,0xE0,0x67,0x07,0xE0,0x38,0x18,0xF8,0x00,0x00,
  83. 0x08,0x0E,0x01,0xF8,0x00,0x07,0xFF,0x80,0xCE,0x03,0xF8,0x60,0x00,0x70,0x00,0x00,
  84. 0x00,0x18,0x01,0xF8,0x00,0x01,0xFC,0x00,0xC0,0x01,0xFC,0xC0,0x00,0x70,0x00,0x00,
  85. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,
  86. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  87. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  88. 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  89. 0x00,0x00,0x06,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  90. 0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91. 0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0xE0,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,
  92. 0x00,0x00,0x0E,0x00,0x00,0x00,0x3F,0xE0,0x00,0xFF,0xF0,0x00,0x38,0x00,0xE0,0x00,
  93. 0x00,0x00,0x0C,0x00,0x00,0x0F,0xFF,0x80,0x00,0xF8,0xF0,0x00,0x38,0x00,0xE0,0x00,
  94. 0x00,0x00,0x0C,0xF0,0x00,0x0F,0xC7,0x00,0x00,0x60,0xE0,0x00,0x38,0x00,0xE0,0x00,
  95. 0x00,0x00,0x1F,0xF0,0x00,0x01,0x8E,0x00,0x00,0x60,0xC0,0x00,0x70,0x01,0xC0,0x00,
  96. 0x00,0x07,0xFF,0x80,0x00,0x01,0x8C,0x00,0x00,0xE1,0x80,0x00,0x70,0x01,0xC0,0x00,
  97. 0x00,0x07,0xF8,0x00,0x00,0x01,0x98,0x00,0x00,0xDF,0xC0,0x00,0x70,0x01,0xC0,0x00,
  98. 0x00,0x00,0x78,0x00,0x00,0x01,0xBF,0xE0,0x00,0xFF,0x00,0x00,0x60,0x01,0x80,0x00,
  99. 0x00,0x00,0xFC,0x00,0x00,0x7F,0xFF,0xE0,0x00,0xC0,0x00,0x00,0xE0,0x03,0x80,0x00,
  100. 0x00,0x01,0xFE,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,
  101. 0x00,0x03,0xB7,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x3C,0x00,0xC0,0x03,0x00,0x00,
  102. 0x00,0x07,0x67,0x00,0x00,0x60,0x00,0x00,0x03,0x9F,0xFE,0x00,0x80,0x02,0x00,0x00,
  103. 0x00,0x0E,0x63,0x80,0x00,0xE0,0x00,0x01,0xFF,0xCF,0x1E,0x01,0x80,0x06,0x00,0x00,
  104. 0x00,0x1C,0xE1,0xE0,0x00,0xC0,0x00,0x00,0xE3,0x9C,0x38,0x01,0x80,0x06,0x00,0x00,
  105. 0x00,0x38,0xC1,0xF8,0x01,0xC0,0x00,0x00,0xC3,0x18,0x30,0x00,0x00,0x00,0x00,0x00,
  106. 0x00,0xE0,0xFC,0xFE,0x03,0x80,0x00,0x01,0xC7,0x18,0x60,0x00,0x00,0x00,0x00,0x00,
  107. 0x01,0xDF,0xF8,0xFE,0x03,0x00,0x00,0x01,0x8E,0x1B,0xE0,0x07,0x00,0x1C,0x00,0x00,
  108. 0x07,0x07,0x80,0x00,0x07,0x00,0x00,0x01,0xFF,0x3F,0xE0,0x07,0x00,0x1C,0x00,0x00,
  109. 0x0C,0x03,0x80,0x00,0x0E,0x00,0x00,0x01,0xF0,0x38,0x00,0x0F,0x00,0x3C,0x00,0x00,
  110. 0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x01,0x00,0x20,0x00,0x06,0x00,0x18,0x00,0x00,
  111. 0x00,0x03,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  112. 0x00,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  113. 0x00,0x02,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  114. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  115. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  116. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  117. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  118. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  119. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  120. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  121. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  122. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  123. };

  124. /******************************************************************************/
  125. void Lcd_init(void)        //初始化LCD
  126. {
  127.         Delaynms(10); //启动等待,等LCM讲入工作状态
  128.           CS=1;
  129.           Write_char(0,0x30);  //8 位介面,基本指令集
  130.           Write_char(0,0x0c);  //显示打开,光标关,反白关
  131.           Write_char(0,0x01);  //清屏,将DDRAM的地址计数器归零  
  132. }

  133. /******************************************************************************/
  134. void Write_char(bit start, unsigned char ddata) //写指令或数据
  135. {
  136.         unsigned char start_data,Hdata,Ldata;
  137.           if(start==0)
  138.                 start_data=0xf8;         //写指令
  139.     else   
  140.             start_data=0xfa;  //写数据
  141.   
  142.           Hdata=ddata&0xf0;                  //取高四位
  143.           Ldata=(ddata<<4)&0xf0;  //取低四位
  144.           Send_byte(start_data);          //发送起始信号
  145.           Delaynms(5); //延时是必须的
  146.           Send_byte(Hdata);              //发送高四位
  147.           Delaynms(1);  //延时是必须的
  148.           Send_byte(Ldata);                  //发送低四位
  149.           Delaynms(1);  //延时是必须的
  150. }

  151. /******************************************************************************/
  152. void Send_byte(unsigned char bbyte) //发送一个字节
  153. {
  154.         unsigned char i;
  155.         for(i=0;i<8;i++)
  156.            {
  157.                    SID=bbyte&0x80; //取出最高位
  158.                 SCLK=1;
  159.                    SCLK=0;
  160.                    bbyte<<=1; //左移
  161.            }  
  162. }

  163. /******************************************************************************/
  164. void Delaynms(unsigned int di) //延时
  165. {
  166.         unsigned int da,db;
  167.         for(da=0;da<di;da++)
  168.                    for(db=0;db<10;db++);
  169. }

  170. /******************************************************************************/
  171. void Disp_img(unsigned char  *img)        //图形方式12864显示字模221 横向取膜
  172. {
  173.         unsigned char i,j;
  174.         unsigned int k = 0;

  175.         Write_char(0,0x36); //图形方式
  176.         for(i=0;i<32;i++)
  177.           {
  178.                 Write_char(0,0x80+i);
  179.                 Write_char(0,0x80);
  180.             for(j=0;j<16;j++)
  181.                 {
  182.                         Write_char(1,img[k++]);
  183.                 }
  184.           }

  185.         for(i=0;i<32;i++)
  186.           {
  187.                 Write_char(0,0x80+i);
  188.                 Write_char(0,0x88);
  189.             for(j=0;j<16;j++)
  190.                 {
  191.                         Write_char(1,img[k++]);
  192.                   }
  193.         }
  194. }
  195.        
  196. /******************************************************************************/
  197. void Clr_Scr(void)//清屏函数
  198. {
  199.         Write_char(0,0x01);
  200. }

  201. /******************************************************************************/
  202. void LCD_set_xy( unsigned char x, unsigned char y )
  203. {        //设置LCD显示的起始位置,X为行,Y为列
  204.     unsigned char address;
  205.         switch(x)
  206.         {
  207.                 case 0: address = 0x80 + y; break;   
  208.             case 1: address = 0x80 + y; break;
  209.                 case 2: address = 0x90 + y; break;
  210.                     case 3: address = 0x88 + y; break;
  211.                 case 4: address = 0x98 + y; break;
  212.                 default:address = 0x80 + y; break;
  213.         }
  214.     Write_char(0, address);
  215. }

  216. /******************************************************************************/
  217. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
  218. {        //        中英文字符串显示函数
  219.         LCD_set_xy( X, Y );
  220.    
  221.     while (*s)
  222.     {
  223.                 Write_char( 1, *s );
  224.             s ++;
  225.                 Delaynms(1);
  226.         }
  227. }

  228. /******************************************************************************/
  229. void LCD_Write_number(unsigned char s)//        数字显示函数
  230. {       
  231.         Write_char(1,num[s]);
  232.         Delaynms(1);
  233. }
  234. /******************************************************************************/
  235. void Lcd_Mark2(void)
  236. {
  237.         Clr_Scr();//清屏
  238.         LCD_Write_string(1,0,znwk);//
  239.         LCD_Write_string(2,0,waves);//       
  240.         LCD_Write_string(3,7,CM);//       
  241. }

  242. /********************************************************/
  243.     void Conut(void)
  244.         {
  245.            time=TH0*256+TL0;
  246.            TH0=0;
  247.            TL0=0;
  248.            S=time*1.87/100;       //算出来是CM          11。0592M晶振
  249.            if(flag==1)                      //超出测量
  250.           {         
  251.            flag=0;
  252.            LCD_set_xy( 3, 4 );
  253.            LCD_Write_number(13);
  254.            LCD_Write_number(12);
  255.            LCD_set_xy( 3, 5 );
  256.            LCD_Write_number(13);
  257.            LCD_Write_number(13);
  258.           
  259.            }
  260.          else
  261.           {
  262.            disbuff[1]=S%1000/100;
  263.            disbuff[2]=S%1000%100/10;
  264.            disbuff[3]=S%1000%10 %10;
  265.            LCD_set_xy( 3, 4 );
  266.            LCD_Write_number(disbuff[1]);
  267.            LCD_Write_number(12);
  268.            LCD_set_xy( 3, 5 );
  269.            LCD_Write_number(disbuff[2]);
  270.            LCD_Write_number(disbuff[3]);
  271.           }
  272.         }
  273. /********************************************************/
  274. void delayms(unsigned int ms)
  275. {
  276.         unsigned char i=100,j;
  277.         for(;ms;ms--)
  278.         {
  279.                 while(--i)
  280.                 {
  281.                         j=10;
  282.                         while(--j);
  283.                 }
  284.         }
  285. }
  286. /********************************************************/
  287.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  288.   {
  289.     flag=1;                                                         //中断溢出标志
  290.   }
  291. /********************************************************/
  292.    void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  293.   {
  294.           TX=1;                                         //800MS  启动一次模块
  295.           _nop_();
  296.           _nop_();
  297.           _nop_();
  298.           _nop_();
  299.           _nop_();
  300.           _nop_();
  301.           _nop_();
  302.           _nop_();
  303.           _nop_();
  304.           _nop_();
  305.           _nop_();
  306.           _nop_();
  307.           _nop_();
  308.           _nop_();
  309.           _nop_();
  310.           _nop_();
  311.           _nop_();
  312.           _nop_();
  313.           _nop_();
  314.           _nop_();
  315.           _nop_();
  316.           TX=0;
  317.   }
  318. /********************************************************/
  319. void main(void)
  320. {  
  321.     TMOD=0x01;                   //设T0为方式1,GATE=1
  322.         TH0=0;
  323.         TL0=0;
  324.         TR0=1;

  325.         Lcd_init();       //设置液晶显示器
  326.         Clr_Scr();        //清屏       
  327.         Disp_img(logo);          //显示欢迎使用本产品LOGO
  328.         Delaynms(1000);
  329.         Lcd_init();       //从图形显示状态下返回
  330.     Lcd_Mark2();


  331.         while(1)
  332.         {
  333.          StartModule();         
  334.                                          //计算
  335.          while(!RX);                //当RX为零时等待
  336.          TR0=1;                            //开启计数
  337.          while(RX);                        //当RX为1计数并等待
  338.          TR0=0;                                //关闭计数
  339.          Conut();
  340.          delayms(80);                //80MS

  341.         }

  342. }              
复制代码

所有资料51hei提供下载:
超声波测距LCD12864显示.rar (31.73 KB, 下载次数: 16)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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