你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2263|回复: 33

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

[复制链接]

16

主题

242

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-5-18
发表于 2015-1-4 22:07:58 | 显示全部楼层 |阅读模式
智能手机的大爆发时代已经到来,也给我们带来了更多的体验,但这只是开始,人们正在追求更加舒适的生活方式。以下方案是基于STM32F072的单片机设计的远程控制系统。以下是系统框图:

图1 系统框图

图1 系统框图
图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);


}  

void  LCD_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[color]);
    }

  }
}




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;
   u8  CHAR_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[ch][pos];

      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(u16  x,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,u16  y,u16  size,u16  For_color,u16  Bk_color ,char c)
{
   int e=0,i,j;
   int  ed;

   u16  ncols;            //定义汉字的列数
   u16  nrows;                //定义汉字的行数
   u16  nbytes;            //定义显示一个汉字所占的字节数

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

   pfont=(u8 *)fonttable[size];                                                                          //根据选择的字体,去调用不同大小的字模数据
                                                                                                             // 这里可以是 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++);
}

/*********************************************************/
LCD模块.zip (2.41 KB, 下载次数: 4)
回复

使用道具 举报

16

主题

242

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-5-18
 楼主| 发表于 2015-1-4 22:07:59 | 显示全部楼层
明天更新BOM表
回复 支持 反对

使用道具 举报

47

主题

381

回帖

7

蝴蝶豆

论坛元老

最后登录
2020-9-19
发表于 2015-1-4 22:29:52 | 显示全部楼层
这个东西不好做啊 系统有点大
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2015-1-5
发表于 2015-1-4 22:33:26 | 显示全部楼层
z00 发表于 2015-1-4 22:29
这个东西不好做啊 系统有点大

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

使用道具 举报

47

主题

381

回帖

7

蝴蝶豆

论坛元老

最后登录
2020-9-19
发表于 2015-1-4 22:34:34 | 显示全部楼层
ANNIEE 发表于 2015-1-4 22:33
我想把控制电路和传感器这两块电路简单搞一下,等以后扩展,先搞定GSM这块的 ...

GSM可以直接买一个透传的DTU模块
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2015-1-5
发表于 2015-1-4 22:34:38 | 显示全部楼层
哥们,加油!!!
回复 支持 反对

使用道具 举报

16

主题

242

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-5-18
 楼主| 发表于 2015-1-4 22:36:27 | 显示全部楼层
z00 发表于 2015-1-4 22:34
GSM可以直接买一个透传的DTU模块

恩恩,你说的很对,打算是这样
回复 支持 反对

使用道具 举报

16

主题

242

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-5-18
 楼主| 发表于 2015-1-4 22:36:54 | 显示全部楼层
ANNIEE 发表于 2015-1-4 22:34
哥们,加油!!!

好的,老弟,你要帮忙?
回复 支持 反对

使用道具 举报

20

主题

112

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-4-30
发表于 2015-1-6 09:46:37 | 显示全部楼层
支持一下
回复 支持 反对

使用道具 举报

27

主题

405

回帖

0

蝴蝶豆

高级会员

最后登录
1970-1-1
发表于 2015-1-7 08:32:32 | 显示全部楼层
支持一下
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版