单片机原理实验报告(李法春版)前5个实验

桂林航天工业学院

电子工程系

     单片机技术     课程实验报告

20##-----2014学年第学期

专业:2012045z              

班级:2012045z01            

学号:2012045z0108

姓名:             

同组者         

指导教师:   庞前娟  

任务一:单片机控制单灯亮灭

一、实验目的

1.初步学会使用Keil μVision开发环境和简单程序的编辑、编译、与运行方法;

2.学习Proteus软件绘制简单电路图与仿真运行方法C51程序的初步过程

3. 掌握单片机控制单只发光二极管亮灭的原理并仿真实现

二、实验仪器

1、安装Keil μVision及Protues软件的计算机一台。

三、实验内容及要求

1、用Keil μVision仿真调试简单的C51程序;

2、用Protues软件绘制简单的电路图

3、在绘制好的电路原理图中,调入已编译好的目标代码文件“*.HEX”,可以在原理图中看到模拟实物的运行状态和过程。

四、单片机控制发光二极管亮灭实验原理图:

五、实验程序:

#include<reg51.h>

void main()

{

  unsigned int value;

  value=0xfe;

  P0=value;

}

     

六、实验结果及心得体会                                    

(按步骤记录调试程序及proteus绘制原理图及仿真过程中出现的现象,在上述程序实现的基础上,如何修改程序使其他的发光二极管实现亮灭,本部分手写,写不下可写在背面)

实验成绩评定表

任务二:单片机控制流水灯

一、实验目的

1.初步掌握C51的基本语法、基本控制语句的使用,函数调用等知识,学习按任务编写基本程序

2.掌握 MCS-51 单片机的 P0、P1、P2 口的使用方法

3. 掌握实现发光二极管的移动、闪烁程序的编写方法

二、实验仪器

1、安装Keil μVision及Protues软件的计算机一台。

三、实验内容及要求

1、掌握C51程序调试和proteus软件联调的方法,学习设置二软件联调。

2、由P0口连接8只发光二极管,实现如下功能

1)让发光二极管从左至右循环轮流点亮两只灯;

2)让8只光二极管从外向内循环轮流点亮;

3)让8只光二极管从内向外循环轮流点亮;

四、实验线路:

五、实验程序:


#include<reg51.h>

void delay();

void main()

{

  unsigned char output=0xfe;

  while(1)

  {

    P0=output;

    delay();

    output<<=1;

    output|=1;

   if(output==0xff) output=0xfe;

   }

}

void delay()

  long i;

  for(i=40000;i>0;i--);

}


 

六、实验结果及心得体会                                    

(在上述程序中标出使发光二极管左移的实现语句,按步骤记录调试程序及proteus绘制原理图及仿真过程中出现的现象,在上述程序实现的基础上,修改相应部分,使电路实现2)3)功能,本部分手写)

实验成绩评定表

任务三:单片机控制流水灯

一、实验目的

1、深化C51的基本语法、基本控制语句的使用,函数调用等知识,学习,按任务修改基本程序

2、掌握 MCS-51 单片机的中断系统、定时计数器的控制方法,掌握中断服务程序的编写和中断响应机制。

3、进一步掌握keilC和proteus联调技巧,并能解决实验中遇到的问题。

二、实验仪器

1、安装Keil μVision及Protues软件的计算机一台。

三、实验内容及要求

由P0口连接8只发光二极管,P3.3口接一个按钮,实现如下功能

1)当按钮按下一时,8只发光二极管轮流点亮;

2)当按钮弹开,发光二极管全灭

四、实验线路(部分):

五、实验程序(部分):


#include<reg51.h>

#include<intrins.h>

void isr_time0(void);

unsigned char cword=0xfe;

void main()

{

  TMOD=1;

  TH0=-50000>>8;

  TL0=-50000;

  TR0=1;EA=1;ET0=1;

  P0=cword;

  while(1)

  {}

}

void isr_time0() interrupt 1

{

  TH0=-50000>>8;

  TL0=-50000;

  cword=_crol_(cword,1);

  P0=cword;

}


六、实验结果及心得体会                                    

(在上述电路原理图中加入需要的按钮,修改程序实现对按钮的响应,将修改后添加程序填入上述程序中,在程序中标注调用左移子函数,并写出调用左移、右移函数的编程方法)

实验成绩评定表

任务四  双单片机控制霓虹灯

一、实验目的

1、深化C51的基本语法、基本控制语句的使用,函数调用等知识,学习按任务编写基本程序

2、掌握 MCS-51 单片机的串口控制方法,掌握串口中断的原理及中断服务程序的编写

3、掌握双单片机通信的时序控制方法

二、实验仪器

1、安装Keil μVision及Protues软件的计算机一台。

三、实验内容及要求

将两个单片机通过串口连接,一个单片机U2连接16只发光二极管,一个单片机U1连接两只数码管,实现如下功能

1)U1输出数据控制U2的发光二极管按规律闪亮

2)U2将红灯亮的次数加1后发送到U1,U1的数码管显示灯亮的轮数(每个周期开始红灯亮),当显示到99时数码管归零,如果U2数据发送错误,则两只数码管显示FF,并闪烁;

四、实验线路部分:

原理图文件名

Two51conLSD

五、实验程序:


对U1编程:

#include<reg51.h>

unsigned char sdata=0xfe;

void isr_uart();

void main()

{

  TMOD=0X20;

  TH1=136;

  TL1=136;

  SCON=0Xd0;

  PCON=0;

  TR1=1;

  EA=1;ES=1;

  SBUF=sdata;

  while(1)

  {

  }

}

void isr_uart() interrupt 4

{

  if(TI==1)

  {

    sdata<<=1;

    sdata |=1;

    if(sdata==0xff) sdata=0xfe;

    SBUF=sdata;TI=0;

  }

  else

  {

    RI=0;P2=SBUF;

  }

}

  对U2编程

#include<reg51.h>

   unsigned char sdata;

  unsigned char count=0;

  void isr_uart();

   void main()

    {

    TMOD=0X20;

   TH1=16;

   TL1=16;

   SCON=0Xd0;

  PCON=0;

  TR1=1;

  EA=1;ES=1;

 while(1);

 }

 void isr_uart() interrupt 4

 {

if(RI==1)

 {

 RI=0;sdata=SBUF;P0=sdata;

if(count++==8)

{

count=0;

}

SBUF=count;

}

else

{

TI=0;

}

}


六、实验结果及心得体会                                    

(1、运行老师提供的电路原理图,观察实验现象,分析出现问题的原因及修改办法,

2、在原理图中加入第二个数码管,由P2.4—P2.7控制,修改程序,实现功能。

实验成绩评定表

任务五 用单片机最小系统实现简单交通灯控制

一、实验目的

1、深化C51的基本语法、基本控制语句的使用语句知识,读懂程序

2、进一步掌握keilC和proteus联调技巧,并能解决试验中遇到的问题。

二、实验仪器

1、安装Keil μVision及Protues软件的计算机一台。

三、实验内容及要求

在单片机最小系统下,由P2、P0口连接12只发光二极管,实现交通灯功能

1)每个路口分别接红、黄、绿三个等代表路口控制灯;

2)初始状态为四个路口红灯全亮之后,东西路口绿灯亮,南北红灯亮;延时20s,

3)东西路口绿灯闪烁3次后熄灭,黄灯闪亮3秒(每秒闪烁一次)后,东西路口红灯亮,在切换到南北路口的绿灯亮;延时20s;

4)南北路口绿灯闪烁3次后熄灭,黄灯 亮3秒后,南北路口的红灯亮,再切换到东西路口绿灯亮;延时20s;重复以上过程

四、实验线路:

五、实验程序:


#include<reg51.h>

unsigned

char time=20*20,timey=10,county=6; 

unsigned char allr=0x36; 

 unsigned char ewg_snr=0x1e;

unsigned char ewy=0x2e;  

 unsigned char sng_ewr=0x33; unsigned char sny=0x35;   

sbit P01=P0^1;

sbit P04=P0^4;

sbit P21=P2^1;

sbit P24=P2^4;

bit  ewg=1;      

void isr_time0();

main()

{

  unsigned int i;

  P0=P2=allr;

  for(i=50000;i>0;i--);

  P0=P2=ewg_snr;

  TMOD=0x11;               TL0=-50000;TH0=-50000>>8;  TL1=-50000;TH1=-50000>>8;

  EA=1;ET0=1;ET1=1;

  TR0=1;

  while(1);

}

void isr_time0() interrupt 1

{

  TL0=-50000;TH0=-50000>>8;

  time--;

  if(time==0)

  {

TR0=0;TR1=1;

    time=400;

    if(ewg)

    {

      P0=ewy;P2=ewy;

    }

    else

    {

      P0=sny;P2=sny;

     }

  }

}

void isr_time1() interrupt 3

{

  TL1=-50000;TH1=-50000>>8;

  timey--;

  if(timey==0)

  {

    timey=10;

    county--;

    if(county)

    {

      if(ewg)

       { P04= ~P04;P24=~P24;}

      else

       { P01= ~P01;P21=~P21;}

    }

    else

    {

      county=6;

      if(ewg)

       { P0=sng_ewr;P2=sng_ewr;}

      else

       { P0=ewg_snr;P2=ewg_snr;}

      TR1=0;TR0=1;

      ewg = ~ewg;

     }

  }

}


六、实验结果及心得体会                                    

(1)在程序上标注出各路口灯亮的控制语句的注释,并将程序逻辑用流程图的形式表示出来;

(2)试编写一个程序,将东西路口的通行时间延长到40秒,其余不变;

(3)编写一个主程序,实现每天早上7:30到8:30采用此通行次序,周末和其他时间都采用原程序的通行次序。(回答)考虑电路可实现性,应增加硬件还是全部用软件的方法实现?如果增加硬件,拟采用什么元件来实现对时间的计算?

实验成绩评定表

 

第二篇:单片机原理实验报告

单片机原理实验报告

实验一:仿真软件的使用以及跑马灯的设计

实验目的

1.      掌握仿真软件的使用方法

2.      掌握 MCS-51 单片机的 P0、P1、P2 口的使用方法

3.     掌握实现发光二极管的移动、闪烁程序的编写方法

实验仪器

1、计算机一台。

2、LJD-SY-5200 实验系统一套。

3、上位机端 Keil C51 编译系统。

实验内容及要求

1、掌握单片机仿真器的程序输入、调试和运行等方法。

2、P2 口作为输入口,接 8 个按键。所有按键的一端接通过上拉电阻接至+5V电源,另一端和电源地 GND 相连接。在没有按键被按下是 P2 的输入全为高电平,当有按键被按下时对应的 P2 的相应引脚被拉低,该引脚输入变成低电平。 P0、P1作输出,接 16 个发光二极管,以P2口的值为点亮发光二极管的个数进行循环点亮

实验线路:

实验内容:

实验程序(汇编):

ORG 0000H               ;初始化地址

LJMP MAIN               ;进入程序

MAIN:  MOV A,P2         ;将P2口的状态送入A中

MOV R0,#8               ;将数值8送入R0

MOV R1,#8               ;将数值8 送入R1

LOOP3: MOV P0,A         ;跑马灯循环开始处,并将A的数值送入P0口

LCALL DELAY             ;亮灯延时

RL A                    ;将A中数值左移一位,即点亮下一个灯

DJNZ R0,LOOP3         ;若A中数值不等于8(即没完成一次循环)继续循环 

MOV P0,#0FFH            ;P0循环完成,将其全部熄灭

MOV A,#0FEH             ;将使第一个灯点亮的值送入A中

LOOP4: MOV P1,A         ;将A的数值送入P1口,开始循环第二排的灯

LCALL DELAY             ;亮灯延时

RL A                    ;将A中数值左移一位,即点亮下一个灯

DJNZ R1,LOOP4           ;若A中数值不等于8(即没完成一次循环)继续循环

MOV P1,#0FFH            ;P1循环完成,将其全部熄灭

LJMP MAIN               ;进入下一个总循环

DELAY: MOV R5,#200      ;延时程序,借用R5,R4寄存器产生延时

LOOP2: MOV R4,#200

LOOP1: NOP

DJNZ R4,LOOP1

DJNZ R5,LOOP2

RET

END

实验流程图:

单片机原理实验报告

实验二 定时器及计数器的应用

实验目的:

一、熟悉 8051 的 T0 作为定时器的设置及使用方法

二、掌握 T0 作为计数器的软件设计方法。

三、掌握单脉冲发生电路的硬件线路连接方式。

实验内容及要求:

一、在液晶屏上显示定时、计数结果

1、利用定时器 T0 进行计时,并把计时结果通过液晶屏显示出来。以每秒为单位显示。

2、把 T0 作为计数器对 T0 引脚的输入脉冲进行计数,并通过液晶显示屏显示T0 计数结果。

3、我们给出液晶屏显示程序,同学自己用编写T0定时器程序(中断部分程序)及由 T0 引脚输入的外部脉冲进行计数的计数器程序(汇编或C语言均可)。将定时或计数结果付给液晶屏显示程序中的count即可显示。

实验线路:

二、利用定时器 T0 控制八个发光二极管

1、利用定时器 T0 进行计时,在程序运行2s后首先使得发光二极管顺序循环点亮三次,随后使用定时器T0使得发光二极管奇数位和偶数位循环点亮三次,并循环显示。以500ms为单位显示。

2、把 T0 作为计数器对 T0 引脚的输入脉冲进行计数,使用P2 口中的一位作为输入口,接 1 个按键。所有按键的一端接通过上拉电阻接至+5V电源,另一端和电源地 GND 相连接。在没有按键被按下时 P2 的输入为高电平,当有按键被按下时对应的 P2 的相应引脚被拉低,该引脚输入变成低电平。当按键次数达到3的整数倍时点亮P1口的一个发光二极管。

实验步骤:

一、进行实验线路连接。将串口线一端与计算机串口相连另一端与

LJD-SY-5200 实验系统上的串口相连接。

二、将仿真监控芯片正确(注意方向,谨防插反)地插到实验系统的 CPU 插座上。

三、取下JP5、JP6,其他的跳线连接方式采用默认的即可。

四、编写源程序添加进去,进行调试。

实验说明:

一、CH451 芯片的时钟和数据线用的分别是单片机的 T0,T1 引脚,所以请不要再尝试使用数码管去显示 T0 计数的结果。

二、T1 的实验方法同 T0,只是单脉冲发生电路的左边的插孔需要和 T1 而不是T0 连接起来。

三、完成本次实验后请取下两根直连导线。

实验内容及要求:

一、在液晶屏上显示定时、计数结果

1、利用定时器 T0 进行计时,并把计时结果通过液晶屏显示出来。以每秒为单位显示。

实验程序1.1

/******************************************************************************

*                                                                                                                            *     T0定时器的应用中液晶屏显示部分(count为要显示的内容)

******************************************************************************/

#include

#include

#include

typedef unsigned char uchar;

typedef unsigned int  uint;

#define W_C_GLCD    XBYTE[0xcfff]

#define W_D_GLCD    XBYTE[0xdfff]

#define R_B_GLCD    XBYTE[0xefff]

#define R_D_GLCD    XBYTE[0xffff]

void command_GLCD(uchar ord);

void initial_GLCD(void);

void write_GLCD(uchar dat);

void chkbusy_GLCD();

void delay(void);

uchar pdata disp_num[10] = "0123456789";

uchar pdata disp_hz[12]  = "T0计时:XXXXS";

sbit  ACC7       = ACC^7;

sbit  bflag      = ACC^7;

uchar  flag_count;

uint  count;

/********************************************************************

函 数 名:initial_GLCD()

功    能:对12232液晶显示屏进行初始化

说    明:

调    用:

入口参数:

出口参数:

***********************************************************************/

void initial_GLCD()

{

  command_GLCD(0x30);    /*功能设定*/

  delay();

  command_GLCD(0x30);    /*功能设定*/

  delay();

  command_GLCD(0x30);    /*功能设定*/

  delay();

  command_GLCD(0x06);    /*显示器控制:游标不显示*/

  delay();

  command_GLCD(0x01);    /*清屏幕*/

  delay();

  command_GLCD(0x0c);    /*进入模式设定*/

  delay();

}

/********************************************************************

函 数 名:conmmand_GLCD(uchar ord)

功    能:写命令到12232

说    明:

调    用:

入口参数:uchar ord

出口参数:

***********************************************************************/

void command_GLCD(uchar ord)

{

  chkbusy_GLCD();

  W_C_GLCD=ord;

}

/********************************************************************

函 数 名:write_GLCD(uchar dat)

功    能:写数据到12232

说    明:

调    用:

入口参数:uchar dat

出口参数:

***********************************************************************/

void write_GLCD(uchar dat)

{

  chkbusy_GLCD();

  W_D_GLCD=dat;

}

void chkbusy_GLCD()

{

  do{ACC=R_B_GLCD;}

  while(bflag==1);

}

/********************************************************************

函 数 名:delay()

功    能:延时25us

说    明:

调    用:

入口参数:

出口参数:

***********************************************************************/

void delay()

{

  uchar i;

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

  {;}

}

/********************************************************************

函 数 名:delay1()

功    能:延时mus

说    明:

调    用:

入口参数:

出口参数:

***********************************************************************/

void delay1(uint m)

{

  while(m--);

}

main()

{

  uchar i,j;

   flag_count=0;

  count=0;

    j=0;

   TMOD=0x51;                      /*设置T0的工作方式为16位定时器*/

   TL0=(65536-10000)%256;          /*给T0赋值,使其定时时间为10ms*/

   TH0=(65536-10000)/256;

   TR0=1;                          /*T0开始工作*/

  initial_GLCD();                    /*清屏*/

  while(1)

  {

        if(TF0==1)                  /*若溢出,说明定时已经到了10ms*/

    {

      if(j<100)                     /*若总定时还未满1s*/

      {

        TF0=0;                      /*重置TF0*/

        TH0=(65536-10000)/256;      /*重置T0*/

        TL0=(65536-10000)%256;   

       j++;                        /*继续累加j,直到1s*/

      }

      Else                         /*总定时已经达到1s*/

      {

        j=0;                       /*重置j*/

       count++;                   /*显示当前已定时时间*/

      }

    }

  command_GLCD(0x80);

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

    {

      write_GLCD(disp_hz[i]);

    }

    write_GLCD(disp_num[count/1000]);         /*显示定时结果的千位*/

    write_GLCD(disp_num[count%1000/100]);     /*显示定时结果的百位*/

    write_GLCD(disp_num[count%1000%100/10]);  /*显示定时结果的十位*/

    write_GLCD(disp_num[count%1000%100%10]);  /*显示定时结果的个位*/

    write_GLCD(disp_hz[11]);

    delay1(1000);  

  }

}

实验流程图:

单片机原理实验报告

2、把 T0 作为计数器对 T0 引脚的输入脉冲进行计数,并通过液晶显示屏显示T0 计数结果。

1.2

/******************************************************************************

* T0计数器的应用中液晶屏显示部分(count为要显示的内容)

******************************************************************************/

#include

#include

#include

typedef unsigned char uchar;

typedef unsigned int  uint;

#define W_C_GLCD    XBYTE[0xcfff]

#define W_D_GLCD    XBYTE[0xdfff]

#define R_B_GLCD    XBYTE[0xefff]

#define R_D_GLCD    XBYTE[0xffff]

void command_GLCD(uchar ord);

void initial_GLCD(void);

void write_GLCD(uchar dat);

void chkbusy_GLCD();

void delay(void);

uchar pdata disp_num[10]="0123456789";

uchar pdata disp_hz[11]  ="T0计数程序:";

uchar count;

sbit  ACC7       = ACC^7;

sbit  bflag      = ACC^7;

/********************************************************************

函 数 名:initial_GLCD()

功    能:对12232液晶显示屏进行初始化

说    明:

调    用:

入口参数:

出口参数:

***********************************************************************/

void initial_GLCD()

{

  command_GLCD(0x30);    /*功能设定*/

  delay();

  command_GLCD(0x30);    /*功能设定*/

  delay();

  command_GLCD(0x30);    /*功能设定*/

  delay();

  command_GLCD(0x06);    /*显示器控制:游标不显示*/

  delay();

  command_GLCD(0x01);    /*清屏幕*/

  delay();

  command_GLCD(0x0c);    /*进入模式设定*/

  delay();

}

/********************************************************************

函 数 名:conmmand_GLCD(uchar ord)

功    能:写命令到12232

说    明:

调    用:

入口参数:uchar ord

出口参数:

***********************************************************************/

void command_GLCD(uchar ord)

{

  chkbusy_GLCD();

  W_C_GLCD=ord;

}

/********************************************************************

函 数 名:write_GLCD(uchar dat)

功    能:写数据到12232

说    明:

调    用:

入口参数:uchar dat

出口参数:

***********************************************************************/

void write_GLCD(uchar dat)

{

  chkbusy_GLCD();

  W_D_GLCD=dat;

}

void chkbusy_GLCD()

{

  do{ACC=R_B_GLCD;}

  while(bflag==1);

}

/********************************************************************

函 数 名:delay()

功    能:延时25us

说    明:

调    用:

入口参数:

出口参数:

***********************************************************************/

void delay()

{

  uchar i;

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

  {;}

}

/********************************************************************

函 数 名:delay1()

功    能:延时mus

说    明:

调    用:

入口参数:

出口参数:

***********************************************************************/

void delay1(uint m)

{

  while(m--);

}

void isr_t0(void)interrupt 1

{

  TH0=0xFF;       /*给T0赋值,有一次外部脉冲输入则立即产生中断*/

  TL0=0xFF;      

count++;        /*T0值已为FFH,若有外部脉冲输入,则产生中断使count++*/

}

main()

{

  uchar i;

  TMOD=0x05;        /*设置T0的工作方式为16位计数器*/ 

  TH0=0xFF;         /*给T0赋值,有一次外部脉冲输入则立即产生中断*/

  TL0=0xFF;         

  EA=1;              /*将总的中断允许开关打开*/

  ET0=1;              /* 将T0的中断允许开关打开*/

  TR0=1;             /*开始计数 */

  initial_GLCD();     /*清屏*/

  while(1)

  {

        command_GLCD(0x80);

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

    {

      write_GLCD(disp_hz[i]);

    }

    write_GLCD(disp_num[count/100]);     /*显示计数结果的百位*/

    write_GLCD(disp_num[count%100/10]);  /*显示计数结果的十位*/

    write_GLCD(disp_num[count%100%10]);  /*显示计数结果的个位*/

    delay1(1000);  

  }

}

实验流程图:

单片机原理实验报告

二、利用定时器 T0 控制八个发光二极管

1、利用定时器 T0 进行计时,在程序运行2s后首先使得发光二极管顺序循环点亮三次,随后使用定时器T0使得发光二极管奇数位和偶数位循环点亮三次,并循环显示。以100ms为单位显示。

2.1

#include

#include

int num;

char aa=0xfe;     //11111110b

void timer0_init()

{

    TMOD=0X01;                /* 设置T0的工作方式为16位定时器*/

   TH0=(65536-50000)/256;    /* 晶振为12MHz*/

   TL0=(65536-50000)%256;     /*定时为50ms */

   EA=1;                     /*开全局中断 */

   ET0=1;                    /*开定时器0中断 */

   TR0=1;                    /*启动定时器0 */

}

void Timer0() interrupt 1

{

    num++;

    if(num==341)

    {

        num=0;

       

    }

    TH0=(65536-500000)/256;         /*晶振为12MHz */

   TL0=(65536-500000)%256;         /*定时为50ms */

    switch(num)                     /*亮灯程序 ,间隔50ms*10=0.5s*/

    {

            case 40:

                P2=aa;                 //11111110

                aa=_crol_(aa,1);    //循环右移

                break;

          case 50:

            P2=aa;                    //11111101

                aa=_crol_(aa,1);

                break;

            case 60:

                P2=aa;               //11111011

                aa=_crol_(aa,1);

                break;

          case 70:

            P2=aa;                     //11110111

                aa=_crol_(aa,1);

                break;

            case 80:                   //11101111

                P2=aa;

                aa=_crol_(aa,1);

                break;

          case 90:

            P2=aa;                 //11011111

                aa=_crol_(aa,1);

                break;

            case 100:

                P2=aa;         //10111111

                aa=_crol_(aa,1);

                break;

          case 110:

            P2=aa;                //01111111

                aa=_crol_(aa,1);

                break;

            case 120:

                P2=aa;                //11111110

                aa=_crol_(aa,1);

                break;

          case 130:

            P2=aa;                 //11111101

                aa=_crol_(aa,1);

                break;

            case 140:

                P2=aa;           //11111011

                aa=_crol_(aa,1);

                break;

          case 150:

            P2=aa;                //11110111

                aa=_crol_(aa,1);

                break;

            case 160:

                P2=aa;             //11101111

                aa=_crol_(aa,1);

                break;

          case 170:

            P2=aa;                    //11011111

                aa=_crol_(aa,1);

                break;

            case 180:

                P2=aa;                    //10111111

                aa=_crol_(aa,1);

                break;

          case 190:

            P2=aa;                   //01111111

                aa=_crol_(aa,1);

                break;

            case 200:

                P2=aa;                   //11111110

                aa=_crol_(aa,1);

                break;

          case 210:

            P2=aa;

                aa=_crol_(aa,1);

                break;

            case 220:

                P2=aa;

                aa=_crol_(aa,1);

                break;

          case 230:

            P2=aa;

                aa=_crol_(aa,1);

                break;

            case 240:

                P2=aa;

                aa=_crol_(aa,1);

                break;

          case 250:

            P2=aa;

                aa=_crol_(aa,1);

                break;

            case 260:

                P2=aa;

                aa=_crol_(aa,1);

                break;

          case 270:

            P2=aa;                  //01111111

                aa=_crol_(aa,1);   //三次完毕

                break;

            case 280:

                P2=0x55;             //01010101

                break;

            case 290:

                P2=0xaa;              //10101010

                break;

            case 300:

                P2=0x55;

                break;

            case 310:

                P2=0xaa;

                break;

            case 320:

                P2=0x55;

                break;

            case 330:

                P2=0xaa;

                break;

            case 340:

                num=39;           //两秒后继续开始

                break;                                                                                        

    }

}

void main()

{

    timer0_init();

    while(1);

}

2、把 T0 作为计数器对 T0 引脚的输入脉冲进行计数,使用P2 口中的一位作为输入口,接 1 个按键。所有按键的一端接通过上拉电阻接至+5V电源,另一端和电源地 GND 相连接。在没有按键被按下时 P2 的输入为高电平,当有按键被按下时对应的 P2 的相应引脚被拉低,该引脚输入变成低电平。当按键次数达到3的整数倍时点亮P1口的一个发光二极管。

2.2

             

#include   

#include   

#include   

sbit P0_3= P0^3;

typedef unsigned char uchar;

typedef unsigned int  uint;

unsigned int count=0;

/********************************************************************

函 数 名:delay1()

功    能:延时mus

说    明:

调    用:

入口参数:

出口参数:

***********************************************************************/

void delay1(uint m)

{

  while(m--);

}

void main()

{ while (1){

   TMOD=0x05;           /*设置T0工作模式为16位计数器*/

   TH0=0xFF;            /*T0初值设置*/

   TL0=0xFF;

   ET0=1;               /*开启T0中断*/

   EA=1;                /*开启总中断*/

   TR0=1;               /*开启T0*/

   if( count==5 )

   {

   P0_3=0;

   count=0;

   while (count ==0) {delay1(1000);};

   };

else {P0_3=1;};

      }

}

void time0() interrupt 1

{

count++;

 TH0=0xff; /*T0初值设置*/

 TL0=0xff;

}

实验流程图:

单片机原理实验报告

实验三  模拟/数字(A/DTLC549)实验

实验目的

一、了解 8 位串行输出 A/D 转换器 TLC549 的工作原理。

二、掌握 TLC549 的硬件线路连接方式。

三、掌握 A/D 转换器 TLC549 的编程方法。

实验内容及要求

一、仔细阅读 TLC549 的数据手册。

二、仔细阅读 CH451 的应用手册。

三、编写程序把 A/D 转换器的转换结果通过数码管显示出来。

实验线路:

 

实验步骤:

一、进行实验线路连接。将串口线一端与计算机串口相连另一端与

LJD-SY-5200 实验系统上的串口相连接。

二、将仿真监控芯片正确(注意方向,谨防插反)地插到实验系统的 CPU 插座上。

三、在跳线器 JP5、JP6 上插上跳线冒。

四、取下跳线器 JP4、JP7、JP8 上的跳线冒。

五、编译、下载程序至仿真监控芯片,

六、调节模拟转换参考电压(即电位器 W2),观察数码管上数值的变化情况。

实验程序

#include

#include

#include

typedef unsigned char uchar;

typedef unsigned int  uint;

sbit ch451_din  = P3^5;

sbit ch451_clk  = P3^4;

sbit ch451_load = P1^2;

sbit P1_4       = P1^4;

sbit P1_3       = P1^3;

sbit tlc549_clk = P1^1;

sbit tlc549_d0    = P1^0;

sbit tlc549_cs  = P1^5;

int i=0;

/*须主程序定义的参数*/

#define CH451_DIG0      0x0800                  /*数码管位0显示*/

#define CH451_DIG1      0x0900                  /*数码管位1显示*/

#define CH451_DIG2      0x0a00                  /*数码管位2显示*/

#define CH451_DIG3      0x0b00                  /*数码管位3显示*/

#define CH451_DIG4      0x0c00                  /*数码管位4显示*/

#define CH451_DIG5      0x0d00                  /*数码管位5显示*/

#define CH451_DIG6      0x0e00                  /*数码管位6显示*/

#define CH451_DIG7      0x0f00                  /*数码管位7显示*/

void delay(uint us)

{

    while(us--);

}

/* */

/********************************************************************

函 数 名:ch451_init()

功    能:对ch451芯片进行初始化

说    明:

调    用:

入口参数:

返 回 值:

设    计:蓝海微芯          

***********************************************************************/

void ch451_init(void)

{

  ch451_din  = 0;           /*先低后高,选择4线输入*/

  ch451_din  = 1;

  ch451_load = 1;

  ch451_clk  = 1;

  _nop_();

}

/********************************************************************

函 数 名:ch451_write()

功    能:把12位的指令或数据写入ch451

说    明:12位数据或指令的写入顺序是低位

调    用:

入口参数:command

返 回 值:

设    计:蓝海微芯          

***********************************************************************/

void ch451_write(unsigned int command)

{

  unsigned char i;  

  ch451_load=0;                       /*命令开始*/   

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

  {                                   /*送入12位数据,低位在前*/

    ch451_din=command&1;            

    ch451_clk=0;

    command>>=1;

    ch451_clk=1;                       /*上升沿有效*/

  }

  ch451_load=1;                       /*加载数据*/

}

/********************************************************************

函 数 名:disp_ad()

功    能:把A/D转换结果通过数码管进行显示

说    明:

调    用:

入口参数:command

返 回 值:

设    计:蓝海微芯          

***********************************************************************/

void disp_ad(uint adc_result)

{

  uchar A;

  uchar B;

  uchar C;

  uchar D;

  A = adc_result/1000;

  B = adc_result%1000/100;

  C = adc_result%1000%100/10;

  D = adc_result%1000%100%10;

  ch451_write(CH451_DIG4|A);        

  ch451_write(CH451_DIG5|B);

  ch451_write(CH451_DIG6|C);

  ch451_write(CH451_DIG7|D);

  delay(10000);

  delay(10000);

}

/********************************************************************

函 数 名:main()

功    能:主程序

设    计:蓝海微芯          

***********************************************************************/

main()

{

  ch451_init();

  ch451_write(0x401);

  ch451_write(0x580);         /*以译码方式进行显示*/

  P1_4=1;

  P1_4=0;

  P1_3=1;

  while(1)

  {

    float temp=0;                     /*temp即电位器W2的值*/

   tlc549_cs=1;                     /*CS开关,读取一次电位器的值*/

   tlc549_cs=0;                  

   for(i=0;i<8;i++)                 /*转换八位二进制数*/

   {

      tlc549_clk=0;                 /*CLK=0*/

      temp*=2;                      /*temp左移一位*/

       if(tlc549_d0) temp++;         /*若d0=1则在最低位补1;若d0=0 则无需改变*/

       tlc549_clk=1;                 /*回复CLK*/

   }

   delay(1000);                      /*产生延时*/

    disp_ad(temp);                   /*显示结果*/

  }

}

 实验流程图:

单片机原理实验报告

实验心得体会及意见与建议:

    通过本学期对单片机原理及可编程控制器的学习,我掌握了单片机及PLC的基本原理及使用方法。其两种控制方法都可以广泛地运用在各个控制领域,但也有些不同之处。

    单片机是面向工业的微处理器,它是将CPU、RAM、ROM、定时计数器、I/O接口电路集成在一块芯片上,是一种单片计算机。因为体积小,可以植入任何仪器仪表当中或设备中,被广泛作为嵌入式控制器使用。一般使用汇编语言或高级语言编程。

    可编程控制器是作为工业设备的通用控制器,代替原来的继电器-接触器的传统的硬件连接控制方式。它采用计算机软件的软连接技术来替代继电器-接触器的硬件连接,为了工程师编程方便一般采用图形编程方式,即使用梯形图作为编程语言。

     掌握了这两种原理,将会对今后处理控制问题有非常大的帮助。

     我觉得这门课的实践环节还是少了一些,安排给我们的实验时间挺紧张的。因为时间太短还有手生,基本来到实验室没做出什么就快下课了。我的建议是,在实验之前先给一些其他的实验题目并附上程序让我们大概了解流程和内部机理。这样可以让我们在相对熟悉这块内容的条件下更快地完成实验。

相关推荐