专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

学习单片机的日记

作者:佚名   来源:本站原创   点击数:  更新时间:2013年10月21日   【字体:
   经历了大一上学期我觉得大学其实好坏不在于学校而是在于个人,学校之间的差距只是在于可利用的教学资源以及环境,最重要的还是自己。个人觉得我大一要学的课程真正有用的不多,现在我是电子信息工程的一名大学生,大一所学课程有高数,大学物理,英语,体育,近代史,思修,大学物理实验,电路分析,C语言。呵呵,只有C语言,电路,高数,英语有用。其他科目我只是应付下考试,不会真心去学,因为没有兴趣。兴趣是最好的老师,没有它我觉得做什么事情都毫无意义,这就是我这个人的怪癖。利用所有闲下来的时间我准备学习单片机,单片机虽然是大二下学期的内容但我觉得它至关重要。
   为什么我们要学习单片机呢?他是个什么东西呢?单片机就是一块集成芯片,但这块集成芯片具有一些特殊的功能,而它的功能的实现要靠我们使用者自己来编程完成。我们编程的目的就是控制这块芯片的各个引脚在不同时间输出不同的电平(高电平或低电平),进而控制与单片机各个引脚相连接的外围电路的电气状态。编程时我们就需要C语言,这是最快捷的编程方法。学习单片机不要一开始就翻书死学,学习他的内部结构,这样你怎么也学不好,而是要一开始就编程,在编程的过程中了解到它的内部结构,所以说C语言的学习是很关键的。很多同学都会说C语言好无聊,你是你不懂他最后有什么用处,只要你在学习C语言的过程中一同学习单片机,你会发现很多乐趣与成就感,因为兴趣是最好的老师。并不要害怕单片机,不要以为需要很多知识才可以驾驭它,它虽然关系到数字电路以及模拟电路的知识(大二上学期学),但是涉及的还是不多,最主要的还是C语言的运用。忘了说单片机的前景,现在所有电子产品与设备几乎全都涉及到单片机,经常是核心,所以学好它对就业以及未来有很好的发展。
   那如何来学习单片机呢? 学习单片机之前你需要一块开发板,51单片机开发板。在淘宝上就可以买到,一开始不要买有很多系统的,什么嵌入式系统,AVR,ARM等等。咱们先学好51单片机,不急不急。价格在100左右就行,我买的开发板是东流电子的开发板,163(包括了彩屏,以及AVR),大家可以试试郭天祥开发板,不错的。大家买完开发板肯定有附带光盘教学视频资料,但我还建议可以看网上的郭天祥十天学习单片机的视频,讲述的很不错。
    大家利用好现在的大学时光,它不是一个娱乐轻松的场所,而是为将来打拼做准备的场所。有很多人会说对自己专业没兴趣,那我劝告下赶快去转专业,别浪费时光。还有你以为谁天生就对什么有兴趣,那都是要靠自己探索培养的,要多多想想自己的将来,四年是学习的时间,你可以让这四年让你变成金。还有说下我这个专业的同志们,电子信息专业是很好就业的,哪里没有电子的身影,但学好才可以成功。
  单片机的学习内容;
  1首先你要掌握keil软件的运用,它是编程的环境 2.学习以下实验(流水灯的控制,数码管的显示原理和实现键盘检测原理,AD工作原理定时器计数器,中断系统,串行口运用,等等)这些郭天祥都会讲到。今天写到这里,我去学单片机了。。。。。。
三月30日:今天是利用定时器0和1以及中断系统控制数码管以及流水灯;
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P3^7;
sbit wela=P2;
uchar temp,t0,t1,flag1,bai,shi,ge,flag;
uint shu;
void init();
void delay(uint z);
void display(uchar aa,uchar bb,uchar cc,uchar bai ,uchar shi,uchar ge);

 
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x79,0x38,0x3f};

 
void main()
{  
  init();
  while(1)
   {   
       if(flag1!=1)
       display(7,6,5,bai,shi,ge);
       else
        display(16,17,18,18,19,20);

 
   
    }
  
}
void init()
{   
   shu=432;
   temp=0xfe;
   P0=temp;
   TMOD=0x11;
   TH0=0x4c;
   TL0=0x00;
   TH1=0x4c;
   TL1=0x00;   
   EA=1;
   ET0=1;
   ET1=1;   
   TR0=1;
   TR1=1;

 

 
}
void timer0() interrupt 1
{
    TH0=0x4c;
    TL0=0x00;
    t0++;
    if(flag!=1)
   {
    if(t0==10)
    {
       t0=1;
       temp=_crol_(temp,1);
       P0=temp;
    }
   }
   else
   {
      if(t0%4==0)
          {
               P0=~P0;
               if(t0==60)
               TR0=0;
               P0=0xff;
                flag1=1;
           }
    }

 
}

 
void timer1() interrupt 3
{
    TH1=0x4c;
    TL1=0x00;
    t1++;
    if(t1=2)
    {   
        t1=0;
        shu--;
        bai=shu/100;
        shi=shu%100/10;
        ge=shu%10;
        if(shu==398)
         {
             TR0=0;
             TH0=0x4c;
             TL0=0x00;
             TR0=1;
             flag=1; 
             t0=0;  
             P0=0xff;   
             TR1=0;
          }
    }
}
void display(uchar aa,uchar bb,uchar cc,uchar bai ,uchar shi,uchar ge)

 
{
   dula=1;
     P0=table[aa];
     dula=0;
     P2=0;
     delay(5);

 
     dula=1;
     P0=table[bb];
     dula=0;
     P2=1;
     delay(5);
     
     dula=1;
     P0=table[cc];
     dula=0;
     P2=2;
     delay(5);
 
    
     dula=1;
     P0=table[bai];
     dula=0;
     P2=3;
     delay(5);

 
     dula=1;
     P0=table[shi];
     dula=0;
     P2=4;
     delay(5);
     
     dula=1;
     P0=table[ge];
     dula=0;
     P2=5;
     delay(5);
    

 

 
}

 
void delay(uint z)
{
   uint x,y;
    for(x=z;x>0;x--)
      for(y=110;y>0;y--);

 
}


 

 
三月31日:今天学完矩阵键盘,终于会编了,弄了好久。。。。(今天开始记录思想,帮我加强记忆并自己再理解一遍)

 
#include <reg52.h>                                                                      /reg52.h是头文件,包含了下列关键字
#define uint unsigned int                                                              /定义无符号型整数
#define uchar unsigned char                                                        /定义无符号型字符型
sbit dula=P3^7;                                                                             /数码管的段是由P3.7引脚控制,位声明下
sbit wela=P2;                                                                                /数码管的位选是由P2引脚控制,东流电子的板子位选是由译码器控制
uchar temp,num;

 
void delay(uint z);                                                                        /延时函数声明

 
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,        / 数码管的数组
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

 
void main()                                                                              /主函数
{  
    dula=1;                                                                              /首先将数码管不显示,段选是由锁存器控制,将锁存器赋值1打开锁存器,    
    P0=0;                                                                               / 往里面输入数据再赋值0关闭锁存器
    dula=0;
    P2=0;                                  /我的板子的数码管是由译码器控制,通过向P2口输入不同的值进而控制不同数码管,0代表第一个数码管
  while(1)                                          /主循环,while语句当()里的值为1是一直循环{  }里的语句,不为1则跳出语句
   {   
        P1=0xfe;                           /如上图所示P1指的是第一行键盘,矩阵键盘的检测是给除了第一行赋值0外全部赋值为1,也就是111111       
        temp=P1;                          10,再将P1值赋给temp,让后temp和0xf0(11110000)与(逻辑与)原理是:先扫描第一行,将其他端
        temp=temp&0xf0;    /口赋值1,当有按键按下时有一列为0,列是在高四位如果是第一个键按下就是0111 0111和0xf0与下就不为0xf0
        if(temp!=0xf0)                     /如果temp不为0xfo(就相当于有按键被按下)
     {   
          delay(10);                                           延时消抖
          temp=P1;                                            再将P1值赋给temp
          temp=temp&0xf0;                               再和0xf0逻辑与
        if(temp!=0xf0)                                       再判断是否按键
         { 
             temp=P1;                                        将P1值重新赋给temp 
        switch(temp)                                         swith语句是多条件语句,()中temp是表达式,case(表达式):对应语句,。break是停止
            {                                                       switch语句跳出
               
                case 0xee:num=1;                       如果是按第一个键就在数码管上显示0(为啥不是1?下面解释)
                   break;
                case 0xde:num=2;                       如果按第一行第二个键在数码管上显示1
                   break;
                case 0xbe:num=3;
                   break;
                case 0x7e:num=4;
                   break;
             }
    dula=1;
    P0=table[num-1];                                 数码管显示[ ]中是上面声明数组中的值,num-1对应数组的值(num为1则代表数组的0)
    dula=0;
         }
     }
        P1=0xfd;
        temp=P1;                                           以下就是不同行数的检测,检测第二行就给P1.2赋值0,改变下P1的值和num值就可以进行第
        temp=temp&0xf0;                           二行以及第三第四行的键盘是否按下
        if(temp!=0xf0) 
     {   
          delay(10);
          temp=P1;
          temp=temp&0xf0;
        if(temp!=0xfe)
         {
             temp=P1; 
        switch(temp)
            {   
               
                case 0xed:num=5;
                   break;
                case 0xdd:num=6;
                   break;
                case 0xbd:num=7;
                   break;
                case 0x7d:num=8;
                   break;
             }
    dula=1;
    P0=table[num-1];
    dula=0;
          }
     }
        P1=0xfb;
        temp=P1;
        temp=temp&0xf0;
        if(temp!=0xf0) 
     {   
          delay(10);
          temp=P1;
          temp=temp&0xf0;
        if(temp!=0xfe)
         {
             temp=P1; 
        switch(temp)
            {   
               
                case 0xeb:num=9;
                   break;
                case 0xdb:num=10;
                   break;
                case 0xbb:num=11;
                   break;
                case 0x7b:num=12;
                   break;
             }
    dula=1;
    P0=table[num-1];
    dula=0;
          }
    }
        P1=0xf7;
        temp=P1;
        temp=temp&0xf0;
        if(temp!=0xf0) 
     {   
          delay(10);
          temp=P1;
          temp=temp&0xf0;
        if(temp!=0xfe)
         {
             temp=P1; 
        switch(temp)
            {   
               
                case 0xe7:num=13;
                   break;
                case 0xd7:num=14;
                   break;
                case 0xb7:num=15;
                   break;
                case 0x77:num=16;
                   break;
             }
    dula=1;
    P0=table[num-1];
    dula=0;
          }
     }

 
  }
}
  
 

 
void delay(uint z)                                         延时函数
{
   uint x,y;
    for(x=z;x>0;x--)
      for(y=110;y>0;y--);

 
}
啊哈,清明结束,把串口和AD转换学完了,但是都是晚上学完的,没网络写,那两个以后复习的时候再补上,花了两天学完液晶。话说最近课还真紧,剩下课余时间来完成吧。看大三师兄们都在学一种芯片,STM32(一种高性能的ARM)芯片,比51单片机先进多了,好想学啊,但是我一定要先精通51,学完我要做很多基于51的产品,学会制作PCB板,每天慢慢试着学模电和数电,好兴奋啊。加油了!!
   液晶是什么东西呢?大家也都懂得,他是一种高分子材料,今天我就简单的介绍下1602液晶的程序控制
1602液晶有16个引脚每个引脚都有自己的作用 ,突然觉得要介绍好多东西,有线没钱了,无线图片上传不了,以后再补上思想
 
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^7;      
 sbit lcdrs=P2^5;
 sbit rw=P2^6;
 uchar code  table[]="Oh! my baby!";
uchar code table1[]="WWW.TXMCU.COM";
uchar num,num1; 
  void delay(uint z)
  {
         uint x,y;
              for(x=z;x>0;x--)
                    for(y=110;y>0;y--);
  }
  void write_com(uchar com)
         {
 
         lcdrs=0;
rw=0;  
         P0=com;
        delay(5);
         lcden=1;
         delay(5);
        lcden=0;
       }
         void write_data(uchar date)
        {
 
        lcdrs=1;
rw=0;
        P0=date;
        delay(5);
         lcden=1;
         delay(5);
         lcden=0;
        }
         void init()
       {
         
         lcden=0;
         write_com(0x38);
         write_com (0x0e);
         write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
        
      }
          void main()
      {
          init();
 for(num=0;num<12;num++)
  {
 write_data(table[num]);
 delay(5);  
        }
 
write_com(0x80+0x53);
for(num=0;num<13;num++)
  {
 write_data(table1[num]);
 delay(5);  
        } 
for(num=0;num<16;num++)
{
  write_com(0x18);
  delay(20);
}
 
   while(1);
      }
今天4月14号,今天看了I^2C总线,感觉挺难的,好不容易编出来个程序但是竟然无法执行,唉。。。最近觉得芯片时序图对于编程很重要,慢慢来吧,太晚了,今天也没时间写思想了
 
#include <reg52.h>
#define uchar unsigned char
sbit sda=P3^6;
sbit scl=P1^5;
uchar a;
void delay( )
{ ;; }
 void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}

 
void start()
{
  sda=1;
  delay();
  scl=1;
  delay();
  sda=0;
  delay();
   
}
void stop()
{
   sda=0;
   delay();
   scl=1;
   delay();
   sda=1;
   delay();
}
void respons()
{
   uchar i;
   scl=1;
   delay();
   while((sda==1)&&(i<250))i++;
   scl=0;
   delay();
}
void init()
{
  sda=1;
  delay();
  scl=1;
  delay();
}
void write_byte(uchar date)
{
    uchar i,temp;
temp=date;

 

 
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
   delay();
sda=CY;
delay();
scl=1;
delay();
// scl=0;
     //   delay();
}
scl=0;
delay();
sda=1;
delay();
}

 

 
uchar read_byte()
{
   uchar i,j,k;
   scl=0;
   delay();
   sda=1;
   delay();
   for(i=0;i<8;i++)
   {
      scl=1;
 delay();
 if(sda==1)
    j=1;
 else 
    j=0;
      k=(k<<1)|j;
 scl=0;
 delay();
   }
    return k;
}
 

 
void main()
{
   init();
   start();
   write_byte(0xa0);
   respon();
   write_byte(3);
   respon();
   write_byte(0xfe);
   respons();
   stop();

 
   delay1(100);
   start();
   write_byte(0xa0);
   respon();
   write_byte(3);
   respon();
   start();
   write_byte(0xa1);
   respon();
   a=read_byte();
   stop();
   P0=a+5;
   while(1);

 
}
关闭窗口

相关文章