最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

单片机C51程序设计实验报告书

来源:动视网 责编:小OO 时间:2025-10-05 23:52:39
文档

单片机C51程序设计实验报告书

实验一并行输入输出口的使用一、实验目的:学会设计proteus7仿真电路,学习P1口的使用方法和延时子程序的编写用KeiluVision3编程实现发光二极管的流水点亮。二、实验原理:P1口为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1)。P1口作为输出,接8个发光二极管D1~D8经限流电阻分别接至8个引脚。本实验仿真电路图、流程图如下:三、实验代码:#include#include//移位库函数包含于此头文件中voiddelay(unsignedi
推荐度:
导读实验一并行输入输出口的使用一、实验目的:学会设计proteus7仿真电路,学习P1口的使用方法和延时子程序的编写用KeiluVision3编程实现发光二极管的流水点亮。二、实验原理:P1口为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1)。P1口作为输出,接8个发光二极管D1~D8经限流电阻分别接至8个引脚。本实验仿真电路图、流程图如下:三、实验代码:#include#include//移位库函数包含于此头文件中voiddelay(unsignedi
实验一 并行输入输出口的使用

一、实验目的:学会设计proteus 7仿真电路,学习P1口的使用方法和延时子程序的编写用Keil uVision 3编程实现发光二极管的流水点亮。

二、实验原理:P1口为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1)。P1口作为输出,接8个发光二极管D1~D8经限流电阻分别接至8个引脚。本实验仿真电路图、流程图如下:

三、实验代码:

#include

#include    //移位库函数包含于此头文件中

 void delay(unsigned int d)     //定义延时子函数

{ while(--d>0);}

 void main()

  { unsigned char i,sel;

    while(1)

    { sel=0xfe;

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

      { P1=sel;          //显示变量赋给P1口

        delay(50000);     //延时

        sel=_crol_(sel,1);   //改变显示变量

      }

    }

  }

四、实验结论:用while语句实现发光二极管循环流水点亮,从上到下一次点亮。

实验二 C51分支程序设计

一、实验目的:学习多分支选择结构和switch语句,了解循环的嵌套。

二、实验原理:do while 循环先执行后判断是否循环,switch括号中的表达式的值与某case后的常量表达式的值相同时,就执行它后面的语句,遇到break语句则退出switch语句。本实验仿真电路图、流程图如下:

(仿真电路图)

(流程图)

三、实验代码:

#include

void main()

{ char a;

  do

  { P1=0xff;

    a=P1;

    a=a&0x03;

    switch(a)

    { case 0:P2=0x0e;break;

      case 1:P2=0x0d;break;

      case 2:P2=0x0b;break;

         case 3:P2=0x07;break;

    }          

  }while(1);

}

四、实验结论:多分支选择的switch/case语句,可直接处理并行多分支选择问题,从匹配表达式的括号开始执行,不再进行判断。 

实验三 外部中断实验

一、实验目的:掌握外部中断的原理以及中断处理程序的编写方法。

二、实验原理:外部中断0和外部中断1均为下降沿触发,当外部中断0发生时,P0端口的电平反向,当外部中断1发生时,P1端口的电平反向,LED状态取反,引脚P3.2、P3.3是外部中断INT0和INT1的输入端,本实验仿真电路图、流程图如下:

(仿真电路图)

     (主程序)                           (中断服务程序)

三、实验代码:

#include

#include

void ISO(void) interrupt 0

  { P0=~P0; }     //P0端口反向

void IS1(void) interrupt 2

  { P1=~P1; }     //P1端口反向

void main ()

{ P0=0x00; P1=0xFF;

  SCON=0x50;

  TMOD=0x22;

  TH1=0xF3;

  TR1=1;

  IT0=1; IT1=1;     //设置下降沿触发方式

  EX0=1; EX1=1; EA=1;   //中断允许

  while(1);

}

四、实验结论:利用外中断程序可控制LED的亮灭,P0口、P1口电平反向,LED状态取反。

实验四 定时/计数器实验

一、实验目的:学习定时计数器的使用和编写方法,进一步掌握中断处理程序的方法以及对示波器的了解。

二、实验原理:启动定时器T1延时10ms,当定时时间到产生中断,执行中断程序,LED熄灭,T1再延时10ms,点亮LED,如此循环,本实验仿真电路图、流程图如下:

(仿真电路图)

     (主程序)                              (中断服务程序)

三、实验代码:

#include

sbit Wave=P1^0;  //位定义

void T1ISR(void) interrupt 3   //定时器T1中断响应

 { Wave=~Wave;       //反向

   TL1=0x0F0;        //重置计数初值

   TH1=0x0D8;}

 void main(void)

 { Wave=0;        //初始化P1.0=0

   TMOD=0x10;    //设置定时器T1为模式1

   TL1=0x0F0; TH1=0x0D8;  

   TR1=1;      //启动定时计数器

   ET1=1;  EA=1;   //开中断

   while(1) { }

 }

四、实验结论:T1工作于模式1,定时器产生10ms的定时,定时中断产生,P1.0端口的输出在示波器中显示,LED闪烁。利用定时计数器可控制LED的显示时间变化。

实验五 外中断使用

一、实验目的:更熟练的掌握外部中断的原理与应用以及中断处理程序的编写方法。

二、实验原理:引脚P3.2、P3.3分别是外部中断INT0和外部中断INT1的输入端,均为低电平有效,下降沿触发。外中断0发生,8只LED全部点亮,外中断1发生,8只LED闪烁,本实验仿真电路图、流程图如下:

(仿真电路图)

       (主程序)                             (中断服务程序)

三、实验代码:

#include

sbit P32=P3^2;

void delay(unsigned int d)     //定义延时子函数

{ while(--d>0);

}

void main()

{P0=0xFF;      //熄灭LED

 IT0=1; IT1=1;     //外中断0、1脉冲触发方式

 EA=1;  EX0=1;  EX1=1;     //开中断

 for(;;)    //延时等待中断发生

 {;}   

}

void INT0_ISR() interrupt 0    //外中断0中断服务函数

{ P0=0x00;}

void INT1_ISR() interrupt 2    //外中断1中断服务函数

{  while(P32!=0)    //如果有外中断0,退出

    { delay(5000);

      P0=0x00;

      delay(5000);

      P0=0xFF;

    }

}

四、实验结论:当外中断0发生,即按下了So按钮,8只LED点亮;当外中断1发生,即按下了S1按钮,8只LED闪烁,遇到外中断0发生,8只LED停止闪烁并保持点亮状态。

实验六 串行口双机通信实验

一、实验目的:理解串行通信的基本概念和C51单片机的串行通信接口结构,熟悉串口的4种工作方式、通信连线和应用编程。

二、实验原理:单片机1将P1口拨动开关数据装入SBUF,经由TXD将数据发送给单片机2,单片机2将接收数据存入SBUF,再由SBUF装入累加器,并输出至P1,点亮相应端口的LED,本实验仿真电路图、流程图如下:

(仿真电路图)

(程序流程图)

三、实验代码:

单片机1的代码:

#include

#define uint unsigned int

#define uchar unsigned char

void main()

{ uchar i;

  TMOD=0x20;

  TH1=TL1=0xff;

  SCON=0x50;

  PCON=0x80;

  TR1=1;

  P1=0xff;

  while(1)

  { P1=0xff;

    i=P1;

    SBUF=i;

    while(TI==0){;}

    TI=0;

  }

}

单片机2的代码:

#include

#define uint unsigned int

#define uchar unsigned char

void main()

{ uchar i=0;

  TMOD=0x20;

  TH1=TL1=0xff;

  SCON=0x50;

  PCON=0x80;

  TR1=1;

  while(1)

  { while(RI==0) {;}

    RI=0;

    i=SBUF;

    P1=i;

  }

}

四、实验结论:当开关拨动到左边则对应的LED点亮,反之LED熄灭。将双片单片机串行通信,结果存入SBUF并输出至P1使相应的LED点亮。

实验七 单片机串口通信(二)

一、实验目的:加深对串行通信的基本概念和C51单片机的串行通信接口结构的了解,以及串口的工作方式、通信连线和应用编程。

二、实验原理:甲、乙两机以方式1进行串行通信,甲机首先发送信号AA,乙机接收到后应答BB,甲收到BB后发送数据,数据发送完毕立即发送校验和。乙机收齐一个数据块后,再接收甲发来的校验和,并将其与乙求得的校验和比较,若相等,说明接收正确,乙回答00H,若不等,说明接收不正确,乙回答0FFH,请求重新发送。

(程序流程图)

三、实验代码:

#include

#define uchar unsigned char

#define TR 1          //TR=1,发送

uchar idata buf[10];

uchar pf;

/*串行口初始化子函数*/

void init(void)

{ TMOD=0x20;      //T1工作于方式2

  TH0=0xE8;

  TL0=0xE8;

  TR1=1;

  SCON=0X50;     //串行口工作于方式1,REN=1

}

 /*发送子函数*/

 void send(uchar idata*d)

 { uchar i;

    do

    { SBUF=0xAA;      //发送联络信号

      while(TI==0)    //等待一帧发送完毕

      TI=0;           //发送完毕,标志位清0

      while(RI==0)    //等待乙机应答信号

      RI=0;  

    }while (SBUF^0xBB!=0);   //乙机未准备好,继续联络

    do

    { pf=0;        //校验和变量清0

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

      { SBUF=d[i];      //发送一个数据

        pf+=d[i];       //计算校验和

        while(TI==0)

        TI=0;

      }

      SBUF=pf;        //发送校验和

      while(TI==0) TI=0;   

      while(RI==0) RI=0;      //等待乙机应答

    } while(SBUF!=0);         //回答出错,则重新发送

 }

 /*接收函数*/

 void receive(uchar idata*d)

 { uchar i;

   do

   { while(RI==0) RI=0;

   } while(SBUF^0xAA!=0);      //判断甲机是否请求

   SBUF=0xBB;       //发应答信号

   while(TI==0) TI=0;  

   while(1)

   { pf=0;      //清校验和

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

     { d[i]=SBUF;        //接收数据

       pf+=d[i];  

     }                 //计算校验和

     while(RI==0) RI=0;    //接收甲校验和

     if((SBUF^pf)==0)       //比较校验和

     { SBUF=0x00;break;}    //校验和相等,发0x00

     else

     { SBUF=0xFF;       //校验和不相等,发0xFF

       while(TI==0) TI=0; 

     }

   }

 }

void main()

{ init();       //串行口初始化子函数

  if(TR==0)

  { send(buf);}    //发送

  else

  { receive(buf);}    //接收

}

四、实验结论:甲、乙两单片机通过P3口连接,设置寄存器SBUF,串口工作于方式1.根据TR的设置,利用发送函数和接收函数分别实现发送和接收功能。

实验八 多位七段数码动态显示

一、实验目的:掌握数码管动态显示数字的原理和连接方式,学习端口输入输出的应用,以及74LS245驱动LED显示的电路设计。

二、实验原理:轮流选中各位LED数码管,同时给P0口送不同的码字,并做一定的视觉残留,数码管就会同时出现不同的数字。本实验仿真电路图、流程图如下:

(仿真电路图)

(流程图)

三、实验代码:

#include

#define uchar unsigned char

uchar data dis_buf[6];        //显示缓冲区

uchar code table [18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};  //代码表

void d1_ms()       //延时1 ms函数

{ unsigned int j;

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

void display(void)          //显示函数

{ uchar segcode,bitcode,i;

  bitcode=0xfe;     //位码赋初值

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

  { segcode=dis_buf[i];          //显示缓冲器内容查表

    P0=table[segcode];

    P3=bitcode;

    d1_ms();

    P3=0xff;      //关闭显示

    bitcode=bitcode<<1;        //调整位码

    bitcode=bitcode|0x01;

  }

}

void main(void)

{ dis_buf[0]=1; dis_buf[1]=2;       //显示缓冲区赋初值

  dis_buf[2]=3; dis_buf[3]=4;

  dis_buf[4]=5; dis_buf[5]=6;

  while(1)

  {  display();}

}

四、实验结论:七段数码管动态显示是一位一位轮流点亮各位数码管,每隔一段时间显示,设置点亮延时时间短,循环扫描点亮,使人眼分辨不出,看到各位数码管同时发光。

实验九 数/模转换实验

一、实验目的:学习掌握D/A转换基本原理,掌握D/A转换程序设计方法。

二、实验原理:D/A转换器的功能主要是将输入的数字量信号转换成模拟量,检测按键执行相应的D/A转换,显示结果。本实验仿真电路图、流程图如下:

(流程图)

三、实验代码:

#include

#include

#define uchar unsigned char

#define DAC0832 XBYTE[0x7fff]

sbit P10=P1^0;

sbit P12=P1^2;

void main()

{  DAC0832=0x80;

   while(1)

    { P1=0xff;

      if(P10==0)

       {  DAC0832=0xff;}

      if(P12==0)

       {DAC0832=0x00;}

    }

}

四、实验结论:通过手动按键将数字量DAC0832转换输出模拟电压信号。

实验十 模/数转换实验

一、实验目的:学习掌握A/D转换基本原理,掌握用无条件方式、查询方式、中断方式完成模/数转换程序的编写方法。

二、实验原理:A/D转换是将模拟量转换为一定码制的数字量。调节滑动变阻器将模拟量转换成数字量通过P1口输出显示。本实验仿真电路图、流程图如下:

(流程图)

三、实验代码:

#include

#include

#define uchar unsigned char

#define ADC08080 XBYTE[0x78ff]

sbit P33=P3^3;

sbit P27=P2^7;

sbit P36=P3^6;

sbit P37=P3^7;

void main()

{ EA=1;

  EX1=1;

  IT1=1;  

  ADC08080=0;     //启动A/D

  while(1);

}

void int0() interrupt 2

{ P1=ADC08080;     //读取数据

  ADC08080=0;      //启动A/D

}

四、实验结论:当A/D转换结束时,引脚EOC由低电平转换为高电平输出信号LED亮,调节滑动变阻器显示相应的LED亮。

文档

单片机C51程序设计实验报告书

实验一并行输入输出口的使用一、实验目的:学会设计proteus7仿真电路,学习P1口的使用方法和延时子程序的编写用KeiluVision3编程实现发光二极管的流水点亮。二、实验原理:P1口为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1)。P1口作为输出,接8个发光二极管D1~D8经限流电阻分别接至8个引脚。本实验仿真电路图、流程图如下:三、实验代码:#include#include//移位库函数包含于此头文件中voiddelay(unsignedi
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top