单片机实训报告

单片机实训报告

 

      课程设计名称:单片机实训总结 

             学院:   电子电气学院  

             专业:    电子信息       

             姓名:     XXX     

         指导老师:    XXX     

                       20##1229

一、实训目的:

1、熟悉单片机应用系统的开发、研制过程。

2、能运用MCS-51单片机进行简单的单片机应用系统的硬件设计。

3、能采用MCS-51单片机汇编语言进行简单的单片机应用系统的软件设计。

4、掌握单片机应用系统的硬件、软件调试方法。

5、熟悉单片机仿真开发系统的作用,基本掌握运用单片机仿真开发系统进行在线仿真、调  试和目标程序固化的方法。

6、为今后从事单片机应用系统的开发、生产和维护工作奠定基础

二、实训器材:

   pc机(一台)    单片机小车(一辆)   

三、实训重点难点

1、会运用PROTEL等软件工具,学习对单片机应用系统的硬件设计

2、运用KIEL C51 设计、调试单片机应用固件

3、掌握DAC芯片、LCD12864,LCD1602、行列式键盘、数码管、串口、万年历等基本知识

四、实训小车原理图

五、实训程序

1、1602两行显示

#include <reg51.h>

#define lcd_data_port P0

sbit lcd_rs = P2^5;

sbit lcd_en = P2^6;

//延时程序//

void delay100us(unsigned int x)

{unsigned int a,b;

 for(a=0;a<x;a++)

  for(b=0;b<10;b++);

}

//送命令//

void sendcommandtolcd(unsigned char lcd_command)

{

  lcd_data_port=lcd_command;

  lcd_rs=0;

  lcd_en=0;

  delay100us(10);

  lcd_en=1;

  delay100us(10);

  lcd_en=0;

  delay100us(10);

}

//送数据//

void senddatatolcd(unsigned char lcd_data)

{

  lcd_data_port=lcd_data;

  lcd_rs=1;

  lcd_en=0;

  delay100us(10);

  lcd_en=1;

  delay100us(10);

  lcd_en=0;

  delay100us(10);

}

void lcd_init(void)

{ sendcommandtolcd(0x38);

  sendcommandtolcd(0x0c);

  sendcommandtolcd(0x01);

  sendcommandtolcd(0x06);

}

void display(unsigned char *p)//显示函数

{

   while(*p!='\0')

   {senddatatolcd(*p);

        p++;}

}

void main(void)

{ lcd_init();

  sendcommandtolcd(0x80);//第一行地址

  //senddatatolcd(0x41);显示字母A

display("diyihang");

sendcommandtolcd(0xc0);//第二行地址

display("dierhang");

  while(1);

}

12864汉字显示

#include <reg51.h>

#define lcd_port P0

sbit lcd_rs = P2^5;

sbit lcd_rw = P2^6;

sbit lcd_en = P2^7;

//延时程序//

void delay100us(unsigned int x)

{unsigned int a,b;

 for(a=0;a<x;a++)

  for(b=0;b<10;b++);

}

//送命令//

void sendcommandtolcd(unsigned char lcd_command)

{

  lcd_port=lcd_command;

  lcd_rw=0;

  lcd_rs=0;

  lcd_en=1;

  delay100us(100);

  lcd_en=0;

  delay100us(100);

}

//送数据//

void senddatatolcd(unsigned char lcd_data)

{

  lcd_port=lcd_data;

  lcd_rw=0;

  lcd_rs=1;

  lcd_en=1;

  delay100us(100);

  lcd_en=0;

  delay100us(100);

  }

void lcd_init(void)//初始化

{ sendcommandtolcd(0x38);

  sendcommandtolcd(0x0c);

  sendcommandtolcd(0x06);

  sendcommandtolcd(0x01);

}

void display(unsigned char *p)//显示函数

{

   while(*p!='\0')

   {senddatatolcd(*p);

        p++;}

}

void main(void)

{

  lcd_init();

   sendcommandtolcd(0x80);//第一行地址

    display("第一行A");

   sendcommandtolcd(0x90);//第二行地址

    display("第二行B");

   sendcommandtolcd(0x88);//第三行地址

    display("第三行C");

     //senddatatolcd(0x41);

   sendcommandtolcd(0x98);//第四行地址

        //senddatatolcd(0xc4);

    //senddatatolcd(0xe3);

      display("第四行D");

  while(1);

}

A/D转换(方波)

#include <reg51.h>

#define uint unsigned int

#define uchar unsigned char

sbit CS=P0^1;

sbit CLK=P0^0;

sbit DATA=P0^2;

void da5615(uint da)

{uchar i;

da<<=6;

CS=0;

CLK=0;

for(i=0;i<12;i++)

{DATA=(bit)(da&0x08000);

CLK=1;

da<<=1;

CLK=0;}

CS=1;

CLK=0;

for(i=0;i<12;i++);}

void delay(uint x)

{uint i,j;

for(i=0;i<x;i++)

for(j=0;j<100;j++);}

void main()

{int i;

while(1)

{for(i=1;i<0x03fc;i++)

{da5615(i);

delay(1);}

}}

串口控制

#include <reg51.h>

unsigned char a=0x55;

void main()

{  

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

TR1=1;

SCON=0x50;

while(1)

{

while(!RI);

RI=0;

P0=SBUF;

SBUF=a;

while(!TI);

TI=0;

}}

万年历

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit LCDE=P2^6;

sbit RDN=P2^5;

sbit WRN=P2^4;

uint a=0,b=0,c=2,second=0,minute=8,hour=11,day=15,moon=12,year=2012;

uint a1,a2,a3,sec1,sec2,min1,min2,ho1,ho2,day1,day2,moon1,moon2,year1,year2,year3,year4;

void display();

void delay(uint z)

{

      uint x,y;

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

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

}

void write_com(uchar com)

{

      RDN=0;

      P0=com;

      delay(5);

      LCDE=1;

      delay(5);

      LCDE=0;

}

void write_data(uchar date)

{

      RDN=1;

      P0=date;

      delay(5);

      LCDE=1;

      delay(5);

      LCDE=0;

}

void init()

{

      WRN=0;

      LCDE=0;

      write_com(0x38);

      write_com(0x0c);

      write_com(0x01);

      write_com(0x06);

}

void main()

{  

      init();

      IE=0x82;

    TMOD=0x01;

    TH0=(65636-10000)/256;

      TL0=(65636-10000)%256;

      TR0=1;

      while(1) 

      {

            display();

    }

}

void all(void)interrupt 1

{

      TH0=(65636-10000)/256;

      TL0=(65636-10000)%256;

    a++;

    if(a>100)

      {

            a=0;      

       second++;

            if(second%2==0)

              { b=2;

                  c=0;}

            if(second%2==1)

              { b=0;

                  c=2;}

            if(second==60)

           {

                  second=0;

                  minute++;

                  if(minute==60)

                  {

                        minute=0;

                        hour++;

                        if(hour==24)

                        {

                              hour=0;

                              day++;

                              if(day>30)

                              {

                                    day=0;

                                    moon++;

                                    if(moon>12)

                                    {

                                          moon=0;

                                          year++;

                                    }

                              }

                        }

                  }

            }

      }         

   

}

void display()

{

      a1=a%10;

      a2=a/10%10;

      a3=a/100;

      sec1=second%10;

      sec2=second/10;

    min1=minute%10;

      min2=minute/10;

      ho1=hour%10;

      ho2=hour/10;

    day1=day%10;

      day2=day/10;

      moon1=moon%10;

      moon2=moon/10;

    year1=year%10;

      year2=year%100/10;

      year3=year/100%10;

      year4=year/1000;

      write_com(0x80+0x4c);

    write_data(0x30+a1);

      write_com(0x80+0x4b);

    write_data(0x30+a2);

      write_com(0x80+0x4a);

    write_data(0x3a);

      write_com(0x80+0x49);

    write_data(0x30+sec1);

      write_com(0x80+0x48);

    write_data(0x30+sec2);

      write_com(0x80+0x47);

    write_data(0x3a);

                  

      write_com(0x80+0x46);

    write_data(0x30+min1);

      write_com(0x80+0x45);

    write_data(0x30+min2);

      write_com(0x80+0x44);

    write_data(0x3a);

      write_com(0x80+0x43);

     write_data(0x30+ho1);

      write_com(0x80+0x42);

    write_data(0x30+ho2);

      write_com(0x80+0x0c);

    write_data(0x30+day1);

      write_com(0x80+0x0b);

    write_data(0x30+day2);

      write_com(0x80+0x0a);

    write_data(0x2f);

      write_com(0x80+0x09);

    write_data(0x30+moon1);

      write_com(0x80+0x08);

    write_data(0x30+moon2);

      write_com(0x80+0x07);

    write_data(0x2f);

      write_com(0x80+0x06);

    write_data(0x30+year1);

      write_com(0x80+0x05);

    write_data(0x30+year2);

      write_com(0x80+0x04);

    write_data(0x30+year3);

      write_com(0x80+0x03);

    write_data(0x30+year4);

     

      write_com(0x80);

    write_data(0x3c+b);

      write_com(0x80+0x01);

    write_data(0x3c+b);

      write_com(0x80+0x02);

    write_data(0x3c+b);

      write_com(0x80+0x0d);

    write_data(0x3c+c);

      write_com(0x80+0x0e);

    write_data(0x3c+c);

      write_com(0x80+0x0f); 

    write_data(0x3c+c);

      write_com(0x80+0x40);

    write_data(0x3c+b);

      write_com(0x80+0x41);

    write_data(0x3c+b);

      write_com(0x80+0x4d);

    write_data(0x3c+c);

      write_com(0x80+0x4e);

    write_data(0x3c+c);

      write_com(0x80+0x4f); 

    write_data(0x3c+c);

}

0~99

#include   <reg51.h>

#define     SEG    P0             // 定义七节显示器接至Port 0

#define uchar unsigned char

#define uint unsigned int

sbit p25=P2^5;

sbit p26=P2^6;

Char code TAB[10]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7c,0x07,0x7f,0x67}; /* 声明七节显示器驱动信号阵列(共阴) */

/* 延迟函数,延迟约x 5ms */

void delay(int x)       // 延迟函数开始

{    int i,j;             // 声明整数变数i,j

      for (i=0;i<x;i++) // 计数x次,延迟x 5ms

            for (j=0;j<600;j++);// 计数600次,延迟5ms

}                                  // 延迟函数结束

void main()

  {

unsigned int ge=0,shi=0,coun=0;

while(1)

{   

   p26=1;

      P0=0xfd;

   p26=0;

   p25=1;

    SEG=TAB[ge];

      delay(2);  

      p25=0;

   p26=1;

      P0=0xfe;

   p26=0;

   p25=1;

    SEG=TAB[shi];

      delay(2);

 coun++ ;

        if(coun>=20)

        {     coun=0;

           ++ge;}              

          if(ge>9)

           {  ge=0;

             ++shi;

         if(shi>9) shi=0;

           }}   }

  

流水灯  

#include <reg51.h>

void delay(int);

main()                         // 主程序开始

{ unsigned char i;  // 声明无号数字元变数i(占1Bytes)    

 P3=0x00;

 while(1)

 {for(i=0;i<=7;i++)

  {P0=i;

  delay(100);}

}}                                // 主程序结束

/* 延迟函数,延迟约x 5ms */

void delay(int x)       // 延迟函数开始

{    int i,j;             // 声明整数变数i,j

      for (i=0;i<x;i++) // 计数x次,延迟x 5ms

            for (j=0;j<1200;j++);// 计数600次,延迟5ms

}                            // 延迟函数结束

六、心得体会

 通过这几天的单片机的实训我在理论的基础上更深刻的掌握了单片机的深层内容及实际生活中的应用实训锻炼了自己动手能力和思维能力还有在软件方面的编程能力让我受益匪浅同时也暴露出一些平时学习上的问题让我深刻反思。这些问题的发现将为我以后的学习和工作找明道路查漏补缺为进一步学习作好准备。通过实训让我懂得了如何编写一些简单的程序学会了如何制作单片机应用程序并且可以在今后的日常生活中灵活运用。

相关推荐