单片机实验报告
报告人: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语言的编程,都通过这次锻炼,加深了掌握程度,学会了一些基本的编程思想,积累了一些编程经验;此外,实验设计也使我对单片机的内部结构、电路图以及各部分的功能都有很清楚地认识,尤其对单片的定时/计数、中断功能认识很深刻,这些功能是单片机应用系统能够实现的基础,是单片机的特色和主要功能。
单片机是一门实用性很强的课程,它是构成嵌入式系统的核心,在微型实时控制系统中起着举足轻重的作用。只有不断地去实践才能对所学知识运用自如,才能将知识转化为产品
单片机实验报告学生姓名学号专业指导教师学院信息与电气工程学院20xx年11月单片机实验报告实验一MCS51指令系统实验数据排序1实…
通信与信息工程学院20xx20xx学年第二学期实验报告课程名称单片机原理及应用专业班级学号学生姓名指导教师日期20xx年4月15日…
题目单片机组成原理实验报告学院计算机科学与工程学院专业信息安全姓名学号20xx年12月8日实验一输入输出接口编程一实验目的1掌握K…
51单片机课程设计报告学院:专业班级:姓名:指导教师:设计时间:51单片机课程设计一、设计任务与要求1.任务:制作并调试51单片机…
海南大学届单片机实验报告4份论文题目学生姓名学号所在院系专业班级授课教师完成时间蜂鸣器实验实验目的1熟悉实验板中蜂鸣器工作原理掌握…
福建农林大学计算机与信息学院信息工程类实验报告课程名称:单片机技术姓名:系:电子信息工程系专业:电子信息工程年级:学号:指导教师:…
HEFEIUNIVERSITY单片机实验报告系别电子信息与电气工程系专业班级学号姓名指导老师完成时间实验一构建单片机最小系统和实验…
1福建农林大学计算机与信息学院信息工程类实验报告课程名称姓名系专业年级学号指导教师职称单片机技术詹缓辉电子信息工程系电子信息工程2…
华中科技大学单片机实验报告MCS51系列单片机单片机原理及应用实验根据20xx年电气与电子工程学院单片机实验课程改编专业电气工程及…
实验课程名称自动控制综合实验2》姓名学院自动化学院专业班级学号、班内序号指导教师20##年月单片机部分一、仿真软件的使用以及跑马灯…
时间过得真快,不经意间,一个学期就到了尾声,进入到如火如荼的期末考试阶段。在学习单片机这门课程之前,就早早的听各种任课老师和学长学…