找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机超声波测距语音播报系统程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include <STC89C51.h>
  2.         #include   <intrins.h>
  3. #include <stdio.h>
  4.         #include"dht11.h"
  5. //引脚定义
  6.     sbit     RX    =  P1 ^ 1;
  7.     sbit     TX    =  P1 ^ 2;
  8.     sbit     CS    =  P0 ^ 7;        //片选 高电平有效 单片LCD使用时可固定高电平
  9.     sbit     SID   =  P0 ^ 6;        //数据
  10.     sbit     SCLK  =  P0 ^ 5;        //时钟
  11.           sbit     PSB   =  P0 ^ 4;        //PSB
  12.                 sbit     FMQ   =  P0 ^ 3;//蜂鸣器
  13. //12864
  14. void Write_char(bit start, unsigned char ddata);
  15. void Send_byte(unsigned char bbyte);
  16. void Delaynms(unsigned int di);
  17. void Lcd_init(void);
  18. void lnit(unsigned int Init_Uart);
  19. void Disp_img(unsigned char *img);
  20. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
  21. void LCD_set_xy( unsigned char x, unsigned char y );
  22. unsigned char code num[]={"0123456789 :.-"};
  23. unsigned char code waves[]={"倒车雷达系统"};
  24. unsigned char code znwk[] ={"距离:"};
  25. unsigned char code CM[] =  {"M"};
  26. unsigned char code shidu[] = {"Tem:"};
  27. unsigned char code wendu[] =  {"Hum:"};
  28. unsigned char code baifenbi[] =  {"%"};
  29. unsigned char const sheshidu[]="℃";

  30. unsigned int  time=0;
  31.          long S=0;
  32.          bit  flag =0;
  33. unsigned char disbuff[5]           ={ 0,0,0,0,0,};
  34. /******************************************************************************/
  35. void Lcd_init(void)        //初始化LCD
  36. {
  37.         PSB = 0;
  38.         Delaynms(10); //启动等待,等LCM讲入工作状态
  39.           CS=1;
  40.           Write_char(0,0x30);  //8 位介面,基本指令集
  41.           Write_char(0,0x0c);  //显示打开,光标关,反白关
  42.           Write_char(0,0x01);  //清屏,将DDRAM的地址计数器归零  
  43. }

  44. /******************************************************************************/
  45. void Write_char(bit start, unsigned char ddata) //写指令或数据
  46. {
  47.         unsigned char start_data,Hdata,Ldata;
  48.           if(start==0)
  49.                 start_data=0xf8;         //写指令
  50.     else   
  51.             start_data=0xfa;  //写数据

  52.           Hdata=ddata&0xf0;                  //取高四位
  53.           Ldata=(ddata<<4)&0xf0;  //取低四位
  54.           Send_byte(start_data);          //发送起始信号
  55.           Delaynms(5); //延时是必须的
  56.           Send_byte(Hdata);              //发送高四位
  57.           Delaynms(1);  //延时是必须的
  58.           Send_byte(Ldata);                  //发送低四位
  59.           Delaynms(1);  //延时是必须的
  60. }

  61. /******************************************************************************/
  62. void Send_byte(unsigned char bbyte) //发送一个字节
  63. {
  64.         unsigned char i;
  65.          for(i=0;i<8;i++)
  66.            {
  67.                    SID=bbyte&0x80; //取出最高位
  68.                  SCLK=1;
  69.                    SCLK=0;
  70.                    bbyte<<=1; //左移
  71.            }  
  72. }

  73. /******************************************************************************/
  74. void Delaynms(unsigned int di) //延时
  75. {
  76.         unsigned int da,db;
  77.          for(da=0;da<di;da++)
  78.                    for(db=0;db<10;db++);
  79. }
  80. void delayms(unsigned int ms)
  81. {
  82.         unsigned char i=100,j;
  83.         for(;ms;ms--)
  84.         {
  85.                 while(--i)
  86.                 {
  87.                         j=10;
  88.                         while(--j);
  89.                 }
  90.         }
  91. }
  92. /******************************************************************************/
  93. void Disp_img(unsigned char  *img)        //图形方式12864显示字模221 横向取膜
  94. {
  95.         unsigned char i,j;
  96.         unsigned int k = 0;

  97.         Write_char(0,0x36); //图形方式
  98.         for(i=0;i<32;i++)
  99.           {
  100.                 Write_char(0,0x80+i);
  101.                 Write_char(0,0x80);
  102.             for(j=0;j<16;j++)
  103.                 {
  104.                         Write_char(1,img[k++]);
  105.                 }
  106.           }

  107.          for(i=0;i<32;i++)
  108.           {
  109.                 Write_char(0,0x80+i);
  110.                 Write_char(0,0x88);
  111.             for(j=0;j<16;j++)
  112.                 {
  113.                         Write_char(1,img[k++]);
  114.                   }
  115.         }
  116. }
  117.         
  118. /******************************************************************************/
  119. void Clr_Scr(void)//清屏函数
  120. {
  121.         Write_char(0,0x01);
  122. }

  123. /******************************************************************************/
  124. void LCD_set_xy( unsigned char x, unsigned char y )
  125. {        //设置LCD显示的起始位置,X为行,Y为列
  126.     unsigned char address;
  127.         switch(x)
  128.         {
  129.                 case 0: address = 0x80 + y; break;   
  130.             case 1: address = 0x80 + y; break;
  131.                 case 2: address = 0x90 + y; break;
  132.                     case 3: address = 0x88 + y; break;
  133.                 case 4: address = 0x98 + y; break;
  134.                 default:address = 0x80 + y; break;
  135.         }
  136.     Write_char(0, address);
  137. }

  138. /******************************************************************************/
  139. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
  140. {        //        中英文字符串显示函数
  141.         LCD_set_xy( X, Y );

  142.     while (*s)
  143.     {
  144.                 Write_char( 1, *s );
  145.             s ++;
  146.                 Delaynms(1);
  147.         }
  148. }

  149. /******************************************************************************/
  150. void LCD_Write_number(unsigned char s)//        数字显示函数
  151. {        
  152.         Write_char(1,num[s]);
  153.         Delaynms(1);
  154. }
  155. /******************************************************************************/
  156. void Lcd_Mark2(void)
  157. {
  158.         Clr_Scr();//清屏
  159.         LCD_Write_string(2,0,znwk);//
  160.         LCD_Write_string(1,0,waves);//        
  161.         LCD_Write_string(2,7,CM);//        
  162.         LCD_Write_string(3,0,shidu);//
  163.         LCD_Write_string(4,0,wendu);//
  164.         LCD_Write_string(3,7,sheshidu);//        
  165.         LCD_Write_string(4,7,baifenbi);//
  166. }

  167. /********************************************************/
  168.     void Conut(void)
  169.         {
  170.            time=TH0*256+TL0;
  171.            TH0=0;
  172.            TL0=0;
  173.            S=time*1.87/100;       //算出来是CM          11。0592M晶振
  174.            if(flag==1)                      //超出测量
  175.           {
  176.            flag=0;
  177.            LCD_set_xy( 2, 4 );
  178.            LCD_Write_number(13);
  179.            LCD_Write_number(12);
  180.            LCD_set_xy( 2, 5 );
  181.            LCD_Write_number(13);
  182.            LCD_Write_number(13);
  183.            }
  184.          else
  185.           {        
  186.            disbuff[1]=S%1000/100;
  187.            disbuff[2]=S%1000%100/10;
  188.            disbuff[3]=S%1000%10%10;
  189.                  //disbuff[4]=S%1000%10%10;
  190.            LCD_set_xy( 2, 4 );
  191.            LCD_Write_number(disbuff[1]);
  192.            LCD_Write_number(12);
  193.            LCD_set_xy( 2, 5 );
  194.            LCD_Write_number(disbuff[2]);
  195.            LCD_Write_number(disbuff[3]);
  196.                 // LCD_Write_number(disbuff[4]);
  197.          
  198.                 }
  199.         }

  200. void InitUART(void)//使用定时器1作为串口波特率发生器
  201. {   

  202.     TH1 = 0xFD;         //晶振11.0592mhz 波特率设为9600
  203.     TL1 = TH1;
  204.     TMOD|= 0x20;         //定时器1方式2
  205.     SCON = 0x50;         //串口接收使能
  206.     ES = 1;                         //串口中断使能
  207.     TR1 = 1;                 //定时器1使能
  208.     TI = 1;                         //发送中断标记位,必须设置
  209.            EA = 1;
  210. }

  211. void YYBB(void)   //语音播报函数
  212. {
  213.         if(S<10)
  214.         { printf("停车\n");//串口打印结果
  215.           delayms(50);               
  216.         }
  217. else
  218. {   //printf("<V>2");
  219.                 printf("%.2f米\n",(float)S/100);
  220.           delayms(50);
  221. }
  222. }

  223.         
  224.         
  225. /********************************************************/

  226. /********************************************************/
  227.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  228.   {
  229.     flag=1;                                                         //中断溢出标志
  230.   }
  231. /********************************************************/
  232.    void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  233.   {
  234.           TX=1;                                         //800MS  启动一次模块
  235.           _nop_();
  236.           _nop_();
  237.           _nop_();
  238.           _nop_();
  239.           _nop_();
  240.           _nop_();
  241.           _nop_();
  242.           _nop_();
  243.           _nop_();
  244.           _nop_();
  245.           _nop_();
  246.           _nop_();
  247.           _nop_();
  248.           _nop_();
  249.           _nop_();
  250.           _nop_();
  251.           _nop_();
  252.           _nop_();
  253.           _nop_();
  254.           _nop_();
  255.           _nop_();
  256.           TX=0;
  257.   }



  258. /********************************************************/
  259. void main(void)
  260. {
  261.         
  262.         
  263.   TMOD=0x01;                   //设T0为方式1,GATE=1
  264.         TH0=0;
  265.         TL0=0;
  266.         TR0=1;         
  267.         Lcd_init();       //设置液晶显示器
  268.         Clr_Scr();        //清屏        
  269.         //Disp_img(logo);          //显示欢迎使用本产品LOGO
  270.         //Disp_img(1);        
  271.         //Delaynms(10000);
  272.         //Lcd_init();       //从图形显示状态下返回
  273.   Lcd_Mark2();
  274.         InitUART();        //初始化串口   串口打印
  275.         while(1)
  276.         {
  277.                
  278.                
  279. //   Rec_DHT();
  280. //                Conut1();
  281. //                Conut2();                          
  282.          StartModule();        //计算                        
  283.          while(!RX);                //当RX为零时等待
  284.          TR0=1;                            //开启计数
  285.          while(RX);                        //当RX为1计数并等待
  286.          TR0=0;                                //关闭计数
  287.          Conut();
  288.    delayms(100);                //80MS
  289.                 YYBB();

  290.         }

  291. }              
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-4-15 22:10 | 只看该作者
本帖需要重新编辑补全头文件 电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:615726 发表于 2020-3-17 18:49 来自手机 | 只看该作者
这个是用什么语音芯片播报的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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