论坛 » DIY与开源设计 » 电子DIY

         

我等你好久了 MCU DIY进程帖

助工
2011-11-08 18:19  1楼
              昨天已发出申请,现在就期待中吧.......
助工
2011-11-14 23:03  2楼

呵呵!申请通过了,开始准备采购器件了。。。期待PCB中。。。

助工
2011-12-07 18:30  3楼
          出来冒冒泡。。。   
          开发板已收到有一个多星期了!最近忙于工作的事情,一直没有来的及上图!
          元件在板没有到来之前都已经买好了!现在就利用休息的时间,把开发板焊接好吧!
          期待自己的作品!
      
助工
2011-12-13 22:13  4楼
1128号一上班,就从门卫那里,拿到了期待已久的快递!真的很激动,毕竟,第一次参加这样的活动!很急切的就拆开快递袋,一睹为快!      之前几天,在论坛里,看到别的参与者发布的照片,不知道有多羡慕啊!呵呵。。。
           在等待快递的时候,已从淘宝上买过一次元件!可是看到实物后,才发现,好多元件都买错了!之前看了PCB的照片,以为都是贴片!可是,并不是想象中的那样!    没有办法,只好又进行第二次淘宝!有得元件已焊接上,等的就是剩下的元件了!    看着各位参与者公布的进程,心急啊。。。
             元件回来之后,忙于工作上事情。以致于,焊接又耽误了几天的时间!不过,挤出了时间,完成了焊接!
      
          天天看论坛中的帖子,知道PCB板有点瑕疵!看着坛友们的解决方法,我选择了改变三极管的形式!这样,看起来,对整个布局没有多大影响!在这里谢谢那些坛友们。。。       在这里,给大家提一个小小的建议哟!由于LM7805没有散热器,而板上也没有考虑到这个问题!所以,在焊接得时候,把LM7805散热部分下的绿油刮下!(不要挂到旁边的+5V电源的走线哟)对7805引脚整形好后,稍微将7805往前推,即固定孔与板的安装孔稍微错开点!然后,用焊锡将7805的散热部分焊接在PCB板上。这样即可以利用板散热,也固定了7805。(在其7805背面涂抹导热硅脂,这样效果会更好)          自己做的一个外接电源板!由于自己电脑配置很差,所以,不想从电脑取电!
                 闲置的一个小环牛,拿来直接带我的电源板!呵呵。。
        电路已调通,剩下的就是一步步的去实现各模块功能了!相信自己,加油。。。各位坛友们,一起加油吧。。。  
助工
2011-12-30 22:28  5楼
没有想到这么快就到了活动结束的时间!                 看着自己的开发板,忍不住有些感慨! 很早之前在学校的时候就接触了51单片机,后来可是由于到外地工作,接触的和单片机没有关系!在枯燥无味的工作中,度过了两年多的时间。可是,也正因为这样,才导致对单片机编程有了很大的阻碍!
              无意间在邮箱中,看到的EEPW发过来了“自己DIY—MCU开发板”邮件。忍不住提出了申请,可是我也没有报太多的希望!毕竟,感觉离单片机已很遥远了!在期盼中,收到了来自“EEPW“的礼物!              很感谢“EEPW”,毕竟正是因为这次活动,才让我更深层次的接触单片机吧!之前,也没有放弃过,利用工作的闲暇时间,用万用板搭过最小系统电路,进行着很简单的模块实验!             工作之余的时间,毕竟不是很多。由于自己对编程有点困难,所以,这次活动,开发板上各模块功能的实现,完成的并不是很多!感觉有一些歉意,对不住来自“EEPW”的这份礼物!             活动虽然结束了,但是,我会继续用这份礼物,来实现自己心中曾经的那份梦想!             在这里,很感谢此次活动的组织者,很感谢来自论坛的各位坛友们!特别是 “四弦”,“ goodboy3021”,“jjjsj”,“shangziyun” , 因为我曾悄悄的从他们的帖子里“偷“走了一些源程序。呵呵!记得的也就这么多吧,毕竟论坛里的帖子很多!             各位坛友们,继续加油吧!
助工
2011-12-30 22:34  6楼


最简单的跑马灯:
#include <reg52.h>

void delay(unsigned int cnt)
{
 while(--cnt);
}
main()
{
   P1=0xfe;   //初始字符显示,1111 1110
   while(1)
   {
     delay(30000);
  P1>>=2;   //左移两位,即P1=P1>>2
  P1|=0x02;  //
  if(P1==0x6f)//检测是否到最右端
  {
    delay(30000);
    P1=0xfe;
  }
   }
}

助工
2011-12-30 22:38  7楼
  数码管动态显示:

#include <STC89.H>
unsigned char display[11]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//显示数码组
//0,1,2,3,4,5,6,7,8,9,.
void delay_MS(unsigned int a)
 {
 unsigned int i;
  while (a--!=0)
  {
   for(i=0;i<125;i++);
  }
 }
 void main (void)
 {
   unsigned char i,j,k;
   while(1)
   {
   for(i=0;i<11;i++)
     {
    P0=display[i];
     for(k=1;k<100;k++)
  {
   for(j=0;j<8;j++) //从地位往高位扫描显示P0.1~P0.7
   {
   P2=j;
   delay_MS(1);
   }
  }
     }
   }
 }

助工
2011-12-30 22:45  8楼

点阵检测:(在这里需要把J6的掉线冒,插在P3.7与VCC上),
全红:
#include <STC89.H>
sbit LE=P3^7;
main()
{
 LE=1;
 P0=0xFF;
 LE=0;

 P0=0xFF;
 P2=0;
 while(1);

}


全绿:
#include <STC89.H>
sbit LE=P3^7;
main()
{
 LE=1;
 P0=0xFF;
 LE=0;

P0=0;
 P2=0xFF;
 while(1);

}

助工
2011-12-30 22:52  9楼

1602静态字符显示:
#include<reg52.h> //
#include<stdio.h> //#include<intrins.h>


sbit RS = P2^4; //Pin4
sbit RW = P2^5; //Pin5
sbit E  = P2^6; //Pin6

#define Data  P0//数据端口

char data TimeNum[]="                ";
char data Test1[]="                  ";
void DelayUs(unsigned char us)//delay us
{
 unsigned char uscnt;
 uscnt=us>>1;        /*12MHz频率*/
 while(--uscnt);
}
void DelayMs(unsigned char ms)
{
 while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
  DelayUs(250);
  DelayUs(250);
   }
}
void WriteCommand(unsigned char c)
{
 DelayMs(5);
 E=0;
 RS=0;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
}
void WriteData(unsigned char c)
{
 DelayMs(5);  
 E=0;
 RS=1;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
 RS=0;
}
void ShowChar(unsigned char pos,unsigned char c)
{
 unsigned char p;
 if (pos>=0x10)
    p=pos+0xb0; 
 else
    p=pos+0x80; 
 WriteCommand (p);
 WriteData (c);  
}
void ShowString (unsigned char line,char *ptr)
{
 unsigned char l,i;
 l=line<<4;
 for (i=0;i<16;i++)
  ShowChar (l++,*(ptr+i));
}
void InitLcd()
{
 DelayMs(15);
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x06); //显示光标移动位置
 WriteCommand(0x0c); //显示开及光标设置
 WriteCommand(0x01); //显示清屏

}


void main(void)

{
InitLcd();        
DelayMs(15);      
sprintf(Test1,"  www.EEPW.com  ");
ShowString(0,Test1);

sprintf(TimeNum,"LCD1602 Test ok!");
ShowString(1,TimeNum);

while(1);

}

助工
2011-12-30 23:08  10楼

最后一个实现的模块了!程序还在研究中,这个是借鉴别人的程序。
快过年了,忙于工作上的事情,可能开发板要搁置一段时间了。。。
      祝各位坛友们新年愉快。。。
DS18B20温度显示:
  #include<reg52.h> 
#include<math.h>
#include<INTRINS.H>

#define uchar unsigned char
#define uint   unsigned int;

sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^3;//ds18b20 端口
sfr dataled=0x80;//显示数据端口

uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
                                               //7段数码管段码表共阳
uchar  str[6];

void delay1(uchar MS);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);

main()
{
unsigned char TempH,TempL;
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00; 
count=0;
while(1)
{
   str[5]=0x39;         //显示C符号
   str[1]=tab[TempH/100]; //十位温度
   str[2]=tab[(TempH%100)/10]; //十位温度
   str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点
   str[4]=tab[TempL];
  if(flag_get==1)       //定时读取当前温度
    {
  temp=ReadTemperature();
  if(temp&0x8000)
     {
     str[0]=0x40;//负号标志
     temp=~temp;  // 取反加1
  temp +=1;
  }
  else
     str[0]=0;
  TempH=temp>>4;
  TempL=temp&0x0F;
  TempL=TempL*6/10;//小数近似处理
  flag_get=0;
    }
  }
}



void tim(void) interrupt 1 using 1
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if (num==50)
    {num=0;
   flag_get=1;//标志位有效
      second++;
       if(second>=60)
         {second=0;
           minute++; 
          }
      }
count++;
if(count==1)
   {P2=0;
    dataled=str[0];}//数码管扫描
if(count==2)
   {P2=1;
    dataled=str[1];}
if(count==3)
   { P2=2;
     dataled=str[2];
     }
if(count==4)
   { P2=3;
     dataled=str[3];
     }
if(count==5)
   { P2=4;
     dataled=str[4];
     }
if(count==6)
   { P2=5;
     dataled=str[5];
     count=0;}
}

void delay(unsigned int i)//延时函数
{
 while(i--);
}

void Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay(10);
 x=DQ;      
 delay(5);
}


unsigned char 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(5);
 }
 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;
 }
delay(5);
}


unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位

b<<=8;
t=a+b;

return(t);
}

共10条 1/1 1 跳转至

回复

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