这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » dizhenfeng MCU开发板DIY 进程

共9条 1/1 1 跳转至

dizhenfeng MCU开发板DIY 进程

助工
2011-11-29 16:45:00     打赏

一、进程展示,持续更新
      1、11月28号上午领到板子,下午去电子市场买的器件,晚上加班焊完,并测试了流水灯程序,今上午测试了 按键程序、数码管静态、动态显示、DS18B20测温,LCD1602显示功能。

采购器件 用了一下午,PCF8591和双色点阵没买到,打算从网上买了。
其他的器件都买全了,能够实现大部分功能了。

焊接还好吧,挺顺利的,注意LED灯的 正负,电解电容的正负端,DS18B20,红外接收,蜂鸣器,7805的管脚,排阻,ISP接口别插反了。还得有一个好烙铁。


2、上传我的劳动成果(没有相机,手机照相质量一般....),同时感谢电子产品世界,感谢网站提供的板子!!!


     
 

3、调试时遇到的问题
下进LED小灯程序后什么反应都没有,最后发现是供电的原因:我用5V供电,但没有短接J8;没有短接J8的话要用9-15V供电的。



发现这个原因后我到处找J8,结果在一个角落里发现它,短接后就OK了。
J8的位置,在电源供电口的上方,如图:


4、跑马灯


5、LCD显示DS18B20温度:


6、数码管动态显示:

7、数码管静态显示,按键显示加1:



8、步进电机




关键词: dizhenfeng     开发     进程    

助工
2011-11-29 17:40:36     打赏
2楼

谢谢捧场,这两天闲着,就做这个了。


助工
2011-11-29 22:00:45     打赏
3楼

明天继续上传...


助工
2011-11-30 16:23:35     打赏
4楼
11.30
调试18B20测温+LCD1602A显示



助工
2011-12-01 10:48:44     打赏
5楼

继续干活,自己想做个 USBASP谁那有原理图和程序啊,驱动我有了


助工
2011-12-05 11:40:44     打赏
6楼
哈哈,今天看步进电机

助工
2011-12-06 11:08:18     打赏
7楼
步进电机搞定

助工
2011-12-06 15:50:32     打赏
8楼

/*步进电机型号MP28GA,五线四相电机。 P1.0~P1.3依次接ULN2003的IN2~IN5, ULN2003的输出OUT2~OUT3接步进电机的四相。*/ 

#include <reg52.h>
unsigned char code F_Rotation[4]={0xfc,0xf9,0xf3,0xf6};

void Delay(unsigned int i)//延时
{
 while(--i);
}

main()
{
 
 unsigned char i;

 while(1)
 {
  for(i=0;i<4;i++)      //4相
     {
     P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格
     Delay(300);        //改变这个参数可以调整电机转速
  }
  }
}


助工
2011-12-13 11:49:01     打赏
9楼

DS18B20+LCD显示程序       
——回复可见内容——#include < reg51.h >
#include < intrins.h >

#define uchar unsigned char
#define uint  unsigned int

sbit DQ = P1^3 ;  //定义DS18B20端口DQ 
sbit BEEP=P1^0  ; //蜂鸣器驱动线

bit presence  ;

sbit LCD_RS = P2^4 ;            
sbit LCD_RW = P2^5 ;
sbit LCD_EN = P2^6 ;

uchar code  cdis1[ ] = {" Robotic Center "} ;
uchar code  cdis2[ ] = {" WENDU:    .  C "} ;
uchar code  cdis3[ ] = {" DS18B20  ERR0R "} ;
uchar code  cdis4[ ] = {"  PLEASE CHECK  "} ;

unsigned char data  temp_data[2] = {0x00,0x00} ;
unsigned char data  display[5] =   {0x00,0x00,0x00,0x00,0x00} ;
unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                        0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
void beep() ;
unsigned char code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;

#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;

/*******************************************************************/
void delay1(int ms)
{
 unsigned char y ;
  while(ms--)
 {
  for(y = 0 ; y<250 ; y++)
  {
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
  }
 }
}

/******************************************************************/
/*检查LCD忙状态                                                   */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。   */
/******************************************************************/
bit lcd_busy()
 {                         
    bit result ;
    LCD_RS = 0 ;
    LCD_RW = 1 ;
    LCD_EN = 1 ;
    delayNOP() ;
    result = (bit)(P0&0x80) ;
    LCD_EN = 0 ;
    return(result) ;
 }

/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。          */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                         
   while(lcd_busy()) ;
    LCD_RS = 0 ;
    LCD_RW = 0 ;
    LCD_EN = 0;
    _nop_() ;
    _nop_() ;
    P0 = cmd ;
    delayNOP() ;
    LCD_EN = 1 ;
    delayNOP() ;
    LCD_EN = 0 ; 
}

/*******************************************************************/
/*写显示数据到LCD                            */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。       */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                         
   while(lcd_busy()) ;
    LCD_RS = 1 ;
    LCD_RW = 0 ;
    LCD_EN = 0 ;
    P0 = dat ;
    delayNOP() ;
    LCD_EN = 1 ;
    delayNOP() ;
    LCD_EN = 0 ;
}


/*  LCD初始化设定                                                  */
/*******************************************************************/
void lcd_init()
{
    delay1(15) ;  
    lcd_wcmd(0x01) ;      //清除LCD的显示内容           
    lcd_wcmd(0x38) ;      //16*2显示,5*7点阵,8位数据
    delay1(5) ;
    lcd_wcmd(0x38) ;        
    delay1(5) ;
    lcd_wcmd(0x38) ;        
    delay1(5) ;

    lcd_wcmd(0x0c) ;      //显示开,关光标
    delay1(5) ;
    lcd_wcmd(0x06) ;      //移动光标
    delay1(5) ;
    lcd_wcmd(0x01) ;      //清除LCD的显示内容
    delay1(5) ;
}

/*  设定显示位置                                    */
/*******************************************************************/
void lcd_pos(uchar pos)
{                         
  lcd_wcmd(pos | 0x80) ;  //数据指针=80+地址变量
}

/*自定义字符写入CGRAM                                   */
/*******************************************************************/
void  writetab() 

    unsigned char i ;
    lcd_wcmd(0x40) ;            //写CGRAM
    for (i = 0 ; i< 8 ; i++)      
    lcd_wdat(mytab[ i ]) ;       
}

/*us级延时函数                                        */
/*******************************************************************/

void Delay(unsigned int num)
{
  while( --num ) ;
}

/*初始化ds1820                                      */
/*******************************************************************/
Init_DS18B20(void)

     DQ = 1 ;      //DQ复位
     Delay(8) ;    //稍做延时

     DQ = 0 ;      //单片机将DQ拉低
     Delay(90) ;   //精确延时 大于 480us

     DQ = 1 ;       //拉高总线
     Delay(8) ;

     presence = DQ ;    //如果=0则初始化成功 =1则初始化失败
     Delay(100) ;
     DQ = 1 ;
    
     return(presence) ; //返回信号,0=presence,1= no presence
}


/* 读一个字节                     */
/*******************************************************************/
 ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;

for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ; // 给脉冲信号
    dat >>= 1 ;
    DQ = 1 ; // 给脉冲信号

    if(DQ)
     dat |= 0x80 ;
    Delay(4) ;
  }

    return (dat) ;
}

/* 写一个字节                                         */
/*******************************************************************/
 void WriteOneChar(unsigned char dat)
{
  unsigned char i = 0 ;
  for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ;
    DQ = dat&0x01 ;
    Delay(5) ;

    DQ = 1 ;
    dat>>=1 ;
  }
}

/* 读取温度                            */
/*******************************************************************/
 void Read_Temperature(void)
{
     Init_DS18B20() ;
 
     WriteOneChar(0xCC) ;  // 跳过读序号列号的操作
     WriteOneChar(0x44) ;  // 启动温度转换

     Init_DS18B20() ;
     WriteOneChar(0xCC) ;  //跳过读序号列号的操作
     WriteOneChar(0xBE) ;  //读取温度寄存器

     temp_data[0] = ReadOneChar() ;   //温度低8位
     temp_data[1] = ReadOneChar() ;   //温度高8位
}

/* 数据转换与温度显示                                              */
/*******************************************************************/
 void Disp_Temperature()
{
  display[4]=temp_data[0]&0x0f ;
  display[0]=ditab[display[4]]+0x30 ;     //查表得小数位的值
 
  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
  display[3]=display[4]/100+0x30 ;
  display[1]=display[4]%100 ;
  display[2]=display[1]/10+0x30 ;
  display[1]=display[1]%10+0x30 ;

    if(display[3]==0x30)        //高位为0,不显示
   {
     display[3]=0x20 ;             
     if(display[2]==0x30)      //次高位为0,不显示
     display[2]=0x20 ;
   }

     lcd_pos(0x48) ;            
     lcd_wdat(display[3]) ;        //百位数显示
     lcd_pos(0x49) ;            
     lcd_wdat(display[2]) ;        //十位数显示
  lcd_pos(0x4a) ;            
     lcd_wdat(display[1]) ;        //个位数显示
  lcd_pos(0x4c) ;            
     lcd_wdat(display[0]) ;        //小数位数显示

/*******************************************************************/
/* 蜂鸣器响一声                 */
/*******************************************************************/
void beep()
  {
    unsigned char y ;
    for (y=0 ;y<100 ;y++)
    {
      Delay(60) ;
      BEEP=!BEEP ;                //BEEP取反
    }
    BEEP=1 ;                      //关闭蜂鸣器
 Delay(40000) ;
  }

/* DS18B20 OK 显示菜单                                             */
/*******************************************************************/
void  Ok_Menu ()
{
    uchar  m ;
    lcd_init() ;                //初始化LCD
           
    lcd_pos(0) ;                //设置显示位置为第一行的第1个字符
     m = 0 ;
    while(cdis1[m] != '\0')
     {                         //显示字符
       lcd_wdat(cdis1[m]) ;
       m++ ;
     }

    lcd_pos(0x40) ;             //设置显示位置为第二行第1个字符
     m = 0 ;
    while(cdis2[m] != '\0')
     {
       lcd_wdat(cdis2[m]) ;      //显示字符
       m++ ;
     }

     writetab() ;               //自定义字符写入CGRAM
     delay1(5) ;
     lcd_pos(0x4d) ;
     lcd_wdat(0x00) ;          //显示自定义字符
}


/* DS18B20 ERROR 显示菜单                             */
/*******************************************************************/
void  Error_Menu ()
{
     uchar  m ;
     lcd_init() ;                //初始化LCD
 
    lcd_pos(0) ;                //设置显示位置为第一行的第1个字符
     m = 0 ;
     while(cdis3[m] != '\0')
     {                         //显示字符
       lcd_wdat(cdis3[m]) ;
       m++ ;
     }

     lcd_pos(0x40) ;             //设置显示位置为第二行第1个字符
     m = 0 ;
     while(cdis4[m] != '\0')
     {
       lcd_wdat(cdis4[m]) ;      //显示字符
       m++ ;
     }
}


/* 主函数     */
/************************************/
void main()
 {
     Ok_Menu () ;

 do
  {
      Read_Temperature() ;
   Disp_Temperature() ;
     }
    while(!presence)  ;

     Error_Menu () ;

 do
  { 
    Init_DS18B20() ;
    beep() ;
     }
 while(presence) ;
}——回复可见内容——


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]