实验.docx

上传人:b****3 文档编号:3750282 上传时间:2022-11-25 格式:DOCX 页数:40 大小:1.15MB
下载 相关 举报
实验.docx_第1页
第1页 / 共40页
实验.docx_第2页
第2页 / 共40页
实验.docx_第3页
第3页 / 共40页
实验.docx_第4页
第4页 / 共40页
实验.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

实验.docx

《实验.docx》由会员分享,可在线阅读,更多相关《实验.docx(40页珍藏版)》请在冰豆网上搜索。

实验.docx

实验

实验项目一输入/输出端口的基本应用

1.实验目的

2.⑴了解MCS-51单片机的输入/输出端口的基本工作原理与使用方法;

⑵掌握MCS-51单片机的延时函数的时间估算方法。

2.实验内容

实现与单片机某一端口相连的发光二极管的闪烁控制,要点亮0.2s,熄灭0.2s;

3.实验电路框图

4.实验任务分析

⑴硬件电路说明

设置AT89C51的震荡频率为6MHZ,它的机器周期为2us,发光二极管接在P1.0端口,当P1.0端口上为低电平则led亮,否则为灭。

⑵软件设计说明

用三个FOR循环来延时,通过延时函数来延迟灯亮灭的时间。

5.实验流程框图

 

6.实验过程记录

⑴实验过程

⑵问题及解决方法

如何表示P1.0,如何延时0.2s,怎样才能让函数永远循环?

解决方法:

用sbitP1_0=P1^0表示P1.0。

用三个FOR循环用来延时。

用while

(1),循环条件永远为真,以下程序永远运行下去。

7.实验总结

⑴#defineucharunsignedchar

#defineuintunsignedchar可以简便。

⑵延时函数可以用用三个FOR循环加空语句。

8.成绩评定

 

附录实验源程序

/****预处理部分****/

#include

#defineucharunsignedchar

#defineuintunsignedchar

/****变量的定义****/

sbitP1_0=P1^0;

/****子函数部分****/

voiddelay_ms(intx)

{

uchari,j,k;//定义三个无符号字符型变量

for(i=0;i

for(j=2;j>0;j--)

for(k=248;k>0;k--);

}

/****主函数部分****/

voidmain(void)

{

while

(1)

{

P1_0=1;//P1口输出高电平,让LED点暗

delay_ms(200);//延迟200MS

P1_0=0;//P1口输出低电平,让LED点亮

delay_ms(200);//延迟200MS

}

}

/****中断函数部分****/

 

实验项目二定时/计算器的基本应用

1.实验目的

⑴掌握MCS-51定时/计数器的基本工作原理与使用方法;

⑵了解MCS-51单片机的中断服务程序的基本设计方法。

2.实验内容

用定时器T0实现与P1.0端口相连的发光二极管以1Hz的频率闪烁用定时器T1实现与P1.1端口相连的发光二极管以2Hz的频率闪烁。

3.实验电路框图

4.实验任务分析

⑴硬件电路说明

设置系统的时钟频率为12MHZ,利用定时/器计数器T0编程实现。

将两个LED分别接在P1.0,P1.1上。

⑵软件设计说明

从P1.0输出周期为1s的方波,只需P1.0每隔0.5s取反一次,从P1.1输出周期为2s的方波,只需P1.0每隔1s取反一次。

当系统时钟为12MHZ,定时器/计数器T0工作于方式一,最大的定时时间为65536us,TH0=(65536-50000)/256;TL0=(65536-50000)%256;P1.0每循环10次取反一次,P1.1每循环20次取反一次。

5.实验流程框图

6.实验过程记录

⑴实验过程

⑵问题及解决方法

系统只能循环一次,不能反复循环。

解决方法:

将num1,num2赋予原值

7.实验总结

⑴学会了用查询方式来定时。

当计数溢出时,TF0为1;

⑵学会用TH0=(65536-50000)/256;TL0=(65536-50000)%256;

来确定初值的第四位,高四位。

(3)学会了定时器/计数器的初始化。

①确定工作方式,对TMOD赋值。

②计算定时或计数的初值,将初值写入TH0,TL0或TH1,TL1。

③根据需要开启定时器/计数器中断,对IE寄存器赋值。

④启动定时器/计数器工作,将TR0或TR1置“1”。

8.成绩评定

 

附录实验源程序

/**********预处理部分**********/

#include

#defineucharunsignedchar

#defineuintunsignedint

/**********变量定义部分**********/

sbitled1=P1^0;sbitled2=P1^1;

/**********子函数部分**********/

voidtimer0_init()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

}

/**********主函数部分**********/

voidmain(void)

{

ucharnum1=0,num2=0;

timer0_init();

while

(1)

{do{}

while(!

TF0);

num1++;num2++;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;TF0=0;

if(num1>=10)

{

led1=!

led1;

num1=0;

}

if(num2>=20)

{

led2=!

led2;

num2=0;

}

}

}

/**********中断函数部分**********/

 

实验项目三中断系统的基本应用

1.实验目的

⑴掌握MCS-51中断系统的基本工作原理与使用方法;

⑵掌握MCS-51单片机的中断服务程序的基本设计方法。

2.实验内容

基本部分:

在P2端口接8个LED灯,用定时器T0,采用中断方式,每隔1s使点亮的LED增加1个;当8个LED全部点亮后,重新开始下一个循环。

提高部分:

在P3.2端口接一个按键开关,由它来控制以上LED的循环点亮,要求也采用中断控制方式。

3.实验电路框图

4.实验任务分析

⑴硬件电路说明

在P2端口接8个LED灯,用定时器T0,采用中断方式,系统的震荡周期为12MHz,它的机器周期为1us.

⑵软件设计说明每隔1s使点亮的LED增加1个;当8个LED全部点亮后,重新开始下一个循环。

当系统时钟为12MHZ,定时器/计数器T0工作于方式一,最大的定时时间为65536us,TL0=(65536-50000)%256;TH0=(65536-10000)/256;一经过100次中断,P2向左移动个0;

5.实验流程框图

6.实验过程记录

⑴实验过程

⑵问题及解决方法

系统一开始只有一个循环,一个循环结束后不能回到起点。

解决方法:

if(P2==0x00){P2=0x7f;}使得系统重新从第一个灯开始循环点亮。

7.实验总结

⑴学会用中断函数来计时。

(2)学会用依次向左移0来循环点亮小灯

8.成绩评定

 

附录实验源程序

/*******预处理部分**********/

#include

#defineucharunsignedchar

#defineuintunsignedint

/**********变量定义部分**********/

ucharnum1;

/**********子函数部分**********/

void_init_timer0()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

EA=1;

TR0=1;

}

/**********主函数部分**********/

voidmain(void)

{

init_timer0();

P2=0xff;

while

(1)

{

if(P2==0x00)

{

P2=0x7f;

}

if(num1==100)

{

num1=0;

P2=P2<<1;

}

}

}

/**********中断函数部分**********/

voidint_timer0(void)interrupt1

{

num1++;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

}

实验项目四LED数码管的基本应用

1.实验目的

⑴了解LED数码管的基本工作原理与使用范围;

⑵掌握LED数码管静态显示程序的基本设计方法;

⑶掌握LED数码管动态显示程序的基本设计方法;

2.实验内容

基本部分:

用LED数码管设计一个0—99秒的计数器,LED的显示方式可以采用静态显示方式实现;

提高部分:

用LED数码管设计一个0—99.99秒的计数器,LED的显示方式采用动态显示方式实现。

3.实验电路框图

4.实验任务分析

⑴硬件电路说明

⑵软件设计说明

5.实验流程框图

6.实验过程记录

⑴实验过程

⑵问题及解决方法

怎么实现0—99依次增加?

将各位十位用延迟函数分开显示。

7.实验总结

⑴知道了P0=0xff;P2=0x00;是消影,使显示更加清楚。

⑵用switc(i&0x01)case语句来控制AT89C51的P2^0,P2^1是输出高电平还是低电平。

8.成绩评定

附录实验源程序

/****预处理部分****/

#include

/****变量定义****/

unsignedchari,second;

unsignedseg_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

/****子函数部分****/

voidtimer0_init()

{

TMOD=0x01;

TH0=(65536-2000)/256;

TL0=(65536-2000)%256;

ET0=1;

EA=1;

TR0=1;

}

/****主函数部分****/

voidmain(void)

{

timer0_init();

second=00;

while

(1)

{

switch(i&0x01)

{

case0:

{

P0=0xff;P2=0x00;

P0=seg_table[second%10];P2=0x02;}break;

case1:

{

P0=0xff;P2=0x00;

P0=seg_table[second/10];P2=0x01;}break;

default:

break;

}

}

}

/****中断函数****/

voidtimer0_int()interrupt1

{

TH0=(65536-2000)/256;

TL0=(65536-2000)%256;

i++;

if(i==250)

second++;

if(second==100)

second=0;

}

 

实验项目五单片机键盘的基本应用

1.实验目的

⑴了解独立式键盘的基本工作原理与使用范围;

⑵掌握独立式键盘的识别方法、软件消抖的原理;

⑶掌握独立式键盘程序的基本设计方法。

2.实验内容

基本部分:

在MCS-51的P3.2管脚接一独立按键,再P1端口接8个LED,要求用按键来控制LED的循环点亮;

提高部分:

将基本部分中LED的点亮方式改为闪烁。

3.实验电路框图

4.实验任务分析

⑴硬件电路说明

让8盏LED灯分别接在AT89C51的P1端口。

P3.2接按键。

⑵软件设计说明

软件主要包括延时函数,移动函数,和一个主函数。

移动函数用位运算,实行灯的循环移动。

5.实验流程框图

6.实验过程记录

⑴实验过程

⑵问题及解决方法

不知道怎么样才能让灯闪烁?

在主函数里加上一个P1端口为高电平。

怎样让灯依次向左移动?

a=temp<

b=temp>>(8-count);

P1=a|b;

怎么让按键锁定?

Button=0.

实验总结

⑴软件消影的原理:

P1=0xff.

⑵确认按键按下的步骤:

(1)初次判断是否按下键盘。

(2)延时函数。

(3)再次判断是否按下键盘。

8.成绩评定

附录实验源程序

/****预处理部分****/

#include

/****变量定义****/

sbitbutton=P3^2;//定义按键的输入端

unsignedcharcount;//按键计数,每按一下,count加1

unsignedchartemp;

unsignedchara,b;

/****子函数部分****/

voiddelay10ms(void)//延迟程序

{

unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

key()//按键判断程序

{

if(button==0//判断是否按下键盘)

{

delay10ms();//延迟,软件去干扰

if(button==0)//确定按键按下

{count++;//按键计数加1

if(count==8)//计8次重新开始

{count=0;//将count清零

}

}while(button==0);//按键锁定,每按一下count只加1

}

}

move()//led向左移动移动函数

{a=temp<

b=temp>>(8-count);

P1=a|b;}

/****主函数部分****/

main()

{count=0;

temp=0xfe;

P1=0xff;

P1=temp;

while

(1)//永远循环,扫描判断按键是否按下

{key();//调用按键识别函数

move();//调用led移动函数

P1=0xff;}

}

/****中断函数部分****/

实验项目六单片机串口通讯实验

1.实验目的

⑴了解MCS-51单片机串口的基本工作原理与使用范围;

⑵掌握MCS-51单片机串口通讯程序的基本设计方法。

2.实验内容

基本部分:

在PROTEUS软件中采用串口虚拟终端,编写一个发送程序,将自己的学号发送到虚拟终端显示;

提高部分:

在单片机甲的P1口接8个开关,再单片机乙的P1口接8个LED,编写程序,将单片机甲的开关状态再单片机乙上显示出来。

3.实验电路框图

基本部分

提高部分

4.实验任务分析

⑴硬件电路说明

基本实验:

AT89C51的振荡频率为6MHZ,P3.0/RX0与串口检测工具的TX0相连,P3.0/TX0与串口检测工具的RX0相连。

提高部分:

单片机甲发送机,它的P1端口接8个开关;单片机乙接受机,它的P1端口接8个LED。

单片机甲的开关闭合为低电平,不闭合为高电平。

将单片机甲P3.0/TX0与单片机已P3.0/RX0相连。

⑵软件设计说明

设置串口方式一,SCON=0x40;PCON=0x00;设置计数器方式二,TMOD=0x20;设置波特率为1200,TH1=0xf3;TL1=0xf3;启动定时器TR1=1。

5.实验流程框图

6.实验过程记录

⑴实验过程

基本部分

提高部分

⑵问题及解决方法

1.起先输不出学号,是连串的乱码。

解决方法:

89C51的频率没有匹配,要设定为6兆。

7.实验总结

⑴要进行串口初始化,并且要设定好串行口的工作方式。

8.成绩评定

 

附录实验源程序

#include

voidmain()

{

unsignedchara[]={"201005014102"};

unsignedinti;

SCON=0x40;

PCON=0x00;

TMOD=0x20;

TH1=0xf3;

TL1=0xf3;

TR1=1;

while

(1)

{

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

{

SBUF=a[i];

while(!

TI){;}

TI=0;}

}

}

提高部分发射

#include

voidmain()

{

SCON=0X40;

PCON=0X00;

TMOD=0X20;

TH1=0XF3;

TL1=0XF3;

TR1=1;

while

(1)

{

SBUF=P1;

do{;}while(!

TI);

TI=0;}

}

接收

#include

#defineucharunsignedchar

voidmain()

{

//unsignedinti;

SCON=0X50;

PCON=0X00;

TMOD=0X20;

TH1=0XF3;

TL1=0XF3;

TR1=1;

while

(1)

{

do{;}while(!

RI);

RI=0;

P1=SBUF;}

}

实验项目七ADC0808的基本应用

1.实验目的

⑴了解ADC0808基本工作原理与使用方法;

⑵掌握MCS-51单片机ADC程序的基本设计方法。

2.实验内容

基本部分:

利用AT89C51和ADC0808设计一个简单的数字电压表,测量范围0-4.99V,采用3位LED数码管将采样后的结果进行显示;

提高部分:

将数字电压表的测量范围改为0-9.99V;

将基本部分的单通道数字电压表设计成一个8通道的数字电压表。

3.实验电路框图

4.实验任务分析

⑴硬件电路说明

Adc0808的A,B,C接地选通0通道,在0通道上外接0~5v变化的电源,adc808的输出端口与at89c51的P1端口相连,P2端口作为控制端口,P0端口与显示译码管相连。

⑵软件设计说明

软件组要由显示函数,中断函数,主函数构成。

5.实验流程框图

6.实验过程记录

⑴实验过程

⑵问题及解决方法

怎样将将二进制转换成十进制?

将P0=n/5.1*10;

7.实验总结

⑴用switch来选择显示百,十,个。

⑵学会用adc808来进行ad转换。

8.成绩评定

附录实验源程序

/*****预处理部分*****/

#include

#defineucharunsignedchar

/*****变量定义*****/

sbitST_abc0808=P3^6;

sbitOE_abc0808=P3^5;

sbitEOC_abc0808=P3^2;

sbitALE=P3^7;

unsignedinta1,a2,a3,n,i;

unsignedcharcodetable0[]={0x40,0x79,0x24,0x30,

0x19,0x12,0x02,0x78,0x00,0x10};

//数码管编码,小数点点亮

unsignedcharcodetable1[]={0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,0x80,0x90};

//数码管编码,小数点不点亮

/***子函数***/

voidtime0_init()

{

TMOD=0x01;//设置定时器0为为工作方式1(00000001)

TH0=(65534-2000)/256;//设置初值

TL0=(65534-2000)%256;

EA=1;//开启中断

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

TR0=1;//开启定时器

}

voiddisplay()//显示函数

{

a1=n/100;//百位

a2=(n%100)/10;//十位

a3=n%10;//个位

switch(i%3)

{

case0:

{P0=0Xff;P2=0X01;P0=table0[a1];}break;

case1:

{P0=0Xff;P2=0X02;P0=table1[a2];}break;

case2:

{P0=0Xff;P2=0X04;P0=table1[a3];}break;

default:

break;

}

}

/***主函数***/

voidmain()

{

time0_init();

while

(1)

{

ST_abc0808=0;//开始转换

ST_abc0808=1;

ALE=1;

time0_init();

ST_abc0808=0;

while(!

EOC_abc0808){;}//等待转换结束

OE_abc0808=1;

n=P1/5.1*10;//二进制转换成十进制

display();

OE_abc0808=0;

}

}

/****中断函数***/

voidtime0_int(void)interrupt1

{

TH0=(65534-2000)/256;//重装初值

TL0=(65534-2000)%256;

i++;

}

 

实验项目八基于AT89C51的简单电子万年历

1.实验目的

⑴了解电子万年历的基本工作原理与使用方法;

⑵掌握AT89C51设计电子万年历的基本方法。

2.实验内容

基本部分:

利用AT89C51和7段LED数码管设计一个简单的电子万年历,能显示时间、星期、年、月、日,并能进行设置;

提高部分:

将电子万年历增加一个闹钟功能;

当设定的闹钟时间到时,让单片机演奏一段音乐。

3.实验电路框图

4.实验任务分析

⑴硬件电路说明

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信,实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息。

DS1302与单片机之间采用同步串行的方式进行通信仅需要用到三个口线

(1)RES(复位),

(2)I/O(数据线),(3)SCLK(串行时钟).

⑵软件设计说明

构建数组ucharsettime[7]={0x50,0x59,0x09,0x28,0x09,0x07,0x08}来设置秒、分、时、日、日期、月、年;设计函数DS1302_Get1302(gettime)

获得当前时间;设计函数Disp_time(gettime)显示当前时间。

实验流程框图

6.实验过程记录

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1