打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
51单片机制作实践

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


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

原文:http://www.jdwx.info/thread-721790-1-1.html

#include  

#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<>

  {

    j=tmpreadbit();

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

  }

  return(dat);

}


void tmpwritebyte(uchar dat)

{

  uint i;

  uchar j;

  bit testb;

  for(j=1;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<>

   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;}

}



家电维修技术论坛jdwx-cn
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DS18B20 测温程序完全解读
51单片机学习
51单片机矩阵键盘扫描程序
51/51单片机第9课:DS18B20温度检测系统
怎样用keil编写4位数码管显示1234的程序
51单片机超声波测距C程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服