[分享] 51单片机制作实践
456 查看
2 回复
 楼主 | 发布于 2018-09-29 | 只看楼主
分享到:

自学51单片机有1个月左右的时间了,通过这段时间的学习,对单片机的基本操作和编程方法算是有一个基本的认知,本人学习51不为别的,只有两个字,“好玩”!学会了用它做自己想玩的东西,有的人会说,真可笑,什么年代了,想玩的话,只要有钱什么东西买不到,错!买到的东西再好,那不是自己做出来的,只有通过自己学到的知识做自己想要的东西,那才是最好玩的,通过自己的学习,一步步的实践,经历无数次的失败、查资料、反复折腾,到最后的成功,这种喜悦的心情我想只有经历过的人才能体会,说了这些其实还是希望通过此文激励一下大家,科技飞速发展的今天,好玩的东西有很多,唯有学习最快乐!

       好了,说了这么多,说点正经事吧,刚才说到哪了,哦,对了,单片机是吧,好多人会问,单片机究竟能做啥?我来告诉大家,单片机可以这样来理解,只要是与控制电路有关的电路,都可以用单片机来完成,小到儿童玩具、按摩器,大到工厂设备、机器人、导弹和卫星!只是应用场合的不同,单片机的性能也不一样,当然要想达到设计卫星的级别也不是一件容易的是,本人的目的很简单,学会它,用来做自己想要的东西玩,下面是本人用51系列单片机STC8952为核心制作的电水壶控制板,工作过程如下:“接通电源不工作,按下启动键首先做数码管上显示ON,几秒后进入加热状态并显示当前水温,当中途按下停止按键时,加热停止并做数码管显示静态字母OFF,当水温达到100度时,停止加热,并保持数字100不变,同时喇叭里发出;水开了,快来呀!一会儿水烧干了!的语音提醒(我录的 ),虽然看起来不复杂,但也用到了不少关于单片机理论方面的知识,比如按键检测、数码管动态扫描原理、以及各种语句语法的使用等,说实话,改这个电水壶还真没什么意义,但是换个角度想,通过改电水壶我还真学到了好多新的东西,因为做这个板子并不是一帆风顺的,比如为了让刚刚按下启动键的时候显示个“ON”,停留一会儿自动消失,再进入温度检测大循环;按下停止键时显示“OFF”,当温度达到100时,让单片机相应的IO口输出低电平,停止加热,并让数码管锁定当前温度不再变化等等,这些问题对我一个初学而言真的要费一番周折,哪个地方不懂了,就针对哪个地方上百度,看视频,不断的学习,终于做出了我想要的东西。一会儿我把代码发给大家帮我指点指点,比如哪个地方可以有更简便的方法,哪个地方的语法不正确等等,本人感激不尽,本人这个程序里没有解决的BUG也有很多,比如工作中按下停止键显示OFF,然后再按启动键是无效的,真诚的希望师傅们的批评指教!


#include<reg52.h>  

#define uchar unsigned char

#define uint unsigned int

sbit DS=P2^2;

uint temp;

uchar flag1;

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

sbit jiare=P1^4;

uchar code table[]=

{0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar code table1[]=

{0xbf,0x86,0xdb,0xcf,

0xe6,0xed,0xfd,0x87,

0xff,0xef};

sbit K1=P3^4;

sbit K2=P3^5;

sbit OFF=P1^2;

uchar a;

void delayms(uint z)

{

uint x,y;

for(x=z;x>0;x--)

 for(y=110;y>0;y--);

}

void delay(uint count)

{

 uint i;

 while(count)

  {

   i=200;

   while(i>0)

   i--;

   count--;

  }

}

void dsreset(void)

{

 uint i;

 DS=0;

 i=103;

 while(i>0)i--;

 DS=1;

 i=4;

 while(i>0)i--;

}

bit tmpreadbit(void)

{

  uint i;

  bit dat;

  DS=0;i++;

  DS=1;i++;i++;

  dat=DS;

  i=8;while(i>0)i--;

  return (dat);

}

uchar tmpread(void)

{

 uchar i,j,dat;

 dat=0;

 for(i=1;i<=8;i++)

 {

   j=tmpreadbit();

   dat=(j<<7)|(dat>>1);

 }

 return(dat);

}


void tmpwritebyte(uchar dat)

{

 uint i;

 uchar j;

 bit testb;

 for(j=1;j<=8;j++)

{

   testb=dat&0x01;

   dat=dat>>1;

   if(testb)//write 1

    {

     DS=0;

     i++;i++;

     DS=1;

     i=8;while(i>0)i--;

    }

   else

     {

     DS=0;//write 0

     i=8;while(i>0)i--;

     DS=1;

     i++;i++;

     }

}

}

void tmpchange(void)

{

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);

  tmpwritebyte(0x44);

}

uint tmp()

{

  float tt;

  uchar a,b;

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);

  tmpwritebyte(0xbe);

  a=tmpread();

  b=tmpread();

  temp=b;

  temp<<=8;

  temp=temp|a;

  tt=temp*0.0625;

  temp=tt*10+0.5;

  return temp;

}

void display(uint temp)//显示程序

{

   uchar A1,A2,A2t,A3;

   A1=temp/100;

   A2t=temp%100;

   A2=A2t/10;

   A3=A2t%10;

   dula=0;

   P0=table[A1];//显示百位

   dula=1;

   dula=0;


   wela=0;

   P0=0x7e;

   wela=1;

   wela=0;

   delay(3);


   dula=0;

   P0=table1[A2];//显示十位

   dula=1;

   dula=0;


   wela=0;

   P0=0x7d;

   wela=1;

   wela=0;

   delay(3);


   P0=table[A3];//显示个位

   dula=1;

   dula=0;


   P0=0x7b;

   wela=1;

   wela=0;

   delay(0.5);

}

void main()

{  

 uchar at;

 uint x,y;

 jiare=0;

 if(K1==0)

 {x=300; jiare=1;

 while(x--)  

  {

    for(y=100;y;y--);

 dula=1;

 P0=0x3f;

 dula=0;


 wela=1;

 P0=0x7e;

 wela=0;

 delayms(1);


 dula=1;

 P0=0x37;

 dula=0;


 wela=1;

 P0=0x7d;

 wela=0;

 delayms(1);


 dula=1;

 P0=0x0;

 dula=0;


 wela=1;

 P0=0x7b;

 wela=0;

 delayms(1);

 }

 at=1;}

 else{at=0;}

 while(at)

   {

   do

     {

     tmpchange();

 for(a=10;a>0;a--)

   {  

   display(tmp());

   }

if(temp>=910)  

 { OFF=1;jiare=0;  

 while(1)

 {

 dula=1;

 P0=0x6;

 dula=0;

 wela=1;

 P0=0x7e;

 wela=0;

 delayms(1);

 dula=1;

 P0=0x3f;

 dula=0;

 wela=1;

 P0=0x7d;

 wela=0;

 delayms(1);

 dula=1;

 P0=0x3f;

 dula=0;

 wela=1;

 P0=0x7b;

 wela=0;

 delayms(1);

 if(K2==0)

   {break;}

   }

 }

 else

 {

 OFF=0;

 }

 if(K2==0)

  {OFF=0;jiare=0;

 while(1)  

  {

 dula=1;

 P0=0x3f;

 dula=0;

 P0=0xff;

 wela=1;

 P0=0x7e;

 wela=0;

 delayms(1);


 dula=1;

 P0=0x71;

 dula=0;

 P0=0xff;

 wela=1;

 P0=0x7d;

 wela=0;

 delayms(1);


 dula=1;

 P0=0x71;

 dula=0;

 P0=0xff;

 wela=1;

 P0=0x7b;

 wela=0;

 delayms(1);}

   }  

 }

 while(1);

 }

   if(K1==1)  

 {OFF=0;}

}

(0 ) (0 )
回复 举报

回复于 2018-09-30 沙发

楼主不像是新手,是老鸟。
(0 )
评论 (0) 举报

回复于 2018-10-20 2#

(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部