找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机倒车雷达设计(超声波,TFT屏)

[复制链接]
ID:327295 发表于 2020-8-16 17:38 | 显示全部楼层 |阅读模式
根据设计4个超声波传感器检测倒车距离并采用TFT屏幕显示,不同距离显示字体颜色改变。
51hei.png
程序如下:
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #include<intrins.h>
  4. #include<string.h>
  5. #include<font.h>
  6. #include<stdio.h>


  7. sbit TX = P2^1;
  8. sbit RX = P2^0;


  9. unsigned char dspflag;
  10. unsigned char cnt;
  11. unsigned char tflag;


  12. void display(unsigned int d);
  13. void init_t(void);


  14. void Pulse()
  15. {
  16.         unsigned char i;
  17.         for (i =0 ;i<10; ++i) {
  18.                 _nop_();
  19.                 _nop_();
  20.                 _nop_();
  21.                 _nop_();
  22.                 _nop_();
  23.                 _nop_();
  24.                 _nop_();
  25.                 _nop_();
  26.                 _nop_();
  27. //                _nop_();                 //延时,调整发射频率


  28.                 TX = ~TX;
  29.         }
  30.         
  31. }
  32. unsigned int sonic()
  33. {
  34.         unsigned int n;
  35.         RX=1;
  36.         TR1=0;
  37.         TH1=TL1=0;
  38.         Pulse();
  39.         TR1=1;
  40.         TF1=0;
  41.         for(n=0;n<160;n++);                        // 排出相邻干扰
  42.         while( RX ==1 && TF1 == 0 ) ;
  43.         TR1=0;
  44.         if ( TF1 ) {
  45.                 n=9999;
  46.         }else{
  47.                 n=(TH1<<8)+TL1;
  48.                 n=(unsigned int) ( n*0.017);//0.018446);           //   0.017*12/11.0592
  49.         }
  50.         return n;
  51. }


  52. //测试硬件平台:STC12C5A60S2/STC12LE5A60S2
  53. //主频:12MHZ
  54. //单片机IO推挽输出设置定义
  55. #define USE_LANDSCAPE//测试程序横竖屏切换,横屏请开启此宏,竖屏请屏蔽
  56. #define MCU_STC12//如果您使用的单片机不是STC12系列(如STC89C52)请屏蔽此宏定义
  57. #ifdef MCU_STC12
  58. sfr P3M1  = 0xB1;        //P3M1.n,P3M0.n         =00--->Standard,        01--->push-pull
  59. sfr P3M0  = 0xB2;        //                                        =10--->pure input,        11--->open drain
  60. sfr P1M1  = 0x91;
  61. sfr P1M0  = 0x92;
  62. #endif




  63. //---------------------------液晶屏接线说明-------------------------------------//
  64. //接线前请参考液晶屏说明书第10页引脚定义
  65. sbit bl        =P1^5;//接模块BL引脚,背光可以采用IO控制或者PWM控制,也可以直接接到高电平常亮
  66. sbit scl       =P1^0;//接模块CLK引脚,接裸屏Pin9_SCL
  67. sbit sda       =P1^1;//接模块DIN/MOSI引脚,接裸屏Pin8_SDA
  68. sbit rs        =P1^2;//接模块D/C引脚,接裸屏Pin7_A0
  69. sbit cs        =P1^4;//接模块CE引脚,接裸屏Pin12_CS
  70. sbit reset     =P1^3;//接模块RST引脚,接裸屏Pin6_RES
  71. //---------------------------End of液晶屏接线---------------------------------//


  72. //定义常用颜色
  73. #define RED                  0xf800
  74. #define GREEN                0x07e0
  75. #define BLUE                 0x001f
  76. #define WHITE                0xffff
  77. #define BLACK                0x0000
  78. #define YELLOW  0xFFE0
  79. #define GRAY0   0xEF7D   
  80. #define GRAY1   0x8410              
  81. #define GRAY2   0x4208
  82.   


  83. void  Contrast_Adjust();


  84. code  typFNT_GBK16 hz16[];


  85. void Output_Pixel(uint x,uint y);




  86. void delay1us(uint x)    //     12.000MHz??
  87. {
  88.           while(x--)                     //     x*1 us
  89.           {
  90.               _nop_();
  91.               _nop_();
  92.               _nop_();
  93.               _nop_();
  94.            }
  95. }


  96. void delay_ms(uint time)
  97. {
  98. uint i,j;
  99.   for(i=0;i<time;i++)
  100.    for(j=0;j<250;j++);
  101. }




  102. //向SPI总线传输一个8位数据
  103. void  SPI_WriteData(uchar Data)
  104. {
  105.         unsigned char i=0;
  106.         for(i=8;i>0;i--)
  107.         {
  108.                 if(Data&0x80)        
  109.                 sda=1; //输出数据
  110.                 else sda=0;
  111.                 scl=0;
  112.                 scl=1;
  113.                 Data<<=1;
  114.         }
  115. }
  116. //向液晶屏写一个8位指令
  117. void  Lcd_WriteIndex(uchar Data)
  118. {
  119.                
  120.                 cs=0;
  121.                 rs=0;
  122.                 SPI_WriteData(Data);                 
  123.                 cs=1;
  124. }
  125. //向液晶屏写一个8位数据
  126. void  Lcd_WriteData(uchar Data)
  127. {        
  128.                 unsigned char i=0;
  129.                 cs=0;
  130.                 rs=1;
  131.                 SPI_WriteData(Data);         
  132.                 cs=1;
  133. }
  134. //向液晶屏写一个16位数据
  135. void  LCD_WriteData_16Bit(unsigned int Data)
  136. {
  137.         unsigned char i=0;
  138.         cs=0;
  139.         rs=1;
  140.         SPI_WriteData(Data>>8);         //写入高8位数据
  141.         SPI_WriteData(Data);                         //写入低8位数据
  142.         cs=1;


  143. }


  144. void Reset()
  145. {
  146.     reset=0;
  147.     delay_ms(100);
  148.     reset=1;
  149.     delay_ms(100);
  150. }
  151. //////////////////////////////////////////////////////////////////////////////////////////////
  152. //液晶屏初始化 for S6D02A1
  153. void lcd_initial()
  154. {        Reset();//Reset before LCD Init.
  155.                
  156.         //LCD Init For 1.44Inch LCD Panel with ST7735R.
  157.         Lcd_WriteIndex(0x11);//Sleep exit
  158.         delay_ms (120);
  159.                
  160.         //ST7735R Frame Rate
  161.         Lcd_WriteIndex(0xB1);
  162.         Lcd_WriteData(0x01);
  163.         Lcd_WriteData(0x2C);
  164.         Lcd_WriteData(0x2D);


  165.         Lcd_WriteIndex(0xB2);
  166.         Lcd_WriteData(0x01);
  167.         Lcd_WriteData(0x2C);
  168.         Lcd_WriteData(0x2D);


  169.         Lcd_WriteIndex(0xB3);
  170.         Lcd_WriteData(0x01);
  171.         Lcd_WriteData(0x2C);
  172.         Lcd_WriteData(0x2D);
  173.         Lcd_WriteData(0x01);
  174.         Lcd_WriteData(0x2C);
  175.         Lcd_WriteData(0x2D);
  176.         
  177.         Lcd_WriteIndex(0xB4); //Column inversion
  178.         Lcd_WriteData(0x07);
  179.         
  180.         //ST7735R Power Sequence
  181.         Lcd_WriteIndex(0xC0);
  182.         Lcd_WriteData(0xA2);
  183.         Lcd_WriteData(0x02);
  184.         Lcd_WriteData(0x84);
  185.         Lcd_WriteIndex(0xC1);
  186.         Lcd_WriteData(0xC5);


  187.         Lcd_WriteIndex(0xC2);
  188.         Lcd_WriteData(0x0A);
  189.         Lcd_WriteData(0x00);


  190.         Lcd_WriteIndex(0xC3);
  191.         Lcd_WriteData(0x8A);
  192.         Lcd_WriteData(0x2A);
  193.         Lcd_WriteIndex(0xC4);
  194.         Lcd_WriteData(0x8A);
  195.         Lcd_WriteData(0xEE);
  196.         
  197.         Lcd_WriteIndex(0xC5); //VCOM
  198.         Lcd_WriteData(0x0E);
  199.         
  200.         Lcd_WriteIndex(0x36); //MX, MY, RGB mode
  201. Lcd_WriteData(0xC0);         
  202. #ifdef USE_LANDSCAPE
  203.         Lcd_WriteData(0xA8); //竖屏C8 横屏08 A8
  204. #else
  205.         Lcd_WriteData(0xC8); //竖屏C8 横屏08 A8
  206. #endif               
  207.         //ST7735R Gamma Sequence
  208.         Lcd_WriteIndex(0xe0);
  209.         Lcd_WriteData(0x0f);
  210.         Lcd_WriteData(0x1a);
  211.         Lcd_WriteData(0x0f);
  212.         Lcd_WriteData(0x18);
  213.         Lcd_WriteData(0x2f);
  214.         Lcd_WriteData(0x28);
  215.         Lcd_WriteData(0x20);
  216.         Lcd_WriteData(0x22);
  217.         Lcd_WriteData(0x1f);
  218.         Lcd_WriteData(0x1b);
  219.         Lcd_WriteData(0x23);
  220.         Lcd_WriteData(0x37);
  221.         Lcd_WriteData(0x00);         
  222.         Lcd_WriteData(0x07);
  223.         Lcd_WriteData(0x02);
  224.         Lcd_WriteData(0x10);


  225.         Lcd_WriteIndex(0xe1);
  226.         Lcd_WriteData(0x0f);
  227.         Lcd_WriteData(0x1b);
  228.         Lcd_WriteData(0x0f);
  229.         Lcd_WriteData(0x17);
  230.         Lcd_WriteData(0x33);
  231.         Lcd_WriteData(0x2c);
  232.         Lcd_WriteData(0x29);
  233.         Lcd_WriteData(0x2e);
  234.         Lcd_WriteData(0x30);
  235.         Lcd_WriteData(0x30);
  236.         Lcd_WriteData(0x39);
  237.         Lcd_WriteData(0x3f);
  238.         Lcd_WriteData(0x00);
  239.         Lcd_WriteData(0x07);
  240.         Lcd_WriteData(0x03);
  241.         Lcd_WriteData(0x10);  
  242.         
  243.         Lcd_WriteIndex(0x2a);
  244.         Lcd_WriteData(0x00);
  245.         Lcd_WriteData(0x00+2);
  246.         Lcd_WriteData(0x00);
  247.         Lcd_WriteData(0x80+2);


  248.         Lcd_WriteIndex(0x2b);
  249.         Lcd_WriteData(0x00);
  250.         Lcd_WriteData(0x00+3);
  251.         Lcd_WriteData(0x00);
  252.         Lcd_WriteData(0x80+3);
  253.         
  254.         Lcd_WriteIndex(0xF0); //Enable test command  
  255.         Lcd_WriteData(0x01);
  256.         Lcd_WriteIndex(0xF6); //Disable ram power save mode
  257.         Lcd_WriteData(0x00);
  258.         
  259.         Lcd_WriteIndex(0x3A); //65k mode
  260.         Lcd_WriteData(0x05);
  261.         
  262.         
  263.         Lcd_WriteIndex(0x29);//Display on


  264. }






  265. /*************************************************
  266. 函数名:LCD_Set_Region
  267. 功能:设置lcd显示区域,在此区域写点数据自动换行
  268. 入口参数:xy起点和终点
  269. 返回值:无
  270. *************************************************/
  271. void Lcd_SetRegion(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end)
  272. {        
  273. #ifdef USE_LANDSCAPE//使用横屏模式
  274.         Lcd_WriteIndex(0x2a);
  275.         Lcd_WriteData(0x02);
  276.         Lcd_WriteData(x_start+2);
  277.         Lcd_WriteData(0x02);
  278.         Lcd_WriteData(x_end+2);


  279.         Lcd_WriteIndex(0x2b);
  280.         Lcd_WriteData(0x01);
  281.         Lcd_WriteData(y_start+1);
  282.         Lcd_WriteData(0x01);
  283.         Lcd_WriteData(y_end+1);


  284. #else//竖屏模式        
  285.         Lcd_WriteIndex(0x2a);
  286.         Lcd_WriteData(0x02);
  287.         Lcd_WriteData(x_start+2);
  288.         Lcd_WriteData(0x02);
  289.         Lcd_WriteData(x_end+2);


  290.         Lcd_WriteIndex(0x2b);
  291.         Lcd_WriteData(0x01);
  292.         Lcd_WriteData(y_start+1);
  293.         Lcd_WriteData(0x01);
  294.         Lcd_WriteData(y_end+1);        
  295. #endif
  296.         Lcd_WriteIndex(0x2c);
  297. }




  298. void PutPixel(uint x_start,uint y_start,uint color)
  299. {
  300.         Lcd_SetRegion(x_start,y_start,x_start+1,y_start+1);
  301.         LCD_WriteData_16Bit(color);
  302.         
  303. }






  304. void dsp_single_colour(int color)
  305. {
  306.          uchar i,j;
  307.         Lcd_SetRegion(0,0,128-1,160-1);
  308.          for (i=0;i<160;i++)
  309.             for (j=0;j<128;j++)
  310.                 LCD_WriteData_16Bit(color);
  311. }
  312. //采用设置窗口方法填充字库数据,相比Gui_DrawFont_GBK16更快速
  313. void Fast_DrawFont_GBK16(uint x, uint y, uint fc, uint bc, uchar *s)
  314. {
  315.         unsigned char i,j;
  316.         unsigned short k;
  317.         uint HZnum;
  318.         HZnum=sizeof(hz16)/sizeof(typFNT_GBK16);
  319.         while(*s)
  320.         {        
  321.                 if((*s) >= 128)
  322.                 {               
  323.                         for (k=0;k<HZnum;k++)
  324.                         {
  325.                           if ((hz16[k].Index[0]==*(s))&&(hz16[k].Index[1]==*(s+1)))
  326.                           {         Lcd_SetRegion(x,y,x+16-1,y+16-1);
  327.                                     for(i=0;i<16*2;i++)
  328.                                     {
  329.                                                 for(j=0;j<8;j++)
  330.                                             {
  331.                                                         if(hz16[k].Msk[ i]&(0x80>>j))        LCD_WriteData_16Bit(fc);
  332.                                                         else
  333.                                                         {
  334.                                                         if (fc!=bc) LCD_WriteData_16Bit(bc);
  335.                                                         }
  336.                                                 }
  337.                                         }                                       
  338.                                 }
  339.                         }
  340.                 s+=2;x+=16;
  341.                 }
  342.                         
  343.                
  344.                 else
  345.                 s+=1;
  346.                
  347.         }
  348. }
  349. //此方法描绘汉字较慢
  350. void Gui_DrawFont_GBK16(uint x, uint y, uint fc, uint bc, uchar *s)
  351. {
  352.         unsigned char i,j;
  353.         unsigned short k,x0;
  354.         x0=x;


  355.         while(*s)
  356.         {        
  357.                 if((*s) >= 128)
  358.                 {               
  359.                         for (k=0;k<hz16_num;k++)
  360.                         {
  361.                           if ((hz16[k].Index[0]==*(s))&&(hz16[k].Index[1]==*(s+1)))
  362.                           {
  363.                                     for(i=0;i<16;i++)
  364.                                     {
  365.                                                 for(j=0;j<8;j++)
  366.                                                         {
  367.                                                             if(hz16[k].Msk[i*2]&(0x80>>j))        PutPixel(x+j,y+i,fc);
  368.                                                                 else {
  369.                                                                         if (fc!=bc) PutPixel(x+j,y+i,bc);
  370.                                                                 }
  371.                                                         }
  372.                                                 for(j=0;j<8;j++)
  373.                                                         {
  374.                                                             if(hz16[k].Msk[i*2+1]&(0x80>>j))        PutPixel(x+j+8,y+i,fc);
  375.                                                                 else
  376.                                                                 {
  377.                                                                         if (fc!=bc) PutPixel(x+j+8,y+i,bc);
  378.                                                                 }
  379.                                                         }
  380.                                     }
  381.                                 }
  382.                           }
  383.                         s+=2;x+=16;
  384.                 }
  385.                 else
  386.                 s+=1;
  387.                
  388.         }
  389. }


  390. //显示一个英文字符
  391. void Display_ASCII8X16(uint x0,uint y0,uint fc,uchar *s)
  392. {
  393.         int i,j,k,x,y,xx;
  394.         
  395.         unsigned char qm;
  396.         
  397.         long int ulOffset;
  398.         
  399.         char  ywbuf[32],temp[2];


  400.         for(i = 0; i<strlen((char*)s);i++)
  401.         {
  402.                 if(((unsigned char)(*(s+i))) >= 161)
  403.                 {
  404.                         temp[0] = *(s+i);
  405.                         temp[1] = '\0';
  406.                         return;
  407.                 }
  408.                
  409.                 else
  410.                 {
  411.                         qm = *(s+i);


  412.                         ulOffset = (long int)(qm) * 16;
  413.                         
  414.       for (j = 0; j < 16; j ++)
  415.       {
  416.                                 ywbuf[j]=Zk_ASCII8X16[ulOffset+j];
  417.       }
  418.             
  419.       for(y = 0;y < 16;y++)
  420.       {
  421.                 for(x=0;x<8;x++)
  422.                 {
  423.              k=x % 8;
  424.                         
  425.                                           if(ywbuf[y]&(0x80 >> k))
  426.                                            {
  427.                                                   xx=x0+x+i*8;
  428.                                             PutPixel(xx,y+y0,fc);
  429.                                           }
  430.                                                         
  431.                                    }
  432.       }


  433.                 }
  434.         }            
  435. }


  436. void Font_Test(void)
  437. {//中文显示测试全动电子欢迎您因为专业所以注
  438.         
  439.         Fast_DrawFont_GBK16(16,10,BLUE,YELLOW,        "中文显示测试");
  440.         Fast_DrawFont_GBK16(32,30,RED,WHITE,        "中景园");
  441.         Fast_DrawFont_GBK16(40,50,BLUE,WHITE,        "欢迎您");
  442.         Fast_DrawFont_GBK16(32,70,WHITE,BLUE,         "因为专注");
  443.         Fast_DrawFont_GBK16(32,90,WHITE,BLUE,        "所以专业");


  444. //        delay_ms(1800);        
  445. }
  446. void Font_Test2(void)
  447. {//中文显示测试全动电子欢迎您因为专业所以注
  448.         
  449.         Fast_DrawFont_GBK16(16,0,BLUE,YELLOW,        "基于超声波的");
  450.         Fast_DrawFont_GBK16(32,16,RED,WHITE,        "倒车雷达");
  451.         Fast_DrawFont_GBK16(24,32,BLUE,WHITE,        "设计与制作");
  452.         Fast_DrawFont_GBK16(16*3,48,WHITE,BLACK,        "程玥");
  453.         Fast_DrawFont_GBK16(0,16*5,RED,WHITE,        "距离");
  454.         Display_ASCII8X16(16*2+1,16*5,RED,":");
  455.         Display_ASCII8X16(16*6,16*5,RED,"M");
  456. //        Display_ASCII8X16(10,10,BLACK,"Welcome");
  457. //    Display_ASCII8X16(10,26,BLACK,"Zhongjy");
  458. //    Display_ASCII8X16(10,42,BLACK,"Dots:128*160");
  459. //    Display_ASCII8X16(10,58,BLACK,"IC: ST7735");
  460. //    Display_ASCII8X16(10,74,BLACK,"VA:6 o'clock");
  461. //    Display_ASCII8X16(10,90,BLACK,"I LOVE JIXIE");
  462. //        delay_ms(1800);        
  463. }
  464. main()
  465. {
  466.         uint time = 500;
  467.         uchar tt[5] = {0};
  468.         unsigned int k;
  469.   unsigned int cnt;
  470.   init_t();        

  471. #ifdef MCU_STC12
  472.         P3M1 &= ~(1<<2),        P3M0 |=  (1<<2);        //P3.2 set as push-pull output mode
  473.         P1M0  = 0x20;
  474. #endif
  475.         bl=0;
  476.         lcd_initial();
  477.         dsp_single_colour(WHITE);
  478.         Font_Test2();
  479.          
  480.   while(1)
  481.   {
  482.   
  483.                  cnt = sonic();
  484. //    EA=1;
  485.         for(k=0;k<6000;k++)
  486.         sprintf(tt, "%d", cnt);;
  487.                
  488.         


  489.         
  490.         if(time % 2)
  491.         {
  492.                
  493.                 Fast_DrawFont_GBK16(16*3,16*5,WHITE,RED,"空空空");
  494.                 Display_ASCII8X16(16*4,16*5,BLACK,tt);
  495.                 //bl = 1;
  496.         }
  497.         else
  498.         {
  499.                
  500.                 Fast_DrawFont_GBK16(16*3,16*5,WHITE,YELLOW,"空空空");
  501.                 Display_ASCII8X16(16*4,16*5,BLACK,tt);
  502.         //        bl = 0;        
  503.         }
  504.                 time++;
  505.         if(time > 5000)
  506.         {
  507.                 time = 0;
  508.         }
  509.         
  510.     delay_ms(3500);        
  511.         
  512.     }
  513. }


  514. void isr_t0(void) interrupt 1
  515. {
  516.   tflag++;
  517.   if(tflag == 16)
  518.   {
  519.         tflag = 0;
  520.         dspflag ++;
  521.         if(dspflag == 3)
  522.           dspflag = 0;
  523.   }
  524. }


  525. void init_t(void)
  526. {        
  527.   TMOD = 0x12;         // 超声用定时器1
  528.   TH0 = 0x06;
  529.   TL0 = 0x06;
  530.   ET0 = 1;
  531.   EA = 1;
  532.   TR0 = 1;
  533. }
复制代码








程序-c.zip

92 KB, 下载次数: 36, 下载积分: 黑币 -5

硬件.zip

144.39 KB, 下载次数: 36, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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