大器所成 发表于 2015-1-4 22:07:58

STM32 NUCLEO板方案设计:基于STM32F072的远程控制设计

智能手机的大爆发时代已经到来,也给我们带来了更多的体验,但这只是开始,人们正在追求更加舒适的生活方式。以下方案是基于STM32F072的单片机设计的远程控制系统。以下是系统框图:图1 系统框图BOM:GSM模块:TC35i模块控制器:STM32F072RB Nucleo核心板LCD模块:TFT彩屏128X64    控制电路:用继电器模拟和蜂鸣器组成      传感器:温度探头

LCD模块的程序:u16 colors[]=
{
0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xffff//颜色数据
};
void delay_ms(int count);
void LCD_Write(u8 type, u16 value)

{
   LCD_CS(0);
   LCD_RS(type);
   LCD_WR(0);

    GPIOB->BSRR = value & 0xff00;   
    GPIOB->BRR= (~value) & 0xff00;
   LCD_WR(1);
Delay(100);
   LCD_WR(0);
          GPIOB->BSRR = (value)<<8 & 0xff00;   
    GPIOB->BRR= ((~value)<<8) & 0xff00;
   LCD_WR(1);
   Delay(100);
   LCD_CS(1);

}

void LCD_Write_Data16(u16 value)
{         
    LCD_CS(0);
      LCD_RS(1);
      LCD_WR(0);
    GPIOB->BSRR = value & 0xff00;   
    GPIOB->BRR= (~value) & 0xff00;
    LCD_WR(1);
      Delay(5);
    LCD_WR(0);
      GPIOB->BSRR = (value)<<8 & 0xff00;   
    GPIOB->BRR= ((~value)<<8) & 0xff00;
    LCD_WR(1);
      Delay(5);
    LCD_CS(1);

}

void Reg_Write(u16 reg,u16 value)
{
LCD_Write(TYPE_LCD_COMMAND,reg);   //这里的TYPE_LCD_COMMAND,指的是发送命令,查阅液晶屏的资料
LCD_Write_Data16(value);

}
void LCD_SetRamAddr(uint xStart, uint xEnd, uint yStart, uint yEnd)
{

      Reg_Write(0x200, xStart);
    Reg_Write(0x201, yStart);

    Reg_Write(0x0210, xStart);
    Reg_Write(0x0212,yStart);

    Reg_Write(0x211,xEnd);
    Reg_Write(0x213,yEnd);

      LCD_Write(TYPE_LCD_COMMAND,0x0202);
}




void LCD_Init(void)
{

    LCD_RST(1);
    delay_ms(5);      
      LCD_RST(0);
      delay_ms(5);
      LCD_RST(1);
      delay_ms(5);
      LCD_CS(0);//打开片选使能

    Reg_Write(0x000,0x0000);delay_ms(5);
      Reg_Write(0x000,0x0000);delay_ms(5);
      Reg_Write(0x000,0x0000);delay_ms(5);
      Reg_Write(0x000,0x0000);delay_ms(5);
      delay_ms(100);
    LCD_Write_Data16(0x0000);delay_ms(5);
    LCD_Write_Data16(0x0000);delay_ms(5);      
    LCD_Write_Data16(0x0000);delay_ms(5);      
    LCD_Write_Data16(0x0000);delay_ms(5);
          delay_ms(100);

    Reg_Write(0x400,0x6200);delay_ms(5);
         Reg_Write(0x008,0x0808);delay_ms(5);

      Reg_Write(0x300,0x0c0c);delay_ms(5);//GAMMA
      Reg_Write(0x301,0xff13);delay_ms(5);
      Reg_Write(0x302,0x0f0f);delay_ms(5);
      Reg_Write(0x303,0x150b);delay_ms(5);

      Reg_Write(0x304,0x1020);delay_ms(5);

      Reg_Write(0x305,0x0a0b);delay_ms(5);
      Reg_Write(0x306,0x0003);delay_ms(5);      
      Reg_Write(0x307,0x0d06);delay_ms(5);
      Reg_Write(0x308,0x0504);delay_ms(5);
      Reg_Write(0x309,0x1030);delay_ms(5);

      Reg_Write(0x010,0x001b);delay_ms(5);   //60Hz
         Reg_Write(0x011,0x0101);delay_ms(5);
      Reg_Write(0x012,0x0000);delay_ms(5);
      Reg_Write(0x013,0x0001);delay_ms(5);

      Reg_Write(0x100,0x0330);delay_ms(5);//BT,AP 0x0330
      Reg_Write(0x101,0x0247);delay_ms(5);//DC0,DC1,VC
      Reg_Write(0x103,0x1000);delay_ms(5);//VDV      //0x0f00
      Reg_Write(0x280,0xbf00);delay_ms(5);//VCM
      Reg_Write(0x102,0xd1b0);delay_ms(5);//VRH,VCMR,PSON,PON

      delay_ms(1000);

      Reg_Write(0x001,0x0100);delay_ms(5);
      Reg_Write(0x002,0x0100);delay_ms(5);
      Reg_Write(0x003,0x1030);delay_ms(5);
      Reg_Write(0x009,0x0001);delay_ms(5);
      Reg_Write(0x0C,0x0000);delay_ms(5);      //MCU interface
      Reg_Write(0x090,0x8000);delay_ms(5);
      Reg_Write(0x00f,0x0000);delay_ms(5);


         Reg_Write(0x210,0x0000);delay_ms(5);
      Reg_Write(0x211,0x00ef);delay_ms(5);
      Reg_Write(0x212,0x0000);delay_ms(5);
      Reg_Write(0x213,0x018f);delay_ms(5);

      Reg_Write(0x500,0x0000);delay_ms(5);
      Reg_Write(0x501,0x0000);delay_ms(5);
      Reg_Write(0x502,0x005f);delay_ms(5);
      Reg_Write(0x401,0x0001);delay_ms(5);
      Reg_Write(0x404,0x0000);delay_ms(5);
      delay_ms(500);

         Reg_Write(0x0007,0x0100);delay_ms(5);
      delay_ms(1000);

         Reg_Write(0x200,0x0000);delay_ms(5);
      Reg_Write(0x201,0x0000);delay_ms(5);
    delay_ms(500);

          LCD_Write(TYPE_LCD_COMMAND,0x0202);delay_ms(5);
delay_ms(500);


}

voidLCD_clear(u8 color)
{
unsigned int com,seg;      
LCD_SetRamAddr(0,239, 0,399);
// delay_ms(100);
         
for(com=0;com<400;com++)
{
       for(seg=0;seg<240;seg++)
    {
      LCD_Write_Data16(colors);
    }

}
}




void delay_ms(int count)// /* X1ms */
{
      int i,j;
      for(i=0;i<count;i++)
                for(j=0;j<100;j++);
}
void LCD_ShowChar(u16 x,u16 y,u16 For_color,u16 Bk_color, char ch)
{

   u8 temp;
   u8 pos,t;
   u8CHAR_W,CHAR_H;

   CHAR_W = 8;         //8*16这里显示的英文字符大小为8*16

   CHAR_H = 16;

   if(x>(LCD_SIZE_X-CHAR_W)||y>(LCD_SIZE_Y-CHAR_H))
   return;

LCD_SetRamAddr(x, x+CHAR_W-1, y,y+CHAR_H-1);
   ch = ch-32;                     //按照ASCII编码顺序的到相应字母的编码

   for(pos=0;pos<CHAR_H;pos++)
   {
      temp= Font8x16;

      for(t=0;t<CHAR_W;t++)
      {               
            if(temp&0x80)
            LCD_Write_Data16(For_color);//textcolor
            else
            LCD_Write_Data16(Bk_color);//backcolor
      temp<<=1;
      }
         
   }
}



void LCD_ShowString(u16x,u16 y,u16 For_color,u16 Bk_color,char *p)
{         
   while(*p!='\0')
   {      
   LCD_ShowChar(x,y,For_color,Bk_color,*p);
   x+=8;
   p++;
   }
}



/**********************************************************

写汉字子函数

**********************************************************/
void ChineseChar(u16 x,u16y,u16size,u16For_color,u16Bk_color ,char c)
{
   int e=0,i,j;
   inted;

   u16ncols;            //定义汉字的列数
   u16nrows;                //定义汉字的行数
   u16nbytes;            //定义显示一个汉字所占的字节数

   u8 *pfont;
   u8 *pchar;
   u8 *fonttable[]={(u8 *)hz16,(u8 *)hz24,(u8 *)hz32};          //将不同字模表的首地址
                                                                  //放在一个指针数组了,方便调用

   pfont=(u8 *)fonttable;                                                                        //根据选择的字体,去调用不同大小的字模数据
                                                                                                             // 这里可以是 hz12地址,hz16地址,hz24地址

   if(size==0)         //size为0时表示hz12表中的汉字
   {
   ncols =16-1;         //-1 原因是下标从0开始,0~11 共12个数,以下-1原因亦如此
   nrows =16-1;
   nbytes =32;          //取模字节数 12*12/8 一共有24个字节 24个字节只能显示单色字
   }
   else
   if(size==1)                  //size 为1时表示hz16中的地址
   {
   ncols =24-1;
   nrows =24-1;
   nbytes =72;            //16*16/8 =32个字节,单色字
   }
   else
   if(size==2)                   //size 为2时表示hz24中的地址
   {
   ncols =32-1;
   nrows =32-1;
   nbytes =128;   
   }

   pchar=pfont + (nbytes*(c-1));   //执行这句后,把相应字符的首地址送给pchar,


   LCD_SetRamAddr(x, x+nrows, y,y+ncols); //设置字的起始坐标及结束坐标

   for(i=0;i<nbytes;i++)                  //开始向屏送数据
   {
   ed=*pchar++;                                  // 数据送给ed,变量ed中的数据准备送到屏中
         if(size==0)
         {
       if(i%2==0)
       e=8;
       else
       e=4;
         }
         else                                                
         e=8;

   for(j=0;j<e;j++)
   if((ed>>j)&0x01)
   {
       LCD_Write_Data16(For_color);//textcolor
         }
   else
   {
       LCD_Write_Data16(Bk_color);//backcolor
         }
}
}


void delayms(int count)// /* X1ms */
{
      int i,j;
      for(i=0;i<count;i++)
                for(j=0;j<100;j++);
}

/*********************************************************/



GSM模块:(淘宝买的)TC35i 模块



















大器所成 发表于 2015-1-4 22:07:59

明天更新BOM表

z00 发表于 2015-1-4 22:29:52

这个东西不好做啊 系统有点大

ANNIEE 发表于 2015-1-4 22:33:26

z00 发表于 2015-1-4 22:29
这个东西不好做啊 系统有点大

我想把控制电路和传感器这两块电路简单搞一下,等以后扩展,先搞定GSM这块的

z00 发表于 2015-1-4 22:34:34

ANNIEE 发表于 2015-1-4 22:33
我想把控制电路和传感器这两块电路简单搞一下,等以后扩展,先搞定GSM这块的 ...

GSM可以直接买一个透传的DTU模块

ANNIEE 发表于 2015-1-4 22:34:38

哥们,加油!!!

大器所成 发表于 2015-1-4 22:36:27

z00 发表于 2015-1-4 22:34
GSM可以直接买一个透传的DTU模块

恩恩,你说的很对,打算是这样:)

大器所成 发表于 2015-1-4 22:36:54

ANNIEE 发表于 2015-1-4 22:34
哥们,加油!!!

好的,老弟,你要帮忙?

JUNIC 发表于 2015-1-6 09:46:37

支持一下

万里-363223 发表于 2015-1-7 08:32:32

支持一下:)
页: [1] 2 3 4
查看完整版本: STM32 NUCLEO板方案设计:基于STM32F072的远程控制设计