单片机上机实验报告

单片机上机实验报告
单片机上机实验报告

单片机实验报告

班级:041231

学号:O(∩_∩)O~

姓名:雷锋

实验一:数码管实验

一.实验目的

1.了解数码管的显示原理;

2.掌握JXARM9-2440 中数码管显示编程方法。

二.实验原理

7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。

LED显示器的接口一般有静态显示与动态显示接口两种方式。本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0 来选择相应的数码管,地址0x20006000 为数码管的数据寄存器。数码管采用共阳方式,向该地址写一个数据就可以控制LED 的显示,其原理图如图所示。

三.实验内容及步骤

1、六个数码管同时正向显示0-F ,然后反向显示F-0。

1)参照模板工程leddemo(modules\leddemo\leddemo.apj),添加相应的文件,并修改led 的工程设置;

2)创建led.c 并加入到工程led 中;

3)编写LED 显示函数void led_display(void),正向显示0-F 然后反向显示F-0,并循环执行以上动作,在每次显示之间延时一段时间;

4)编译led,成功后,下载并运行,观察结果。

2、在六个数码管上依次显示“HELLO”,可分辨出轮流显示。步骤同上。

3、在六个数码管上依次显示“HELLO”,分辨不出轮流显示。步骤同上。

4、在每个数码管上递增显示0-9 。步骤同上。

四.实验程序

1、./****************************************************************

***/

/*文件名称: LEDSEG7.C */ /*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F */ /*******************************************************************/ #define U8 unsigned char

unsigned char seg7table[16] = {

/* 0 1 2 3 4 5 6 7*/

0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,

/* 8 9 A B C D E F*/

0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, };

void Delay(int time);

/*******************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */ /* 返回代码: 无 */ /* 参数说明: 无 */ /*******************************************************************/ void Test_Seg7(void)

{

int i;

*((U8*)0x20007000)=0x00; /*六个数码管都亮*/

for( ; ;)

{

for(i=0;i<0x10;i++) /*数码管从0到F依次显示出来*/

{

*((U8*)0x20006000)=seg7table[i];

Delay(1000);

}

for(0xf;i>=0x0;i--) /*数码管从F到0依次显示出来*/

{

*((U8*)0x20006000)=seg7table[i];

Delay(1000);

}

}

// TODO

}

/*****************************************************************/ /* Function name : 循环延时子程序 */

/* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /*****************************************************************/ void Delay(int time)

{

int i;

int delayLoopCount=1000;

for(;time>0;time--);

for(i=0;i

}

实验结果:6个数码管上一次显示0,1,2…F,然后从F到0循环。

2./******************************************************************

*/

/*文件名称: LEDSEG7.C */ /*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F */ /*******************************************************************/ #define U8 unsigned char

unsigned char seg7table[4]= {/*O L E H*/ 0xC0,0xC7,0x86,0x89};

void Delay(int time);

/*******************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */ /* 返回代码: 无 */ /* 参数说明: 无 */ /******************************************************************/ void Test_Seg7(void)

{

for( ; ;)

{

*((U8*)0x20007000)=0x3E; //**111110

*((U8*)0x20006000)=seg7table[0]; //第一个数码管显示O

Delay(1000);

*((U8*)0x20007000)=0x3D; //**111101

*((U8*)0x20006000)=seg7table[1]; //第二个数码管显示L

Delay(1000);

*((U8*)0x20007000)=0x3B; //**111011

*((U8*)0x20006000)=seg7table[1]; //第三个数码管显示L

Delay(1000);

*((U8*)0x20007000)=0x37; //**110111

*((U8*)0x20006000)=seg7table[2]; //第四个数码管显示E

Delay(1000);

*((U8*)0x20007000)=0x2F; //**101111

*((U8*)0x20006000)=seg7table[3]; //第五个数码管显示H

Delay(1000);

}

}

// TODO

/*******************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /*******************************************************************/ void Delay(int time)

{

int i;

int delayLoopCount=1000;

for(;time>0;time--);

for(i=0;i

}

实验结果:从左到右一次显示HELLO,之间有明显延迟。

3./******************************************************************

*/

/*文件名称: LEDSEG7.C */ /*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F */ /*******************************************************************/ #define U8 unsigned char

unsigned char seg7table[4]= {/*O L E H*/ 0xC0,0xC7,0x86,0x89};

void Delay(int time);

/*******************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */ /* 返回代码: 无 */ /* 参数说明: 无 */ /*****************************************************************/ void Test_Seg7(void)

{

for( ; ;)

{

*((U8*)0x20007000)=0x3E; //**111110

*((U8*)0x20006000)=seg7table[0]; //第一个数码管显示O

Delay(5);

*((U8*)0x20007000)=0x3D; //**111101

*((U8*)0x20006000)=seg7table[1]; //第二个数码管显示L

Delay(5);

*((U8*)0x20007000)=0x3B; //**111011

*((U8*)0x20006000)=seg7table[1]; //第三个数码管显示L

Delay(5);

*((U8*)0x20007000)=0x37; //**110111

*((U8*)0x20006000)=seg7table[2]; //第四个数码管显示E

Delay(5);

*((U8*)0x20007000)=0x2F; //**101111

*((U8*)0x20006000)=seg7table[3]; //第五个数码管显示H

Delay(5);

}

}

// TODO

/*******************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /******************************************************************/ void Delay(int time)

{

int i;

int delayLoopCount=5;

for(;time>0;time--);

for(i=0;i

}

实验结果:数码管上显示HELLO,几乎无延迟,同时显示。

4./*****************************************************************

/

/*文件名称: LEDSEG7.C */ /*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F */

/*****************************************************************/ #define U8 unsigned char

unsigned char seg7table[10]= {/*0,1,2,3,4,5,6,7,8,9*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,0x80, 0x90};

void Delay(int time);

/******************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 依次在7段数码管上显示0123456789ABCDEF */ /* 返回代码: 无 */ /* 参数说明: 无 */

/*****************************************************************/ void Test_Seg7(void)

{ int i;

for( ; ;)

{

*((U8*)0x20007000)=0x3E;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

*((U8*)0x20007000)=0x3D;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

*((U8*)0x20007000)=0x3B;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

*((U8*)0x20007000)=0x37;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

*((U8*)0x20007000)=0x2F;

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

{

*((U8*)0x20006000)=seg7table[i];

Delay(5000);

}

}

}

// TODO

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

/* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /*******************************************************************/ void Delay(int time) {

int i;

int delayLoopCount=10000;

for(;time>0;time--);

for(i=0;i

}

五.结果及分析

1.六个数码管同时显示,从0——F,接着从F——0反向显示。

分析:通过地址20007000选择哪个数码管亮,通过地址20006000决定数码管输出的内容。再通过循环可完成轮流显示。

2.可分辨出:从数码管的右边至左边依次显示hello

分辨不出:数码管上显示hello。

分析:由于改变了Delay的数值,导致频率变化,所以可以产生两种效果。

3.每个数码管递增显示0——9。

分析:原理同一,靠循环实现。

六.实验总结

1.由于数码管为共阳极,小数点为最高位,A为最低位,所以显示内容一定要计算正确。

2.循环条件要选择正确。

实验二:键盘输入实验

一.实验目的

1、学习键盘驱动原理;

2、掌握通过CPU的I/O扩展键盘的方法。

二.实验原理

键盘实现方案

采用专门的芯片实现键盘扫描

采用软件实现键盘扫描

软键盘实现方案

当开关打开时,通过处理器的I/O 口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O 口的输入将被拉低到逻辑0。

矩阵键盘电路

一个瞬时接触开关(按钮)放置在每一行与每一列的交叉点。每一行由一个输出端口的一位驱动,每一列由一个电阻器上拉且供给输入端口一位。

键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下

每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动,换句话说,扫描码将告诉应用程序按下哪个键

键盘扫描算法

初始化:所有的行(输出端口)被强行设置为低电平在没有任何键按下时,所有的列(输入端口)将读到高电平。

任何键的闭合将造成其中的一列变为低电平。

一旦检测到有键被按下,就需要找出是哪一个键。过程很简单,微处理器只需在其中一行上输出一个低电平。如果它在输入端口上发现一个0值,微处理器就知道在所选择行上产生了键的闭合

三、实验内容及步骤

(一)学习与分析例程中的各个程序以及主要函数,以进一步理解键盘的工作原理。(二)获取按键值,在串口显示。

(三)使按键按照如图的顺序显示出来。

(四)将键盘按键值在数码管上显示。或自行开发。

四.实验程序:

1./* 包含文件*/

#include "def.h"

#include "2410lib.h"

#include "option.h"

#include "2410addr.h"

#include "interrupt.h"

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

// Function name : Main

// Description : JXARM9-2410 键盘实验主程序

// 实现功能:

// Return type : void

// Argument : void

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

void Main(void)

{

/* 配置系统时钟*/

ChangeClockDivider(2,1);

U32 mpll_val = 0 ;

mpll_val = (92<<12)|(1<<4)|(1);

ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);

/* 初始化端口*/

Port_Init();

/* 初始化串口*/

Uart_Init(0,115200);

Uart_Select(0);

/* 打印提示信息*/

PRINTF("\n---键盘测试程序---\n");

PRINTF("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200, 8, N, 1)\n");

/* 开始回环测试*/

while(1)

{

unsigned char ch;

ch=Key_GetKeyPoll();

// TODO

// 获取键值

if(ch != 0)

{

PRINTF("\r'%c'键按下", ch);

}

}

}

实验结果:在小键盘上按键,串口上显示按键对应字符,如按0,串口上显示0。

2.在库函数中改变如下的key按键值,使对应于键盘上的位置

char key_get_char(int row, int col)

{

char key = 0;

switch( row )

{

case 0:

if((col & 0x01) == 0) key = 'D';

else if((col & 0x02) == 0) key = 'E';

else if((col & 0x04) == 0) key = 'F';

else if((col & 0x08) == 0) key = '0';

break;

case 1:

if((col & 0x01) == 0) key = 'C';

else if((col & 0x02) == 0) key = '7';

else if((col & 0x04) == 0) key = '4';

else if((col & 0x08) == 0) key = '1';

break;

case 2:

if((col & 0x01) == 0) key = 'B';

else if((col & 0x02) == 0) key = '8';

else if((col & 0x04) == 0) key = '5';

else if((col & 0x08) == 0) key = '2';

break;

case 3:

if((col & 0x01) == 0) key = 'A';

else if((col & 0x02) == 0) key = '9';

else if((col & 0x04) == 0) key = '6';

else if((col & 0x08) == 0) key = '3';

break;

}

}

实验结果:按下键盘的按键串口会按题图中所示对应显示

3./* 包含文件*/

#include "def.h"

#include "2410lib.h"

#include "option.h"

#include "2410addr.h"

#include "interrupt.h"

#include

#include

#define IIRNUMBER 2

#define U8 unsigned char

unsigned char table[16] = {

/* 0 1 2 3 4 5 6 7*/

0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,

/* 8 9 A B C D E F*/

0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,

};

/******************************************************************** // Function name : Main

// Description : JXARM9-2440 键盘实验主程序

// 实现功能:

// Return type : void

// Argument : void

*********************************************************************/ void Main(void)

{

/* 配置系统时钟*/

ChangeClockDivider(2,1);

U32 mpll_val = 0 ;

mpll_val = (92<<12)|(1<<4)|(1);

ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);

/* 初始化端口*/

Port_Init();

/* 初始化串口*/

Uart_Init(0,115200);

Uart_Select(0);

/* 打印提示信息*/

PRINTF("\n---键盘测试程序---\n");

PRINTF("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200, 8, N, 1)\n");

/* *((unsigned long int *)0x48000000) = 0x22111120;

*((unsigned long int *)0x4800000c) = 0x7ffc;

while(1){

*((unsigned short int *)0x10000000) = 0x0;

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

;

*((unsigned short int *)0x10000000) = 0xffff;

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

}

*/

/* 开始回环测试*/

int j=0,k=0;

unsigned char table1[6] = {0x1F,0x2F,0x37,0x3B,0x3D,0x3E};

while(1)

{

unsigned char ch;

ch = Key_GetKeyPoll();

if(ch != 0)

{

PRINTF("\r'%c'键按下", ch);

}

if(k<6) *((U8*) 0x20007000)=table1[k];

if(k==6) k=0;

switch(ch)

{

case '0':

j=0;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case '1':

j=1;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case '2':

j=2;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case '3':

j=3;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case '4':

j=4;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case '5':

j=5;

*((U8*) 0x20006000) = table[j]; //Delay (20);

k++;

break;

case '6':

j=6;

*((U8*) 0x20006000) = table[j];

k++;

break;

case '7':

j=7;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case '8':

j=8;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case '9':

j=9;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case 'A':

j=10;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case 'B':

j=11;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case 'C':

j=12;

*((U8*) 0x20006000) = table[j];

k++;

break;

case 'D':

j=13;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case 'E':

j=14;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

case 'F':

j=15;

*((U8*) 0x20006000) = table[j];

//Delay (20);

k++;

break;

default :break;

}

/****************************************************************************/ /* Function name : 循环延时子程序*/

/* Description : 循环'time' 次*/

/* Return type :void */

/* Argument : 循环延时计数器*/ /****************************************************************************/ void Delay(int time) {

int i;

int delayLoopCount=1000;

for(;time>0;time--);

for(i=0;i

}

}

}

实验结果:在键盘上按下按键,会显示在数码管上。

实验三:中断实验

一、实验目的

1、了解中断的作用;

2、掌握嵌入式系统中断的处理流程;

3、掌握ARM中断编程。

二、实验原理

当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器;或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU再返回并继续执行原来被中断的主程序。这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,使其工作效率得以大大地提高。

三、实验内容及步骤

(一)学习例程,对其关键程序与设置进行分析。

(二)编写中断处理程序,处理外部中断2,3,控制LED灯闪烁或数码管显示。

1、当外部中断2发生时,使8个LED在亮灭间切换;

2、当外部中断3发生时,使8个LED等依次亮一下。

*3、当中断发生时,控制数码管显示。

四.试验程序

#include "def.h"

#include "2410lib.h"

#include "option.h"

#include "2410addr.h"

#include "interrupt.h"

/* functions */

void eint2_isr(void) __attribute__ ((interrupt("IRQ")));;

void eint3_isr(void) __attribute__ ((interrupt("IRQ")));;

void delay();

/* variables */

int dither_count2 = 0;

int dither_count3 = 0;

static int nLed = 0;

/***************************************************************************** // Function name : Main

// Description : JXARM9-2410 中断实验主程序

// 完成功能:

// 外部中断按键引发中断

// Return type : void

// Argument : void

*****************************************************************************/ void Main(void)

{

/* 配置系统时钟*/

ChangeClockDivider(2,1);

U32 mpll_val = 0 ;

mpll_val = (92<<12)|(1<<4)|(1);

ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);

/* 中断初始化*/

Isr_Init();

/* 初始化端口*/

Port_Init();

/* 初始化串口*/

Uart_Init(0,115200);

Uart_Select(0);

/* 打印提示信息*/

PRINTF("\n---外部中断测试程序---\n");

PRINTF("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200, 8, N, 1)\n");

PRINTF("\n外部中断测试开始\n");

/* 请求中断*/

Irq_Request(IRQ_EINT2, eint2_isr); //中断选择

//Irq_Request(IRQ_EINT3, eint3_isr);

/* 使能中断*/

Irq_Enable(IRQ_EINT2);

//Irq_Enable(IRQ_EINT3);

dither_count2 = 0;

dither_count3 = 0;

while(1)

{

delay();

dither_count2++;

dither_count3++;

}

}

/***************************************************************************** // Function name : eint2_isr

// Description : EINT2中断处理程序

// Return type : int

// Argument : void

*****************************************************************************/ void eint2_isr(void)

{

Irq_Clear(IRQ_EINT2);

if(dither_count2 > 10)

{

dither_count2 = 0;

(*(U8*)0x20007000)=0x0; //中断发生时,数码管显示

(*(U8*)0x20006000)=0x80;

(*(U8*)0x20005000)=nLed; //LED亮灭切换

nLed=~nLed;

}

}

/***************************************************************************** // Function name : eint3_isr

// Description : EINT3中断处理程序

// Return type : int

// Argument : void

*****************************************************************************/ void eint3_isr(void)

{

Irq_Clear(IRQ_EINT3);

if(dither_count3 > 10)

{

dither_count3 = 0;

(*(U8*)0x20007000)=0x0; //中断发生时,数码管显示

(*(U8*)0x20006000)=0x90;

(*(U8*)0x20005000)=0x01;delay(); //LED依次亮一下

(*(U8*)0x20005000)=0x02;delay();

(*(U8*)0x20005000)=0x04;delay();

(*(U8*)0x20005000)=0x08;delay();

(*(U8*)0x20005000)=0x10;delay();

(*(U8*)0x20005000)=0x20;delay();

(*(U8*)0x20005000)=0x40;delay();

(*(U8*)0x20005000)=0x80;delay();

}

}

void delay()

{

int index = 0;

for ( index = 0 ; index < 20000; index++);

}

五.结果及分析

1.中断2发生时,LED 亮灭切换。

2.中断3发生时,LED 从右依次亮灭。

3.中断发生,数码管显示数字。

分析:加入中断使能语句,可使中断2和中断3发生,LED 的地址为20005000,其余和之前原理相同,在中断语句部分里面加入。

六.实验总结

1.同时只能有一个中断发生,注意中断间的切换。

实验四:A/D 实验 一.实验原理

1.了解模数转换的基本原理。

2.掌握模数转换的编程方法。

二.实验原理 要将模拟量转换成数字信号需经采样——>量化——>编码三个基本过程(数字化过程)。

(1)采样:按采样定理对模拟信号进行等时间间隔采样,将得到的一系列时域上的样值去代替u=f(t),即用u0、u1、…un 代替u=f(t)。这些样值在时间上是离散的值,但在幅度上仍然是连续模拟量。

(2)量化:

在幅值上再用离散值来表示。方法是用一个量化因子Q 去度量u0、u1、…,便得到整量化的数字量。 u0=2.4Q 2Q u1=4.0Q 4Q

1Q 2Q 3Q 4Q

5Q

6Q 7Q 0 1T 2T 3T 4T 5T 6T

U =f(t)t U 0

U 1U 2U 3U 4U 5U 6U 7

格→=Q V 5.0

单片机实验报告

院系:计算机科学学院专业:智能科学与技术年级: 2012 学号:2012213865 姓名:冉靖 指导教师:王文涛 2014年 6月1日

一. 以下是端口的各个寄存器的使用方式: 1.方向寄存器:PxDIR:Bit=1,输出模式;Bit=0,输入模式。 2.输入寄存器:PxIN,Bit=1,输入高电平;Bit=0,输入低电平。 3.输出寄存器:PxOUT,Bit=1,输出高电平;Bit=0,输出低电平。 4.上下拉电阻使能寄存器:PxREN,Bit=1,使能;Bit=0,禁用。 5.功能选择寄存器:PxSEL,Bit=0,选择为I/O端口;Bit=1,选择为外设功能。6.驱动强度寄存器:PxDS,Bit=0,低驱动强度;Bit=1,高驱动强度。 7.中断使能寄存器:PxIE,Bit=1,允许中断;Bit=0,禁止中断。 8.中断触发沿寄存器:PxIES,Bit=1,下降沿置位,Bit=0:上升沿置位。 9.中断标志寄存器:PxIFG,Bit=0:没有中断请求;Bit=1:有中断请求。 二.实验相关电路图: 1 MSP430F6638 P4 口功能框图: 主板上右下角S1~S5按键与MSP430F6638 P4.0~P4.4口连接: 2按键模块原理图: 我们需要设置两个相关的寄存器:P4OUT和P4DIR。其中P4DIR为方向寄存器,P4OUT 为数据输出寄存器。 主板上右下角LED1~LED5指示灯与MSP430F6638 P4.5~P4.7、P5.7、P8.0连接:

3 LED指示灯模块原理图: P4IN和P4OUT分别是输入数据和输出数据寄存器,PDIR为方向寄存器,P4REN 为使能寄存器: #define P4IN (PBIN_H) /* Port 4 Input */ #define P4OUT (PBOUT_H) /* Port 4 Output */ #define P4DIR(PBDIR_H) /* Port 4 Direction */ #define P4REN (PBREN_H) /* Port 4 Resistor Enable */ 三实验分析 1 编程思路: 关闭看门狗定时器后,对P4.0 的输出方式、输出模式和使能方式初始化,然后进行查询判断,最后对P4.0 的电平高低分别作处理来控制LED 灯。 程序流程图: 2 关键代码分析: #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 P4DIR |= BIT5; // 设置4.5口为输出模式 P4OUT |= BIT0; // 选中P4.0为输出方式 P4REN |= BIT0; // P4.0使能 while (1) // Test P1.4 { if (P4IN & BIT0) //如果P4.0为1则执行,这是查询方式按下去后是低,否则为高

单片机实验报告

实验报告 专业:计算机科学与技术班级:C093 姓名:孙丽君 学号:098677

实验一:数据传送实验 1.实验内容: 将8031内部RAM 40H—4FH单元置初值A0H—A FH,然后将片内RAM 40H—4FH单元中的数据传送到片内RAM 50H—5FH单元。将程序经模拟调试通过后,运行程序,检查相应的存储单元的内容。 2. 源程序清单: ORG 0000H RESET:AJMP MAIN ORG 003FH MAIN:MOV R0,#40H MOV R2,#10H MOV A,#0A0H A1:MOV@R0,A INC R0 INC A DJNZ R2, A1 MOV R1,#40H MOV R0, #50H

MOV R2, #10H A3: MOV A, @R1 MOV @R0, A INC R0 INC R1 DJNZ R2, A3 LJMP 0000H 3.实验结果: 4. CPU 对8031内部RAM存储器有哪些寻址方式? 答:直接寻址,寄存器寻址,寄存器间接寻址,位寻址。

5. 执行程序后下列各单元的内容是什么? 内部RAM 40H~4FH内容:A0~AF 内部RAM 50H~5FH内容:A0~AF 实验二多字节十进制加法实验 1.实验内容: 多字节十进制加法。加数首地址由R0 指出,被加数和结果的存储单元首地址由R1指出,字节数由R2 指出。将程序经模拟调试通过后,运行程序,检查相应的存储单元的内容。 2. 源程序清单: ORG0000H RESET: AJMP MAIN ORG0100H MAIN: MOV SP, #60H MOV R0, #31H MOV@R0, #22H DEC R0 MOV@R0, #33H

51单片机实验报告94890

《单片机与接口技术》实验报告 信息工程学院 2016年9月

辽东学院信息技术学院 《单片机与接口技术》实验报告 姓名:王瑛 学号: 0913140319 班级: B1403 专业:网络工程 层次:本科 2016年9月

目录 实验题目:实验环境的初识、使用及调试方法(第一章) 实验题目:单片机工程初步实验(第二章) 实验题目:基本指令实验(第三章)4 实验题目:定时器/计数器实验(第五章)4 实验题目:中断实验(第六章)4 实验题目:输入接口实验(第八章)4 实验题目:I/O口扩展实验(第九章)4 实验题目:串行通信实验(第十一章)4 实验题目:A/D,D/A转换实验(第十七章)4

实验题目:实验环境的初识、使用及调试方法实验 实验类型:验证性实验课时: 1 时间:2016年10月24日 一、实验内容和要求 了解单片机的基础知识 了解51单片机的组成和工作方法 掌握项目工程的建立、编辑、编译和下载的过程方法 熟练单片机开发调试工具和方法 二、实验结果及分析 单片机最小系统的构成: Keil集成开发环境:

STC-ISP:

实验题目:单片机工程初步实验 实验类型:验证性实验课时: 1 时间:2016 年10 月24 日一、实验内容和要求 点亮一个LED小灯 程序下载到单片机中 二、实验结果及分析 1、点亮一个LED小灯 点亮LED小灯的程序: #include //包含特殊功能寄存器定义的头文件 sbit LED = P0^0; sbit ADDR0 = P1^0; //sbit必须小写,P必须大写 sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main() { ENLED = 0; ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; LED = 0; //点亮小灯 while (1); //程序停止 } 2、程序下载 首先,我们要把硬件连接好,把板子插到我们的电脑上,打开设备管理器查看所使用的COM 口,如图所示:

实验报告(单片机实验报告)

1 双字节无符号数加法 例1: 双字节无符号数加法(R0 R1)+(R2 R3) → (R4 R5), R0、 R2、 R4存放16位数的高字节, R1、 R3、 R5存放低字节。已知(R0 R1)=(93h,79h);(R2 R3)=(25h,a4h) 假设其和不超过16位。请编程。 org 0000h Ljmp start org 0050h start: mov R0,#93h mov R1, #79h mov R2,#25h mov R3, #0a4h mov A,R1 ADD A,R3 mov R5,A mov A,R0 ADDC A,R2 mov R4,A ss: jmp ss end 2双字节无符号数减法

例2: 双字节无符号数相减(R0 R1)-(R2 R3) → (R4 R5)。R0、 R2、R4存放16位数的高字节, R1、 R3、 R5存放低字节,已知(R0 R1)=(93h,79h);(R2 R3)=(25h,a4h);请编程。同学自己可以设置被减数与减数数值 org 0000h Ljmp start org 0050h start: mov R0,#93h mov R1,#79h mov R2,#25h mov R3,#0a4h mov A,R1 CLR C SUBB A,R3 mov R5,A mov A,R0 SUBB A,R2 mov R4,A ss: jmp ss end 3双字节数乘以单字节数

例3: 利用单字节乘法指令,进行双字节数乘以单字节数运算。若被乘数为16位无符号数, 地址为M1(30H) 和M1+1(31H)(低位先、高位后), 乘数为8位无符号数, 地址为M2(32H), 积由高位到低位存入R2、 R3和R4三个寄存器中。 30H,31H,32H内容 12H,34H,56H ; org 0000h Ljmp start org 0050h start: mov 30h,#12h mov 31h,#34h mov 32h,#56h mov a,(30h) mov b,(32h) mul ab mov R3,b mov R4,a mov a,(31h) mov b,(32h) mul ab add A,R3 mov R3,A

单片机实验报告书

并行I/O接口实验 一、实验目的 熟悉掌握单片机并行I/O接口输入和输出的应用方法。 二、实验设备及器件 个人计算机1台,装载了Keil C51集成开发环境软件。https://www.360docs.net/doc/556237114.html,单片机仿真器、编程器、实验仪三合一综合开发平台1台。 三、实验内容 (1)P1口做输出口,接八只发光二极管,编写程序,使发光二极管延时(0.5-1秒)循环点亮。实验原理图如图3.2-1所示。 图3.2-1单片机并行输出原理图 实验程序及仿真 ORG 0000H LJMP START ORG 0100H START:MOV R2,#8 MOV A,#0FEH LOOP:MOV P1,A LCALL DELAY RL A

DJNZ R2,LOOP LJMP START DELAY:MOV R5,#20 D1:MOV R6,#20 D2:MOV R7,#248 D3:DJNZ R7,D3 DJNZ R6,D2 DJNZ R5,D1 RET END 中断实验 一、实验目的 熟悉并掌握单片机中断系统的使用方法,包括初始化方法和中断服务程序的编写方法。 二、实验设备及器件

个人计算机1台,装载了Keil C51集成开发环境软件。 https://www.360docs.net/doc/556237114.html,单片机仿真器、编程器、实验仪三合一综合开发平台1台。 三、实验内容 (2)用P1口输出控制8个发光二极管LED1~LED8,实现未中断前8个LED闪烁,响应中断时循环点亮。 实验程序及仿真 ORG 0000H LJMP MAIN ORG 0003H LJMP INT00 ORG 0010H MAIN: A1:MOV A,#00H MOV P1,A MOV A,#0FFH MOV P1,A SETB EX0 JB P3.2,B1 SETB IT0 SJMP C1 B1:CLR IT0 C1:SETB EA NOP SJMP A1 INT00:PUSH Acc PUSH PSW MOV R2,#8 MOV A,#0FEH LOOP: MOV P1,A LCALL DELAY RL A DJNZ R2,LOOP

单片机实验报告

太原工业学院计算机工程系成绩: 单片机原理及应用 课程实验报告 课程:单片机原理及应用 姓名:冯文颖 专业:计算机科学与技术 学号:132054413 日期:2016年4月20日 太工计算机工程系 计算机原理实验室

实验一:拆字程序实验 实验环境PC机+Win 2007+伟福仿真软件实验日期2016.4.20一.实验内容 1.熟悉51仿真系统,设计并单步调试实现,将R5中一字节数拆分成两位独立的数据,分别存于R6,R7中,将R6,R7中的一位HEX数据转换为输出 2.ASCII编码分析BIN,HEX,BCD,ASCII等不同编码的数学意义及表现形式上的异同 二.理论分析或算法分析 (1)基本要求的描述 在这次实验中,要将R5中存的一字节数拆分成两个独立的数据,主要用到是逻辑运算符中的与功能,进而取得高字节和低字节的数,将R5的数和0f0h进行与取得高字节,和0f0h 与取得低字节的数,进而将它们分别存于R6、R7中。 (2)扩展要求的描述 在扩展要求中,要求将高低字节的数据转换成ASCII码值,首先先运用操作符subb将高低位字节与0Ah进行比较,根据CY的值来判断高低字节的数据是否在0到9之间,若在则在它们的基础上加上30h即可得到其对应的ASCII码值,否则,若在A到F之间,则需要在它们的基础上加37h即可得到它们对应的ASCII码值。 三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等) org 0019h clr c mov r5,#6ah mov a,r5 anl a, #0fh mov r6, a mov a, r5 anl a,#0f0h swap a mov r7,a sjmp $ end Masc1:mov a,r6 add a,#0F6h . mov,a,r6 jnc ad30h add a,#07h ad30h: add a,#30h mov r6,a 1

单片机实验报告第四

单片机实验四 实验报告 课程名称:单片机原理及应用实验姓名:刘江 系别:信息系 专业:电气工程及其自动化年级:2012级 学号:120712039 指导教师:李莉 2015 年 6 月 30 日

一、实验目的和要求 1)熟悉Keil 软件界面,以及编辑、编译、运行程序的步骤; 2)熟悉Proteus软件界面,掌握用Proteus画仿真图的方法。 二、主要仪器设备 Keil 软件与Proteus仿真软件 三、实验设计要求 这次试验我通过Proteus仿真实现对流水灯功能的实现。受益匪浅,对80C51的功能和结构有了深层次的了解,我深刻的明白,要想完全了解C51还有一定距离,但我会一如既往的同困难作斗争。在实验中,我遇到了不少困难,比如不知道怎么将程序写进单片机中,写好程序的却总出错,不知道什么原因,原来没有生成hex文件。这些错误令我明白以后在试验中要步步细心,避免出错。 四、操作方法与实验步骤 1、Keil C51软件使用 在Keil C51集成开发环境下,建立一个工程并编辑以下源程序,熟悉Keil C51集成开发环境下各种菜单、命令的使用。 #include unsigned char code table[]={0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80}; void delay(unsigned char delay_time) { unsigned char i,j; for(i=0;i<=delay_time;i++) { for(j=0;j<=200;j++); } } void init_tx() { EA=1; EX0=1; IP=0x00; } void main() { unsigned char i;

51单片机数字电压表实验报告

微控制器技术创新设计实验报告 姓名:学号:班级: 一、项目背景 使用单片机AT89C52和ADC0808设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示。在单片机的作用下,能监测两路的输入电压值,用8位串行A/D转换器,8位分辨率,逐次逼近型,基准电压为 5V;显示精度伏。 二、项目整体方案设计 ADC0808 是含8 位A/D 转换器、8 路多路开关,以及与微型计算机兼容的控制逻辑的CMOS组件,其转换方法为逐次逼近型。ADC0808的精度为 1/2LSB。在AD 转换器内部有一个高阻抗斩波稳定比较器,一个带模拟开关树组的256 电阻分压器,以及一个逐次通近型寄存器。8 路的模拟开关的通断由地址锁存器和译码器控制,可以在8 个通道中任意访问一个单边的模拟信号。

三、硬件设计 四、软件设计#include<> #include""

#define uchar unsigned char #define uint unsigned int sbit OE = P2^7; sbit EOC=P2^6; sbit START=P2^5; sbit CLK=P2^4; sbit CS0=P2^0; sbit CS1=P2^1; sbit CS2=P2^2; sbit CS3=P2^3; uint adval,volt; uchar tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; void delayms(uint ms) {

单片机实验报告

南京晓庄学院电子工程学院 实验报告 课程名称:单片机系统设计与应用 姓名:森 专业:电子信息科学与技术 年级:14级 学号:05 2016年12 月1 日

实验项目列表 序号实验项目名称成绩指导教师 1 单片机仿真软件的使用 2 单片机I/O接口应用实验——流水灯 3 外部中断实验——工业顺序控制模拟 4 定时/计数器实验——矩形波 5 定时/计数器实验——计数器 6 综合实验 7 8 9 10 注: 1、实验箱端口为com6。 2、芯片选择切换到51 3、停止运行使用实验箱上的复位按钮

实验室号:___ 实验时间:成绩: 实验一仿真软件的使用 1.实验目的和要求 1)熟悉Keil C51软件界面,以及编辑、编译、运行程序的步骤; 2)掌握单片机仿真软件使用和调试的方法。 2.实验原理 Keil C51软件使用 在Keil C51集成开发环境下,建立一个工程并编辑源程序,熟悉Keil C51集成开发环境下各种菜单、命令的使用。 3.主要仪器设备(实验用的软硬件环境) 安装有Keil C51软件的PC机1台 4.操作方法与实验步骤 Keil C51软件使用 (1)建立用户文件夹 (2)建立工程 (3)建立文件并编码。输入以下源程序,并保存在项目所在的目录中 (4)把文件加入工程中 (5)编译工程。编译时观察在界面下方的“Build”页中的到编译错误信息和使用的系统资源情况等。 (6)调试。利用常用调试命令,如复位、运行、暂停、单步、单步跳过、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令进行调试,观察并分析调试结果。 (7)目标代码文件的生成。运行生成相应的.HEX文件。 5.实验内容及程序 1)从DATA区地址起始地址为40H的连续10个内存单元的内容传送到XDATA区起始地址为2000H的10个内存单元中。 注意:DATA区地址起始地址为40H的连续10个内存单元必须先赋初值。 P83-5源程序 #include #define uchar unsigned char xdata unsigned char buffer1[10]_at_ 0x2000; //在xdata区定义数组变量BUF1,首地址为2000H data unsigned char buffer2[10]_at_ 0x40; //在data区定义数组变量BUF2,首地址为40H void main(void)

51单片机实验报告

51单片机实验报告

实验一 点亮流水灯 实验现象 Led灯交替亮,间隔大约10ms。实验代码 #include void Delay10ms(unsigned int c); void main() { while(1) { P0 = 0x00; Delay10ms(50); P0 = 0xff; Delay10ms(50); } }

void Delay10ms(unsigned int c) { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } 实验原理 While(1)表示一直循环。 循环体首先将P0的所有位都置于零,然后延时约50*10=500ms,接着P0位全置于1,于是LED全亮了。接着循环,直至关掉电源。延迟函数是通过多个for循环实现的。 实验2 流水灯(不运用库函数) 实验现象 起初led只有最右面的那一个不亮,半秒之后从右数第二个led

也不亮了,直到最后一个也熄灭,然后led除最后一个都亮,接着上述过程 #include #include void Delay10ms(unsigned int c); main() { unsigned char LED; LED = 0xfe; while (1) { P0 = LED; Delay10ms(50); LED = LED << 1; if (P0 == 0x00) { LED = 0xfe; } } } void Delay10ms(unsigned int c)

单片机实验报告一

单片机实验报告 1 姓名 陈奋裕 时间 2014/10/30 地点 机电实验大楼B526 实验题目 软件开发环境和简单程序设计 一、实验目的 1. 熟悉WAVE 软件使用 2. 学习简单程序的调试方法 二、实验主要仪器及环境 PC 机、WA VE 软件、仿真器+仿真头、实验板、电源等。 三、实验内容及步骤 1.启动PC 机,打开WAVE 软件,软件设置为模拟调试状态。在所建的项目文件中输入源程序,进行编译,编译无误后,执行程序,点击全速执行快捷按钮,点击暂停按钮,观察存储块数据变化情况,点击复位按钮,可再次运行程序。 2.打开CPU 窗口,选择单步或跟踪执行方式运行程序,观察CPU 窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。 四、流程图及参考程序 实验1 1)参考程序 2)流程图 ORG 0000H START EQU 30H MOV R0, #START MOV R2, #10 mov a,#01h Loop: MOV @R0,A NOP LJMP $ END

五、实验及程序的分析和讨论 (1)第一个程序是将地址为30H到39H的寄存器的内容全部置1。先在R0中存放内部存储器的起始地址30H,R2中存放内部存储器的长度10个,累加器置1,然后利用循环控制指令DJNZ R2,Loop控制10次循环给上述10个单元赋值1.最后,使单片机自身跳转。 (2)实验得到全速执行后相应的测试结果: (3)实验得到30H到39H寄存器执行后的内容: 从该表中也可以看出该程序的功能,即将30H到39H的寄存器内容置1,说明自己的分析是对的。 六、实验小结 1、汇编语言的结果在软件里面全部都是黑色字体,无法编译,在老师的 提醒下,知道了WAVE软件只能执行ASM文件,所以实验前要先将文件 的类型改为.ASM。 2、程序中的逗号要在英文的状态下面编写;若提示有空余符号,则是分 号后面直接写注释,不要添加空格 七、思考题 1、软件开发环境提供了哪些调试手段?各有何特点? 答: 1.伟福仿真器为我们的调试提供了多种方法,它可以编译,以便查 找语法错误; 2.单步执行,来检查每句程序的功能; 3.全速执行程序,来检查整段程序要完成的功能; 4.还可以设置断点进行调试,以便分段执行程序。 2、如何将存储器块的内容移动到另一位置? 答:借助指针和寄存器,利用转移类指令即可将存储器块的内容移动到 另一位置。

单片机原理及应用实验报告

单片机原理实验报告 专业:计算机科学与技术 学号: :

实验1 计数显示器 【实验目的】 熟悉Proteus仿真软件,掌握单片机原理图的绘图方法 【实验容】 (1)熟悉Proteus仿真软件,了解软件的结构组成与功能 (2)学习ISIS模块的使用方法,学会设置图纸、选元件、画导线、修改属性等基本操作 (3)学会可执行文件加载及程序仿真运行方法 (4)理解Proteus在单片机开发中的作用,完成单片机电路原理图的绘制【实验步骤】 (1)观察Proteus软件的菜单、工具栏、对话框等基本结构 (2)在Proteus中绘制电路原理图,按照表A.1将元件添加到编辑环境中(3)在Proteus中加载程序,观察仿真结果,检测电路图绘制的正确性 表A.1

Switches&Relays BUT BUTTON 【实验原理图】 【实验源程序】 #include sbit P3_7=P3^7; unsigned char x1=0;x2=0 ; unsigned char count=0; unsigned char idata buf[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(int time) { int k,j;

for(;time<0;time--) for(k=200;k>0;k--) for(j=500;j<0;j--); } void init() { P0=buf[x1]; delay(10); P2=buf[x2]; delay(10); } void main() { init(); while(1) { x1=count/10; x2=count%10; P0=buf[x1]; delay(10);

C51单片机实验报告

实验报告册 课程名称:单片机原理与应用B 指导老师:xxx 班级:xxx 姓名:xxx 学号:xxx 学期:20 —20 学年第学期南京农业大学工学院教务处印

实验目录实验一:指示灯/开关控制器 实验二:指示灯循环控制 实验三:指示灯/数码管的中断控制 实验四:电子秒表显示器 实验五:双机通信

姓名:学号:班级:成绩: 实验名称:指示灯/开关控制器 一、实验目的: 学习51单片机I/O口基本输入/输出功能,掌握C语言的编程与调试方法。 二、实验原理: 实验电路原理图如图所示,图中输入电路由外接在P1口的8只拨动开关组成;输入电路由外接在P2口的8只低电平驱动的发光二极管组成。此外,还包括时钟电路、复位电路和片选电路。 在编程软件的配合下,要求实现如下指示灯/开关控制功能:程序启动后,8只发光二极管先整体闪烁3次(即亮→暗→亮→暗→亮→暗,间隔时间以肉眼可观察到为准),然后根据开关状态控制对应发光二极管的亮灯状态,即开关闭合相应灯亮,开关断开相应灯灭,直至停止程序运行。 三、软件编程原理为; (1)8只发光二极管整体闪烁3次

亮灯:向P2口送入数值0; 灭灯:向P2口送入数值0FFH; 闪烁3次:循环3次; 闪烁快慢:由软件延时时间决定。 (2)根据开关状态控制灯亮或灯灭 开关控制灯:将P1口(即开关状态)内容送入P2口;无限持续:无条件循环。 四、实验结果图: 灯泡闪烁:

按下按键1、3、5、7:

经检验,其余按键按下时亦符合题目要求。 五、实验程序: #include"reg51.h" void delay(unsigned char time) { unsigned int j=15000; for(;time>0;time--) for(;j>0;j--); } void main(){ key,char i; for(i=0;i<3;i++) { P2=0x00; delay(500); P2=0xff; delay(500) } while(1) { P2=P3;

单片机实验报告

课程设计课程名称单片机原理及应用 课题名称基于1602电子时钟设计 专业电子信息工程 班级 学号 姓名 指导老师 2017年12月21日 电气信息学院

课程设计任务书 课题名称基于1602电子时钟设计 姓名专业电子信息工程班级学号 指导老师 课程设计时间2017年12月4日-2017年12月15日(14、15周) 教研室意见意见:审核人: 一、任务及要求 设计任务: 以单片机为核心设计一个电子时钟。能焊接开发板的同学,在开发板上进行调试。 (1)时间显示在1602液晶上,并且按秒实时更新。 (2)使用按键随时调节时钟的时、分、秒,按键可设计三个有效键,分别为功能选择键、数值增大键和数值减小键。 (3)每次有键按下时地,蜂鸣器都以短“滴”声报警。 (4)如何继续断电前的时间。 设计要求: (1)确定系统设计方案; (2)进行系统的硬件设计; (3)完成必要的参数计算与元器件选择; (4)开发板焊接及测试 (5)完成应用程序设计; (6)应用系统的硬件和软件的调试。

二、进度安排 第一周: 周一:集中布置课程设计相关事宜,并查阅、收集相关设计资料。 周二:系统方案设计。 周三~周五:实验室进行硬件设计,软件设计及调试。 第二周: 周一~周二:实验室系统仿真及硬件调试。 周三:实验室检查调试结果。 周四:撰写设计报告。 周五:进行答辩和上交设计说明书。 三、参考资料 1、周向红.51系列单片机应用与实践教程.北京航空航天大学出版社.2008.5 2、周向红.51单片机课程设计.华中科技大学出版社.2011.1 3、王迎旭.单片机原理及应用(第2版).机械工业出版社.2012.2 4、郭天祥.51单片机C语言教程(入门提高开发拓展全攻略).电子工业出版社.2012.1 5、樊思奇.80C51单片机C语言程序设计完全手册.电子工业出版社.2014.5 6、彭伟.单片机C语言程序设计实训100例基于8051+Proteus仿真.电子工业出版社.2009.6 7、孙安青.MCS-51单片机C语言编程100例(第二版).中国电力出版社.2017.6 8、赵建领.零基础学单片机C语言程序设计.机械工业出版社.2012.9

单片机实验报告

本科生实验报告 实验课程单片机原理及应用 学院名称核技术与自动化工程学院 专业名称电气工程及其自动化 学生姓名 学生学号 指导教师任家富 实验地点6C902 实验成绩 二〇一五年三月二〇一五年六月 单片机最小系统设计及应用 摘要 目前,单片机以其高可靠性,在工业控制系统、数据采集系统、智能化仪器仪表等领域得到极其广泛的应用。因此对于在校的大学生熟练的掌握和使用单片机是具有深远的意义。通过本次课程设计掌握单片机硬件和软件方面的知识,更深入的了解单片机的实际应用,本次设计课程采用STC89C52单片机和ADC0804,LED显示,键盘,RS232等设计一个单片机开发板系统。进行了LED显示程序设计,键盘程序设计,RS232通信程序设计等。实现了单片机的各个程序的各个功能。对仿真软件keil的应用提升了一个新的高度。单片机体积小、成本低、使用方便,所以被广

泛地应用于仪器仪表、现场数据的采集和控制。通过本实验的学习,可以让学生掌握单片机原理、接口技术及自动控制技术,并能设计一些小型的、综合性的控制系统,以达到真正对单片机应用的理解。 关键词:单片机;智能;最小系统;ADC;RS232;显示;STC89C52 第1章概述 单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。单片机采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。 它最早是被用在工业控制领域,由于单片机在工业控制领域的广泛应用,单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。 现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。 第2章实验内容 2.1单片机集成开发环境应用

51单片机实验报告

实验一数据传送实验 实验内容: 将8031内部RAM 40H—4FH单元置初值A0H—AFH,然后将片内RAM 40H—4FH单元中的数据传送到片内RAM 50H—5FH单元。将程序经模拟调试通过后,运行程序,检查相应的存储单元的内容。 源程序清单: ORG 0000H RESET:AJMP MAIN ORG 003FH MAIN:MOV R0,#40H MOV R2,#10H MOV A,#0A0H A1:MOV @R0,A INC R0 INC A DJNZ R2, A1 MOV R1,#40H MOV R0, #50H MOV R2, #10H A3: MOV A, @R1 MOV @R0, A INC R0 INC R1 DJNZ R2, A3 LJMP 0000H 思考题: 1. 按照实验内容补全程序。 2. CPU 对8031内部RAM存储器有哪些寻址方式? 直接寻址,立即寻址,寄存器寻址,寄存器间接寻址。 3. 执行程序后下列各单元的内容是什么? 内部RAM 40H~4FH ___0A0H~0AFH______________________ 内部RAM 50H~5FH___0A0H~0AFH_______________________ 实验二多字节十进制加法实验

实验内容: 多字节十进制加法。加数首地址由R0 指出,被加数和结果的存储单元首地址由R1指出,字节数由R2 指出。将程序经模拟调试通过后,运行程序,检查相应的存储单元的内容。源程序清单:ORG 0000H RESET: AJMP MAIN ORG 0100H MAIN: MOV SP, #60H MOV R0, #31H MOV @R0, #22H DEC R0 MOV @R0, #33H MOV R1, #21H MOV @R1, #44H DEC R1 MOV @R1, #55H MOV R2, #02H ACALL DACN HERE: AJMP HERE DACN: CLR C DAL: MOV A, @R0 ADDC A, @R1 DA A MOV @R1, A INC R0 INC R1 DJNZ R2,DAL CLR A MOV ACC.0 , C RET 思考题: 1. 按照实验内容补全程序。 2. 加数单元、被加数单元和结果单元的地址和内容为? 3130H,2120H,6688H 3. 如何检查双字节相加的最高位溢出? 看psw.3 的溢出标志位ov=1 则溢出 4. 改变加数和被加数,测试程序的执行结果。 实验三数据排序实验

2014单片机实验报告

计算机硬件技术基础实验报告二 班级_________姓名__________学号__________成绩_________ 在Keil环境下运行以下程序,查看相关内存数据单元,并完成相应的题目。 1.编写程序,两位压缩的BCD码转换成相应的ASCII码 提示:算法1 ANL 拆字、ORL #30H 拼字 算法2 DIV 拆字、 ORL #30H 拼字 存储两位BCD数指压缩的BCD码占一个单元,相应的ASCII码占二个单元。 2.数据块传送程序: (1)把内部RAM 40H~4FH置初值0A0H~0AFH; (2)而后把40H~4FH内容传送到外部RAM 9800H~980FH中; (3)再把 9800H~980FH内容传送到 50H~5FH中。 ORG 0000H MAIN: MOV R0,#40H MOV R2,#10H MOV A,#0A0H A1: MOV @R0, A INC R0 INC A DJNZ R2, A1; [1]解释本条命令含义(在程序中的作用)。 MOV R0, #40H MOV DPTR, #9800H MOV R2, #10H A2: MOV A, @R0 MOVX @DPTR, A INC R0 INC DPTR DJNZ R2, A2; [2] 解释本条命令含义(在程序中的作用)。 MOV R0, #50H MOV DPTR, #9800H MOV R2, #10H A3: MOVX A, @DPTR; [3]为什么使用MOVX指令。 MOV @R0, A INC DPTR INC R0 DJNZ R2, A3 SJMP $ END

单片机实验报告

实 验 报 告 实验课程:单片机原理及应用 班级: 12自动化2班 学号: 姓名: 教师:张玲 成绩: 实验日期:年月日 实验名称:实验1——计数显示器 一、实验目的: 学习Proteus 软件的使用,掌握单片机原理图的绘图方法。 二、实验内容: 1、绘制“计数显示器”电路原理图; 2、利用提供的hex文件验证此电路的运行效果。 三、实验要求: 提交的实验报告中应包括:1、绘图方法简述,要求说明元件与电源的选取、摆放及属性编辑,总线与标签的画法等内容;2、电路原理图; 3、仿真运行效果展示,要求就仿真文件加载方法及3~4幅运行截图进行简要说明;4、实验小结,说明遇到的主要问题或实验

1体会等。 参考电路原理图如下: 元件类别电路符号元件名称 Microproces sor ICs “U1”80C51 Miscellaneo us “X1”/12MHz CRYSTAL Capacitors“C1”~“C2” /1nF CAP Capacitors“C3”/22μF CAP-ELEC Resistors Packs “RP1”/7-100ΩRESPACK-7 Resistors“R1”/100ΩRES Optoelectro nics “LED1”~ “LED2” 7SEG-COM-CAT-G RN Switches & Relays “BUT”BUTTON 1、编程思路及C51源程序:

2、电路原理图: 3、仿真运行效果展示:

4、实验小结: 熟悉Proteus软件,了解软件的结构组成与功能;学习ISIS模块的使用方法, 学会设置图纸、选元件、线画总线、修改属性等基本操作;学会可执行文件 加载及程序仿法;理解Proteus在单片机开发中的作用,完成单片机电路原 理图的绘制。

单片机原理实验报告(详细)

湖南城市学院 实验报告 2018-2019 学年上学期 姓名:*** 班级学号:****** 实验课程:单片机原理及应用 实验室名称:电子工程实验室 湖南城市学院信息与电子工程学院实验中心印制

实验项目名称:实验一指示灯和开关控制器实验 一、实验目的及要求 1、学习51单片机I/O基本输入/输出功能,掌握汇编语言的编程与调试方法; 2、熟悉proteus软件,了解软件的结构组成与功能; 3、学会在ISIS模块中进行汇编程序录入、编译和调试; 4、理解单片机程序控制原理,实现指示灯/开关控制器的预期功能。 二、实验原理 实验电路原理图如图1所示,图中输入电路由外接在P3口的8只拨动开关组成;输出电路由外接在P2口的8只低电平驱动的发光二极管组成。此外,还包括时钟电路、复位电路和片选电路。 图1 实验原理图

在编程软件的配合下,要求实现如下指示灯/开关控制功能:程序启动后,8只发光二极管先整体闪烁3次(即亮→暗→亮→暗→亮→暗,间隔时间以肉眼可观察到为准),然后根据开关状态控制对应发光二极管的灯亮状态,即开关闭合相应灯亮,开关断开相应灯灭,直至停止程序运行。软件编程原理为:(1)8只发光二极管整体闪烁3次 亮灯:向P2口送入数值0; 灭灯:向P2口送入数值0FFH; 闪烁3次:循环3次; 闪烁快慢:由软件延时时间决定。 (2)根据开关状态控制灯亮或灯灭 开关控制灯:将P3口(即开关状态)内容送入P2口; 无限持续:无条件循环。 程序流程图如图2所示。 图2 实验程序流程图

三、实验仪器设备及装置 (1)硬件:电脑一台; (2)仿真软件:Proteus; (3)编程软件Keil uVision4。 其中,仿真软件ISIS元件清单如表1所示。 表1 仿真软件ISIS元件清单 四、实验内容和步骤 (一)实验内容: (1)熟悉ISIS模块的汇编程序编辑、编译与调试过程; (2)完成实验的汇编语言的设计与编译; (3)练习ISIS汇编程序调试方法,并最终实现实验的预期功能。 (二)实验步骤: (1)提前阅读与实验相关的阅读材料; (2)参考指示灯/开关控制器的原理图和实验的元件清单,在ISIS中完成电路原理的绘制; (3)参考程序流程图在Keil uVision4中编写和编译汇编语言程序; (4)利用ISIS的汇编调试功能检查程序的语法和逻辑错误; (5)观察仿真结果,检验与电路的正确性。

51单片机信号发生器实验报告

微控制器技术创新设计实验报告姓名:学号:班级: 一、项目背景 信号发生器也叫做振荡器或是信号源,在现在的科技生产实践中有着广泛而重要的应用。现在的特殊波形发生器在价格上不够经济,有些昂贵。而基于AT89C51单片机的函数信号发生器可以满足此要求。根据傅里叶变换,各种波形均可以用三角函数的相关式子表示出来。函数信号发生器能够产生多种波形,如三角波、锯齿波、矩形波、方波和正弦波。 二、项目整体方案设计 可以利用单片机编程的方法来实现波形的输出。可选用AT89C51作为控制器,输出相应波形的数字信号,再用D/A 转换器输出相应波形的模拟信号。用DAC0832作为D/A转换器,再经过两级放大后输出,最终在示波器上显示。可以使用按键扫描来实现波形的变化

三、硬件设计 四、软件设计 #include #define uchar unsigned char #define uint unsigned int Const tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff ,0xff,0xff,0xff,0xff,0xff,0xff}; void delay(void) { uchar i; for(i=230;i>0;i--); }

void main() { uchar i; while(1) { for(i=0;i<18;i++) { P1=tab[i]; delay(); } } } 五、实验结果

六、项目总结 通过这次实验设计,锻炼我们综合运用知识,提出问题,分析问题,及解决问题的能力。我感慨颇多,在着手设计的这段日子里,我又学到了很多东西。特别是理论联系实际。我认为掌握单片机的应用及开发技术是最基本的也是必要的。单片机是以后从事相关嵌入式研发最为基本的入门芯片。所以学好单片机是我们电子类的必要任务。通过这次单片机课程设计的顺利完成,离不开付老师指导,也离不开班上同学的耐心帮助。在此,我对所有帮助过我的老师和同学表示我真挚的感谢!

相关文档
最新文档