单片机实验报告

单片机实验报告

报告人:xxx

学 号:2012211812

班 号:2012211407

指导老师:姚燕

2015-06-15

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

一、实验目的

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

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

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

二、实验内容及要求

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

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

3、实验程序要求用汇编语言编写。

三、实验器材:

(1) 超想-3000TB综合实验仪1台 (2) HK51TB仿真板1块

四、程序框图:

单片机实验报告

五、实验步骤:

(1)按流程图编写程序 循环

(2)把超想-3000TB综合实验仪与HK51TB仿真适配板连接好。

(3)设置工作模式

(4)调试

附:实验程序

ORG 0000H

jmp erst

erst:mov p2,#0ffh ;赋予全高,使无效

zweite:mov A,p2 ;读取P2数值

jmp ST

ST: CLR P3.3

;MOV A,#0FEH

MOV R1,#08H ;设定循环次数,即灯总数

MOV R2,#08H

; MOV R3,#08H ;修改源程序取消关于P2端口的预知数

ST0: MOV P0,A ;P0端口 读入亮的灯个数

RL A ;左移,即使相应数量的灯亮并移动

ACALL DELAY ;延时,灯亮

DJNZ R1,ST0 ;循环8次,依次亮

;MOV A,#0FEH

ST1: MOV P1,A

RL A

ACALL DELAY

DJNZ R2,ST1

;MOV A,#0FEH

SETB P3.3

jmp zweite ;跳回开始,实现循环

; LJMP ST

DELAY: MOV R6,#90H

H1 : MOV R7,#0FFH

H2: DJNZ R7,H2

DJNZ R6,H1

RET

END

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

一、实验目的

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

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

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

二、实验内容及要求

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

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

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

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

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

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

2、把 T0 作为计数器对 T0 引脚的输入脉冲进行计数,使用P2 口中的一位作为输入口,接 1 个按键。所有按键的一端接通过上拉电阻接至+5V电源,另一端和电源地 GND 相连

接。在没有按键被按下时 P2 的输入为高电平,当有按键被按下时对应的 P2 的相应引脚被拉低,该引脚输入变成低电平。当按键次数达到3的整数倍时点亮P1口的一个发光二极管。 实验线路:

单片机实验报告

外部计数电路图

三、实验步骤:

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

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

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

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

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

四、实验说明

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

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

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

实验流程图:

单片机实验报告

实验一(二)流程图

N N

单片机实验报告

单片机实验报告

单片机实验报告

单片机实验报告

实验四流程图

附实验代码:

实验1:

#include <reg52.h>

#include <absacc.h>

#include <intrins.h>

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;

TL0=(65536-10000)%256;

TH0=(65536-10000)/256;

TR0=1;

initial_GLCD(); /*清屏*/

while(1)

{

if(TF0==1)

{

if(j<100)

{

TF0=0;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

j++;

}

else

{

j=0;

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:

#include <reg52.h>

#include <absacc.h>

#include <intrins.h>

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;

TL0=0xFF;

count++;

}

main()

{

uchar i;

TMOD=0x05;

TH0=0xFF;

TL0=0xFF;

EA=1;

ET0=1;

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);

}

}

实验3:

#include <reg52.h>

#include <intrins.h>

int num;

char aa=0xfe; //11111110b

void timer0_init()

{

TMOD=0X01;

TH0=(65536-500000)/256;//晶振为12MHz TL0=(65536-500000)%256; //定时为50ms EA=1;//开全局中断

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

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

}

void Timer0() interrupt 1

{

num++;

if(num==101)

{

num=0;

}

TH0=(65536-500000)/256;//晶振为12MHz TL0=(65536-500000)%256; //定时为50ms switch(num)

{

case 40:

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

case 42:

P2=aa; //11111101 aa=_crol_(aa,1);

break;

case 44:

P2=aa; //11111011 aa=_crol_(aa,1);

break;

case 46:

P2=aa; //11110111 aa=_crol_(aa,1);

break;

case 48: //11101111 P2=aa;

aa=_crol_(aa,1);

break;

case 50:

P2=aa; //11011111 aa=_crol_(aa,1);

break;

case 52:

P2=aa; //10111111 aa=_crol_(aa,1); break; case 54: P2=aa; //01111111 aa=_crol_(aa,1); break; case 56: P2=aa; //11111110 aa=_crol_(aa,1);

break;

case 58:

P2=aa;

aa=_crol_(aa,1); break;

case 60:

P2=aa;

aa=_crol_(aa,1); break;

case 62:

P2=aa;

aa=_crol_(aa,1); break;

case 64:

P2=aa;

aa=_crol_(aa,1); break;

case 66:

P2=aa;

aa=_crol_(aa,1); break;

case 68:

P2=aa;

aa=_crol_(aa,1); break;

case 70:

P2=aa;

aa=_crol_(aa,1); break;

case 72:

P2=aa;

aa=_crol_(aa,1); break;

case 74:

P2=aa;

aa=_crol_(aa,1); break;

case 76:

P2=aa;

aa=_crol_(aa,1); break; //11111101 //11101111 //11011111 //10111111 //01111111 //11111110 //11111011 //11110111

case 78:

P2=aa;

aa=_crol_(aa,1);

break;

case 80:

P2=aa;

aa=_crol_(aa,1);

break;

case 82:

P2=aa;

aa=_crol_(aa,1);

break;

case 84:

P2=aa;

aa=_crol_(aa,1);

break;

case 86:

P2=aa; //01111111

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

case 88:

P2=0x55; //01010101 break;

case 90:

P2=0xaa; //10101010 break;

case 92:

P2=0x55;

break;

case 94:

P2=0xaa;

break;

case 96:

P2=0x55;

break;

case 98:

P2=0xaa;

break;

case 100:

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

}

}

void main()

{

timer0_init();

while(1);

}

实验4:

#include <reg52.h>

#include <absacc.h>

#include <intrins.h>

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工作在

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

TL0=0xff;

ET0=1;//允许T0中断

EA=1;//允许CPU中断

TR0=1;//开启T0

if( count==3 )

{

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/D,TLC549)实验

一、实验目的

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

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

单片机实验报告

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

二、实验内容及要求

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

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

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

实验线路:

三、实验步骤:

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

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

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

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

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

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

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

单片机实验报告

单片机实验报告

单片机实验报告

单片机实验报告

单片机实验报告

附程序代码:

#include <reg52.h>

#include <absacc.h>

#include <intrins.h>

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++)

{

ch451_din=command&1; /*命令开始*/ /*送入12位数据,低位在前*/

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); /*显示结果*/

}

}

实验心得

通过实验,首先,我掌握了单片机系统集成开发软件keil-version的使用,对如何通过此平台建立工程,编辑、调试源程序及烧写到板子上运行的整个过程都较清楚;其次,通过实验设计,加深了我对单片机编程语言的理解,不管是汇编语言的编程,还是C语言的编程,都通过这次锻炼,加深了掌握程度,学会了一些基本的编程思想,积累了一些编程经验;此外,实验设计也使我对单片机的内部结构、电路图以及各部分的功能都有很清楚地认识,尤其对单片的定时/计数、中断功能认识很深刻,这些功能是单片机应用系统能够实现的基础,是单片机的特色和主要功能。

单片机是一门实用性很强的课程,它是构成嵌入式系统的核心,在微型实时控制系统中起着举足轻重的作用。只有不断地去实践才能对所学知识运用自如,才能将知识转化为产品

相关推荐