单片机实验报告

编号   

  单片机原理及应用  

实验报告

    名:                    

    号:              

实验班级:        

实验时间:        2014.11            

实验报告总份(片)数:   12   份(片)

实验教师:                         

    信息工程  学院  实验1号楼   实验室

实验一:开发软件使用与调试方法

一.   实验目的:

学习KEIL 的使用方法,用Keil 开发工具编译C 源码、汇编源程序。掌握单片机的编程及调试。

二.  实验内容和要求:

编写C语言程序,用Keil 将程序编译并生成HEX 文件调试程序。通过并口通信线连接PC 与实验箱,用Easy 51Pro 把程序下载到AT89S51 观察实验箱LED 的变化。

三.  实验要求程序代码:

#include <REGX51.H>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define     key1 P2_0

#define key2 P2_1

#define key3 P2_2

#define LED P0          

void delay_10ms()             //延时

{  uchar i,j;

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

     for(j=0;j<250;j++);

}

main()

{ uchar aa=0xfe;

  uchar flag=0;

  P2=0xff;

  LED=aa;

  while(1)

  {

    if(key1==0)

    {  delay_10ms();     //延时再次检测,键盘去抖

       if(key1==0)

            {

              flag=1;                          //flag标志为1表示开启流水灯

            }

         }                

         if(flag==1)                             

         {

                   aa=_cror_(aa,1);  //将aa循环右移1位后再赋给aa

             while(key1==0);          //等待按键松开

                   LED=aa;           //更新灯的状态

                   delay_10ms();

                   delay_10ms();

                   delay_10ms();

                   delay_10ms();

                   delay_10ms();

              if(key2==0 && key3==0)

                   {

                    delay_10ms();                             //延时再次检测,键盘去抖

                    if(key2==0 && key3==0)           //SW-1和SW-2同时按下,停止流水灯效果

                    {

                            flag=0;

                    }

             }

         }

  }

}

四.  实验心得:

通过本次试验,熟悉了keil软件的使用。在设置判断标志时,可以明确标识的值,例如用flag==1代替flag,flag==0代替!flag,如此可以尽量避免错误。

实验二:定时器和终中断应用程序设计与调试

一.   实验目的:

掌握单片机的定时器、中断功能系统的应用

二.  实验内容和要求:

编写程序,用AT89S51 的内部定时器/计数器T0的方式1产生周期为0.2秒的TTL 脉冲(TCH和TCL溢出的时候,产生一个中断),从P05输出。

三.   实验原理

AT89S51 的内部定时器/计数器T0的方式1产生周期脉冲

振荡器的频率f=6M=6,000,000;方式1计数器的长度为L=16,2 的16次方即65,536

定时时间(溢出时间)t=0.1s

定时常数TC=65,536 - 6,000,000 x 0.1 / 12 =65,536 – 50,000=15,536,将15,536转换成16进制为3CB0,

TH0=3CH(高八位),TL0=B0H(低八位)。

四.  实验要求程序代码:

1.  如果要输出一个周期为1 秒的方波,应怎样修改程序?

原本的定时为0.1秒,只需在中断里进行简单的循环五次即可

流程图:

void INT_T0() interrupt 1

{       

  TH0=0x3C;     //设置定时器初始值

  TL0=0xB0;

  if(i==4)     //判断是否循环五次

  {

  P0_5=!P0_5;   //取反

  i=0;

  }

  i++;

}

2.  如果要同时输出多个频率不同的方波(f1=38k, f2=1k),应怎样修改程序?

首先f1是f2的38倍,只需用一个定时器中断即可。计算f1定时时间:TC=65,536-6,000,000*1/38000/2/12=65,536-7=65,529

转化为16进制为FFF9,即TH0=FFH(高八位),TL0=F9H(低八位)。

只需更改前面的初始化和下面的中断程序

流程图:

void INT_T0() interrupt 1

{       

  TH0=0xFF;        //设置初始值

  TL0=0xF9;

  P0_6=!P0_6;     //产生频率为38kHz的方波信号

  if(i==37)

  {

  P0_5=!P0_5;          //中断每满38次时P05取反,产生频率为1kHz的方波信号

  i=0;

  }

  i++;

}

五.  实验心得:

熟悉定时器中断初值的初始化及计算方法


实验三:串行IO 扩展和LED 数码管显示实验

一.   实验目的:

掌握单片机的ISP 串行IO 扩展和LED 数码管显示的原理和应用。

二.  实验内容和要求:

AT89S51 的UART 由P30(RXD)和P31(TXD)组成,当UART 以方式0 工作的时候就是以SPI 的方式工作。用SPI 的方式来扩展低速的IO,可以节省P 口。参照下面的电路图,采用共阴的数码管,将阴极连接并串联4个二极管,由于二极管的管压降为0.7v和LED的管压降为1.7v得:0.7x4+ 1.7v= 4.5v(约为5v),当74LS164 输出高电平为5v、5ma 时,可驱动数码管;当输出低电平时数码管(等效于二极管)反向截止,没有电流通过。

三.   实验原理分析、实验现象及结果

实验原理:本次实验是通过串行IO扩展,并用LED数码管显示其数据改变,经过连接后,得到的原理图是移位寄存器,即通过的数据以移位寄存器的方式表现出来。

实验现象:静态时,数码管显示静态数据。当不断刷新时,数码管动态刷新数据,数据从右往左流动显示。

结果:可以通过串行IO扩展发送数据。

四.  实验要求程序代码:

1.  修改程序使得数码管显示16 进制数?

修改只是将display函数加了个形参,用来输入所要显示的数字,输入为十进制,显示为16进制,具体代码如下:

#include <REGX51.H>

#define uchar unsigned char

#define uint unsigned int

code uchar table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};//共阴段码,a对应最高位

uchar ds[4];

void display(uint k)

{ uchar i;

  ds[0]=k/16/16/16 ;                              //16进制的第四位(最高位)

  ds[1]=(k-ds[0]*16*16*16)/16/16; //16进制的第三位

  ds[2]=k%(16*16)/16;                        //16进制的第二位

  ds[3]=k%16;                                        //16进制的第一位(最低位)

 

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

  { SBUF=table[ds[i]];           //同步串口(串口默认工作方式),发送段码

    while(TI==0);              //等待发送完成

    TI=0; 

  }

}

main()

{  display(43977);            // 显示43977的16进制

  while(1)

    ;       

}

实验结果:

2. 和实验2的定时器综合,完成只显示分种和秒钟的电子时钟程序。

只需加一个中断,每1s溢出一次,再通过sec和min的计数器计数即可

#include <REGX51.H>

#define uchar unsigned char

#define uint unsigned int

code uchar table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};//共阴段码,a对应最高位

uchar num,sec,min;

void display()

{ uchar i;

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

  {

       switch(i)

         {

          case 0 :SBUF=table[min/10];break;                          //将min的十位送入数码管第四位(最高位)

          case 1 :SBUF=table[min%10]+0x01;break;             //将min的个位送入数码管的第三位,加0x01是为了显示小数点,区别分和秒

          case 2 :SBUF=table[sec/10];break;                           //将sec的十位送入数码管的第二位

          case 3 :SBUF=table[sec%10];break;                         //将sec的个位送入数码管的第一位(最低位)

         }

    while(TI==0); //等待发送完成

    TI=0; 

  }

}

void INIT()                                                                                            

{

 TMOD=0x01;                                                                                     //选择定时器方式1

 TH0=(65536-45872)/256;                                                               //装初值

 TL0=(65536-45872)%256;

 EA=1;                                                                                                   //开总中断

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

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

 display();                                                                                             //显示初始值0

}

main()

{

  INIT();                                                                                      //初始化

  while(1)

  {

  }

}

void T0_time()interrupt 1

{

 TH0=(65536-45872)/256;                                            //重装初值

 TL0=(65536-45872)%256;

 num++;

 if(num==20)                                                           //num计满20次,说明1s时间到

   {

     if(sec==60)                                                    //sec计满60,说明1min时间到

       {

         sec=0;                                                              //重装sec

             if(min==60)                                                     //min计满60,说明1hour时间到

             min=0;                                                              //重装min

             else

             min++;

       }

     else

     sec++;

         display();                                                          //显示

         num=0;                                                      //重装num

   }

}

实验结果:

五.  实验心得:

熟悉了串行IO口的扩展及LED数码管的显示


实验四:A/D 转换-亮度测量实验

一.   实验目的:

熟悉0809 的工作原理,掌握A/D 转换程序的设计方法以及与51 连接的接口电路设计方法。学习传感器件的应用。

二.  实验内容和要求:

按照硬件连接图和程序流程图,编写A/D转换程序,通过调节ADC0809的REF+观察REF与转换值之间的关系,了解光敏电阻的电气特性。

三.   实验原理分析、实验现象及结果

实验原理:首先通过单片机连接A/D数模转换器,利用外部中断方式读取AD转换结果,需要开启外部中断,总中断,以及设定中断的触发方式,然后通过传感器反馈数值,进行AD转换后显示在数码管上。

实验现象:数码管上显示数值,当用手遮挡光敏电阻时,数码管的数值出现明显变化。

实验结果:实验完成

四.  实验要求程序代码:

1.  在0809的IN-1端已接入热敏电阻,要测量温度的变化应将原程序如何修改?

答:只需将

uchar xdata ch0 _at_ 0x07ff8;

这句的最后三位修改成001即可接受IN-1的数据。即

uchar xdata ch0 _at_ 0x07ff9;

2.为何从数码管观察到,在亮度没有变化的情况下,随着ADC0809 的REF+的变化,AD 转化结果发生变化?

因为调节参考电压会改变AD转换器的分辨率,但实际上如果温度或者亮度没有产生变化,它们所表示的数值是一样的大小的,只是分辨率不同。

五.  实验心得:

熟悉了ADC0809的使用

 

第二篇:单片机实验报告习题

1. KeilC51开发环境的学习的实验

1. 简述建立一个工程的步奏

2. 画出调试状态下仿真器存储空间分配图,并根据该图说明内部MON51监控程序的

作用,并说明ORG指令的作用。

3. 简述DPflash程序的作用。

4. Keilc 51软件将用户调试程序在线下载到仿真器中准备开始调试运行的菜单命令式

什么?

2. 串转并的I/O口实验

以下是74HC164芯片的内部原理图:

单片机实验报告习题

2.1.简单说明串转并的作用。

2.2画出74HC164芯片的真值表,根据真值表说明:

A: clock引脚为低电平时的作用?

B: 为什么实验中要将B引脚设置为高电平?(参考内部原理图)

2.3.实验中如果需要输出的数据为 #CCH , Q0~Q7输出引脚分别为什么信号(用2进制数据标示)?

2.4 简单说明CLEAR引脚的作用

2.5 简单说明RLC指令的作用

3. 并转串的I/O口实验

以下是74HC165芯片的内部原理图:

单片机实验报告习题

3.1简单说明并转串的作用 3.2根据内部原理图,说明该165器件内部使用的是什么触发器? 3.3根据该触发器的类型,说明SER引脚的作用。 3.4 说明PL引脚的作用? 3.5 如果拨线开关状态为 11001100B ,那么并转串完毕后得到的值为多少?

4. 串行模数转换实验

4.1画出实验电路原理图。

4.2说明参考高电平和参考低电平的作用。

4.3 计算该电路图A/D转换的分辨率。

4.4 查阅相关资料,说明A/D转换芯片的3个性能指标(分辨率,误差,转换时间)的意义。

5. 时钟中断实验

5.1简述时钟的4种工作模式

5.2 说明如计算时钟定时器初值的方法

5.3 根据该实验内容,说明TMOD寄存器、TCON寄存器的控制方式。

5.3 简单说明CPU要响应中断的条件

6. 串口通讯实验

6.1 简述 TTL电平规范和RS232电平规范的差异,以及MAX232芯片的作用。

6.2 简述 产生9600波特率定时器初值的计算方法,并计算。

6.3 简述3种串口通讯方式的差异。

7. 数码管

7.1 简述共阴级和共阳级数码管的区别。

7.2. 分别计算共阴极和共阳极数码管显示数字5时的驱动码。

7.3. 简述数码管的静态显示和动态显示的方法。

相关推荐