打印

自制<<手把手教你学单片机C程序设计>>实验板

[复制链接]
楼主: gdqinci
手机看帖
扫描二维码
随时随地手机跟帖
121
gdqinci|  楼主 | 2010-5-14 11:13 | 只看该作者 回帖奖励 |倒序浏览
谢谢楼上诸位兄弟的鼓励*^_^*

117楼的兄弟说得对,学习单片机还是买个开发板好,我们这的开板费是300块。制板厂还不一定要接,特别是像这种只做十几块的板子,因为不是做产品的,所以量不大,制板厂一般不想接这样的单。还得托制板厂里的熟人他们才愿意帮我做。光是开板前前后后花500多块,包括增加的PCB板的钱和打车去拿板的费用。而板子从电路设计,主要是排除原书中板子的电路错误和自己对电路进行改进,到PCB布线到元件采购,直至板子的焊接,这从头到尾用了好多时间和精力。但是最终弄出来的板子我自己仅需要一块来做实验,其它的对于我来说是一种浪费。而这种浪费是在我花费了好多时间精力和用了几百块大洋换来的,真是说不出什么味道啊.....
因为书中到目前为止还只是介绍简单的I/O口操作和数据处理,所以我也仅是跟着书本中的实验做下去而已,书后面会有相对深入的中断、定时器相关实验,我的板子上也有跟实验配套的硬件电路,到我读到那里的时候也会有相关的实验结果贴到帖子上来跟大家共享。

当时自己去开这块坂的原因是因为发现原书中的电路有比较大的误,而且到作者网站上去找他们推荐的实验板也觉得他们的板子相对比较贵,好像是一块要450元。我觉得一块电路上有错误又贵的板子买回来还不知道能不能用,那还不如自己开板做一块,但没想到最终花费的时间精力和投入的钱还不如买别人的板合算。

使用特权

评论回复
122
limin86918| | 2010-5-14 22:03 | 只看该作者
本帖最后由 limin86918 于 2010-5-14 22:06 编辑

我是21IC的新人,注册马甲不是很久,感觉在这坛子里或多或少总能有点收获。我也比较关注你这个帖子,感觉你能够做到这个程度真的很不错,很有耐性,非常佩服楼主的勇气!有付出总会有回报的,我始终相信着这句话。虽然我也只能在单片机这个领域算是入了门,不是高手、大鸟,希望你能够**走下去,未来在这个领域有所成就。
  话说,你这开板费也太贵了吧,我上次也开了10块板,带税也才花了200多,上次我在淘宝上联系了一家制PCB的厂商,价格也是非常便宜的,你以后不清楚价格啥的,可以在淘宝上先搜搜,行情就了解了,嘿嘿,这就是我的省钱攻略,我每次都能花最少的钱办好事情。
  我现在是一个研究生,电气工程的,如果有什么可以帮上忙的,可以发邮件给我:
liminbest86918@126.com

使用特权

评论回复
123
gdqinci|  楼主 | 2010-5-14 22:33 | 只看该作者
好的,谢谢你楼上的兄弟......

使用特权

评论回复
124
xiaomifan| | 2010-5-15 12:32 | 只看该作者
好,仔细瞧瞧

使用特权

评论回复
125
gdqinci|  楼主 | 2010-5-17 08:57 | 只看该作者
本帖最后由 gdqinci 于 2010-5-21 22:49 编辑

第15章

计时器设计实验

#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------------------------------
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//----------------------------------------------------------------------
uint hour;
uchar min,sec,cnt;
//-------------------
void delay(uint k);
//-------------------
struct deda
{
uint dhour;
uchar dmin;
uchar dsec;
};
struct deda dis_buff;
//--------------------
void initial(void)
{
TMOD=0x01;
TH0=-(50000/256); //TH0=(65536-50000)/256;  //定时器T0的高八位赋值
TL0=-(50000%256); //TL0=(65536-50000)%256;  //定时器T0的低八位赋值
ET0=1;
TR0=1;
EA=1;
}
//-------------------
void time0(void)interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%256);
cnt++;
if(cnt>=20){sec++;cnt=0;}
if(sec>=60){min++;sec=0;}
if(min>=60){hour++;min=0;}
if(hour>9999){hour=0;}
dis_buff.dhour=hour;
dis_buff.dmin=min;
dis_buff.dsec=sec;
}
//=====================
void main(void)
{
initial();
for(;;)
    {
     P0=SEG7[dis_buff.dhour%10];
  P2=ACT[4];
  delay(1);
  //--------------------------------
  P0=SEG7[(dis_buff.dhour%100)/10];
  P2=ACT[5];
  delay(1);
  //--------------------------------
  P0=SEG7[(dis_buff.dhour%1000)/100];
  P2=ACT[6];
  delay(1);
  //--------------------------------
  P0=SEG7[dis_buff.dhour/1000];
  P2=ACT[7];
  delay(1);
  //--------------------------------
  P0=SEG7[dis_buff.dsec%10];
  P2=ACT[0];
  delay(1);
  //--------------------------------
  P0=SEG7[dis_buff.dsec/10];
  P2=ACT[1];
  delay(1);
  //--------------------------------
  P0=SEG7[dis_buff.dmin%10];
  P2=ACT[2];
  delay(1);
  //--------------------------------
  P0=SEG7[dis_buff.dmin/10];
  P2=ACT[3];
  delay(1);
  }
}
//========================================
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
  {
    for(j=0;j<121;j++)
     {;}
  }
}
//========================

CS15-1.jpg (100.38 KB )

CS15-1.jpg

使用特权

评论回复
126
gdqinci|  楼主 | 2010-5-17 08:58 | 只看该作者
因为数码相机没了,过几天再把实验结果的照片传上来

使用特权

评论回复
127
gdqinci|  楼主 | 2010-5-17 11:49 | 只看该作者
本帖最后由 gdqinci 于 2010-5-21 22:49 编辑

跑表设计实验

#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------------------------------
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//----------------------------------------------------------------------
uchar status;
sbit OUT=P1^0;
void delay(uint k);
struct time
     {
       uchar sec;
       uchar msec;
     };
struct time run_time,set_time;
struct time *pt1,*pt2;
//--------------------
void initial(void)
{
TMOD=0x11;
TH0=-(10000/256);
TL0=-(10000%256);
TH1=-(1000/256);
TL1=-(1000%256);
ET0=1;ET1=1;TR1=1;
EA=1;
}
//-----------------------------
void time0(void)interrupt 1
{
TH0=-(10000/256);
TL0=-(10000%256);
run_time.msec++;
if(run_time.msec>99){run_time.sec++;run_time.msec=0;}
if(run_time.sec>99){run_time.msec++;run_time.sec=0;}
if((pt2->msec>0)||(pt2->sec>0))
   {
    if((pt1->msec==pt2->msec)&&(pt1->sec==pt2->sec)){TR0=0;OUT=0;}
   }
}
//--------------------------------------------------------------
void display(uchar cnt)
{
switch(cnt)
       {
        case 0:P0=SEG7[run_time.msec%10];P2=ACT[0];break;
        case 1:P0=SEG7[run_time.msec/10];P2=ACT[1];break;
        case 2:P0=SEG7[run_time.sec%10];P2=ACT[2];break;
        case 3:P0=SEG7[run_time.sec/10];P2=ACT[3];break;
        case 4:P0=SEG7[set_time.msec%10];P2=ACT[4];break;
        case 5:P0=SEG7[set_time.msec/10];P2=ACT[5];break;
        case 6:P0=SEG7[set_time.sec%10];P2=ACT[6];break;
        case 7:P0=SEG7[set_time.sec/10];P2=ACT[7];break;   
        default:break;
       }
}
//--------------------------------------------------------------
void set_ms_display(uchar cnt)
{
switch(cnt)
       {
        case 0:P0=SEG7[run_time.msec%10];P2=ACT[0];break;
        case 1:P0=SEG7[run_time.msec/10];P2=ACT[1];break;
        case 2:P0=SEG7[run_time.sec%10];P2=ACT[2];break;
        case 3:P0=SEG7[run_time.sec/10];P2=ACT[3];break;
        case 4:P0=SEG7[set_time.msec%10]|0x80;P2=ACT[4];break;
        case 5:P0=SEG7[set_time.msec/10]|0x80;P2=ACT[5];break;
        case 6:P0=SEG7[set_time.sec%10];P2=ACT[6];break;
        case 7:P0=SEG7[set_time.sec/10];P2=ACT[7];break;
        default:break;
       }
}
//--------------------------------------------------------------
void set_s_display(uchar cnt)
{
switch(cnt)
       {
        case 0:P0=SEG7[run_time.msec%10];P2=ACT[0];break;
        case 1:P0=SEG7[run_time.msec/10];P2=ACT[1];break;
        case 2:P0=SEG7[run_time.sec%10];P2=ACT[2];break;
        case 3:P0=SEG7[run_time.sec/10];P2=ACT[3];break;
        case 4:P0=SEG7[set_time.msec%10];P2=ACT[4];break;
        case 5:P0=SEG7[set_time.msec/10];P2=ACT[5];break;
        case 6:P0=SEG7[set_time.sec%10]|0x80;P2=ACT[6];break;
        case 7:P0=SEG7[set_time.sec/10]|0x80;P2=ACT[7];break;
        default:break;
       }
}
//--------------------------------------------------
void time1(void) interrupt 3
{
static uchar cnt;
TH1=-(1000/256);
TL1=-(1000%256);
cnt++;
if(cnt>7)cnt=0;
   switch(status)
         {
          case 5:display(cnt);break;
          case 0:display(cnt);break;
          case 1:set_ms_display(cnt);break;
          case 2:set_s_display(cnt);break;
          default:break;
         }
}
//------------------------------------
void key_s1(void)
{
P3=0xff;
if(P3==0xfb)
  {
   switch(status)
    {
    case 1:if(set_time.msec==99)set_time.msec=99;
            else set_time.msec++;break;
  case 2:if(set_time.sec==99)set_time.sec=99;
            else set_time.sec++;break;
  default:break;
    }
  }
}
//------------------------------------------------------
void key_s2(void)
{
P3=0xff;
if(P3==0xf7)
  {
   switch(status)
    {
    case 1:if(set_time.msec==0)set_time.msec=0;
            else set_time.msec--;break;
  case 2:if(set_time.sec==0)set_time.sec=0;
            else set_time.sec--;break;
  default:break;
    }
  }
}
//------------------------------------------------------
void key_s4(void)
{
P3=0xff;
if(P3==0xdf){status++;}
if(status==3)status=1;
if(status==6)
  {
   run_time.msec=0;
  run_time.sec=0;
  status=0;
  }
}
//------------------------------------------
void key_s3(void)
{
  P3=0xff;
  if(P3==0xef){status=5;TR0=1;}
}
//==================================
void main(void)
{
pt1=&run_time;pt2=&set_time;
initial();
for(;;)
    {
     key_s1();
  key_s2();
  key_s3();
  key_s4();
  delay(300);
  }
}
//========================================
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
  {
    for(j=0;j<121;j++)
     {;}
  }
}
//========================

CS15-2.jpg (76.55 KB )

CS15-2.jpg

使用特权

评论回复
128
gdqinci|  楼主 | 2010-5-17 11:50 | 只看该作者
这个实验程序调试运行正常,不过我分析不出T1的运行情况

使用特权

评论回复
129
gdqinci|  楼主 | 2010-5-18 09:40 | 只看该作者
本帖最后由 gdqinci 于 2010-5-21 22:49 编辑

计时器设计实验

#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------------------------------
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//----------------------------------------------------------------------
uint hour;
uchar min,sec,cnt;
uchar status;
void delay(uint k);
//---------------------------
union deda
{
uint dhour;
uchar dmin;
uchar dsec;
};
union deda dis_buff;
//--------------------
void initial(void)
{
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
ET0=1;
TR0=1;
EA=1;
}
//-----------------------------
void time0(void)interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%256);
cnt++;
if(cnt>=20){sec++;cnt=0;}
if(sec>=60){min++;sec=0;status++;}
if(min>=60){hour++;min=0;}
if(hour>9999){hour=0;}
if(status>2){status=0;}
switch(status)
  {
  case 0:dis_buff.dhour=hour;break;
    case 1:dis_buff.dmin=min;break;
case 2:dis_buff.dsec=sec;break;
default:break;
}
}
//==================================
void main(void)
{
initial();
for(;;)
    {
     switch(status)
      {
       case 0:{
         P0=SEG7[dis_buff.dhour%10];
              P2=ACT[0];
              delay(1);
              //--------------------------------
              P0=SEG7[(dis_buff.dhour%100)/10];
              P2=ACT[1];
              delay(1);
              //--------------------------------
              P0=SEG7[(dis_buff.dhour%1000)/100];
              P2=ACT[2];
              delay(1);
              //--------------------------------
              P0=SEG7[dis_buff.dhour/1000];
              P2=ACT[3];
              delay(1);
            }break;
   case 1:{
              P0=SEG7[dis_buff.dsec%10];
              P2=ACT[2];
              delay(1);
              //--------------------------------
              P0=SEG7[dis_buff.dsec/10];
              P2=ACT[3];
              delay(1);
        }break;
   case 2:{
              P0=SEG7[dis_buff.dmin%10];
              P2=ACT[0];
              delay(1);
              //--------------------------------
              P0=SEG7[dis_buff.dmin/10];
              P2=ACT[1];
              delay(1);
              }break;
   default:break;
   }
  }
}
//========================================
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
  {
    for(j=0;j<121;j++)
     {;}
  }
}
//========================

CS15-3.jpg (76.38 KB )

CS15-3.jpg

使用特权

评论回复
130
gdqinci|  楼主 | 2010-5-18 09:44 | 只看该作者
本帖最后由 gdqinci 于 2010-5-21 22:50 编辑

枚举类型实验

#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------------------------------
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(uint k);
//----------------------------------------------------------------------
enum week_day{mon=1,tue,wed,thu,fri,sat,sun};
enum week_day day;
//---------------------------------------------------------
void key_scan(void)
{
uchar temp;
P3=0xff;
temp=P3;
if(temp!=0xff)
  {
   switch(temp)
    {
     case 0xfb:day=mon;break;
   case 0xf7:day=tue;break;
   case 0xf3:day=wed;break;
   case 0xef:day=thu;break;
   case 0xeb:day=fri;break;
   case 0xe7:day=sat;break;
   case 0xe3:day=sun;break;
   default:break;
    }
  }  
}   
//==================================
void main(void)
{
for(;;)
    {
  key_scan();
  P0=SEG7[day];
  P2=ACT[0];
  delay(300);
  }
}
//========================================
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
  {
    for(j=0;j<121;j++)
     {;}
  }
}

CS15-4.jpg (68.95 KB )

CS15-4.jpg

使用特权

评论回复
131
gdqinci|  楼主 | 2010-5-21 22:51 | 只看该作者
下面是第16章

蜂鸣器发音实验
#include<REG51.H>
sbit BZ=P3^5;
//----------------
void initial(void)
{
TMOD=0x00;
TH1=0xf0;
TL1=0x0c;
IE=0x00;
TR1=1;
}
//-------------------
void main(void)
{
initial();
for(;;)
{
   while(!TF1);
   TF1=0;
   BZ=!BZ;
   }
}

使用特权

评论回复
132
gdqinci|  楼主 | 2010-5-21 22:54 | 只看该作者
定时器T1以方式1计数实验

#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint counter;
//----------------------------------------------------------------------
void initial(void)
{
TMOD=0x50;
TH1=0x00;
TL1=0x00;
IE=0x00;
TR1=1;
}
//-------------------------
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
    {
  for(j=0;j<121;j++)
     {;}
}
}
//-----------------------
void display(void)
{
P0=SEG7[counter%10];P2=ACT[0];delay(1);
P0=SEG7[(counter%100)/10];P2=ACT[1];delay(1);
P0=SEG7[(counter/100)%10];P2=ACT[2];delay(1);
P0=SEG7[counter/1000];P2=ACT[3];delay(1);
}
//==============================================
void main(void)
{
uint temp1,temp2;
initial();
for(;;)
{
  display();
  temp1=TL1;
  temp2=TH1;
  counter=(temp2<<8)+temp1;
  }
}

CS16-2.jpg (87.44 KB )

CS16-2.jpg

使用特权

评论回复
133
gdqinci|  楼主 | 2010-5-21 22:55 | 只看该作者
定时器T0以方式2定时实验

#include <REG51.H>
#define uchar unsigned char
uchar min,sec,cnt2,cnt1;
uchar out_val=0x0f;
//----------------------------------------------------------------------
void initial(void)
{
TMOD=0x02;
TH1=0x38;
TL1=0x38;
IE=0x00;
TR0=1;
P1=out_val;
}
//==============================================
void main(void)
{
initial();
for(;;)
{
  while(!TF0);
  TF0=0;
  if(++cnt1>=50){cnt1=0;cnt2++;}
  if(cnt2>=15){cnt2=0;sec++;}
  if(sec>=10){sec=0;min++;}
  if(min>=2){min=0;P1=~out_val;}
  }
}

CS16-3.jpg (91.83 KB )

CS16-3.jpg

使用特权

评论回复
134
gdqinci|  楼主 | 2010-5-21 22:57 | 只看该作者
这个实验好像有死循环,程序在进入循环后好像只走了一圈就不到走了

使用特权

评论回复
135
zzyaizll| | 2010-6-7 22:08 | 只看该作者
很好呀,向兄弟致敬,向你学习,如果咱们群里的兄弟都像你一样的话,那咱们这个论坛里的帖子质量就高了。

使用特权

评论回复
136
yangwen123ok| | 2010-6-7 22:34 | 只看该作者
留个记号啊

使用特权

评论回复
137
ytfyiu| | 2010-6-8 16:20 | 只看该作者
这本书,关于1602的实验在proteus是不能防真的。
     个人感觉是他检忙碌的时序不对,作者给我回邮件说防真和真实硬件之间是有区别的。我手上又没有1602的显示屏,无法证明他的说法。望LZ能做下实验

使用特权

评论回复
138
gdqinci|  楼主 | 2010-6-11 17:18 | 只看该作者
好的,过几天做,我已经看到21章了,接下到22章就是1602液晶屏了,到时候有了结果我通知你来看

使用特权

评论回复
139
gdqinci|  楼主 | 2010-6-12 09:41 | 只看该作者
我一般不喜欢仿真,因为仿真跟实际工程确实有比较大的区别。所以我也不建议别人仿真,还是老老实实地搭个电路吧。确实没时间搭电路或者跟我一样已经对搭电路比较上手的话可以自己买个实验板来用。

使用特权

评论回复
140
gdqinci|  楼主 | 2010-6-12 11:28 | 只看该作者
本帖最后由 gdqinci 于 2010-6-12 11:30 编辑

下面是第17章

单片机与PC机的通信实验1
#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//----------------------------------------------------------------------
uchar code as[]="Receving Data:\0";
uchar a=0x30,b;
//-------------------------------------
void init(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
ES=1;
EA=1;
}
//-------------------------
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
    {
  for(j=0;j<121;j++)
     {;}
}
}
//==============================================
void main(void)
{
uchar i;
init();
while(1)
{
  P0=SEG7[(a-0x30)/10];
  P2=ACT[1];
  delay(1);
  //----------------------
  P0=SEG7[(a-0x30)%10];
  P2=ACT[0];
  delay(1);
  //----------------------
  if(RI)
  {
   RI=0;
   i=0;
   while(as
!='\0')
        {
   SBUF=as
;
   while(!TI);
   TI=0;
   i++;
   }
   SBUF=b;
   while(!TI);
   TI=0;
   EA=1;
   }
  }
}
//=======================================================
void serial_serve(void) interrupt 4
{
a=SBUF;
b=a;
EA=0;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则