石家庄铁道大学单片机实验教学文案.docx

上传人:b****8 文档编号:10247608 上传时间:2023-02-09 格式:DOCX 页数:41 大小:22.85KB
下载 相关 举报
石家庄铁道大学单片机实验教学文案.docx_第1页
第1页 / 共41页
石家庄铁道大学单片机实验教学文案.docx_第2页
第2页 / 共41页
石家庄铁道大学单片机实验教学文案.docx_第3页
第3页 / 共41页
石家庄铁道大学单片机实验教学文案.docx_第4页
第4页 / 共41页
石家庄铁道大学单片机实验教学文案.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

石家庄铁道大学单片机实验教学文案.docx

《石家庄铁道大学单片机实验教学文案.docx》由会员分享,可在线阅读,更多相关《石家庄铁道大学单片机实验教学文案.docx(41页珍藏版)》请在冰豆网上搜索。

石家庄铁道大学单片机实验教学文案.docx

石家庄铁道大学单片机实验教学文案

 

石家庄铁道大学单片机实验

石家庄铁道大学单片机实验题目

实验一数据区赋值

(用指针、at、宏分别设计程序)

实现给片内RAM30H和片外RAM3000H开始的16字节区域分别赋值为0x01、0x02......0x0f。

At

#include//at

dataunsignedcharbuffer1[16]_at_0x30;

xdataunsignedcharbuffer2[16]_at_0x0030;

voidmain()

{

unsignedinti,j;

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

{

buffer1[i]=i;

}

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

{

buffer2[j]=j;

}

while

(1);

}

#include//宏

voidmain()

{

unsignedinti,a,b;

a=0x30;

b=0x0030;

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

{

DBYTE[a++]=i;

XBYTE[b++]=i;

}

while

(1);

}

指针

#include//指针

voidmain(void)

{

unsignedchardata*p1;

unsignedcharxdata*p2;

unsignedinti;

p1=0x30;

p2=0x3000;

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

{

*p1=i;

p1++;

*p2=i;

p2++;

}

}

实验二数据区数据处理

对30H开始的内存区数据0x01~0x0f进行处理:

将30H开始的内容变成0x01、0x23、0x45......0xef存到40H开始的单元

将40H开始的内容变成0xef、0xcd.....0x23、0x01存到50H开始的单元

将50H开始的内容变成0x0f、0x0e、0x0d......0x01、0x00存到60H开始的单元

#include

#include

#include

dataunsignedcharbuffer1[16]_at_0x30;

dataunsignedcharbuffer2[8]_at_0x40;

dataunsignedcharbuffer3[8]_at_0x50;

dataunsignedcharbuffer4[16]_at_0x60;

voidmain()

{

unsignedinti,j,k,r;

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

{buffer1[i]=i;}//30H赋值

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

{buffer2[j]=buffer1[2*j]<<4|buffer1[2*j+1];}//40H

for(k=0;k<8;k++)

{buffer3[k]=buffer2[7-k];}//50H

for(r=1;r<16;r++)

{

if(r%2==0)

buffer4[r-1]=buffer3[r/2-1]>>4;

elsebuffer4[r-1]=buffer3[r/2]&0x0f;}//60H

}

实验三并行口实验

P3.0接开关K0,设计程序实现:

当K0=0时,P1口连接的8个LED灯从LED0~LED7依次点亮;

当K0=1时,P1口连接的8个LED灯从LED7~LED0依次点亮;

#include

#defineuncharunsignedchar

voiddelay()

{

unchari,j;

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

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

}

voidmian()

{

unchara,b,i;

do

{P3=0xff;//将P3置为输入状态

a=P3;

a=a&0x01;//屏蔽高7位

if(a==0)

{b=0x01;

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

{P1=b;

delay();

b=b<<1;}

}

else

{b=0x80;

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

{P1=b;

delay();

b=b>>1;}

}

}while

(1);

}

根据P3.1和P3.0连接的开关K1和K0的状态实现P1口连接的8只LED灯按以下形式亮灭:

K1

K0

亮灯

0

0

8只灯全亮全灭交替

0

1

LED7~4和LED3~0交替全亮全灭

1

0

从全灭状态起,8只灯从两头到中间再从中间到两头依次点亮

1

1

从全亮状态起,8只灯从两头到中间依次点灭,再从中间到两头依次点亮

#include

#defineuncharunsignedchar

voiddelay()

{unchari,j;

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

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

}

voidmian()

{unchara,b,c,i;

do

{P3=0xff;

a=P3;

a=a&0x03;//屏蔽高六位

switch(a)

{case0:

{for(i=0;i<2;i++)

{P1=0x00;

delay();

P1=0x0ff;

delay();}

}break;

case1:

{for(i=0;i<2;i++)

{P1=0x0f;

delay();

P1=0x0f0;

delay();}

}break;

case2:

{P1=0x00;

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

{b=(0x01<

c=(0x80>>i)&0xf0;

P1=b+c;

delay();}

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

{b=(0x08>>i)&0x0f;

c=(0x10<

P1=b+c;

delay();}

}break;

case3:

{P1=0xff;

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

{b=(~(0x01<

c=(~(0x80>>i))&0xf0;

P1=b+c;

delay();}

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

{b=(~(0x08>>i))&0x0f;

c=(~(0x10<

P1=b+c;

delay();}

}break;

}//switch结束

}while

(1);

}

实验四外部中断实验1

INT0中断:

P1接8个LED灯,点动开关接P3.2(INT0),负跳变产生中断,编写程序实现:

主程序8只LED灯一起亮灭闪烁循环往复;INT0中断程序实现8个LED灯左右点亮循环5次后退出中断。

#include

#include

#defineuncharunsignedchar

voiddelay()

{

unchari,j;

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

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

}

voidmain()

{EA=1;

EX0=1;

IT0=1;

do{P1=0x00;

delay();

P1=0xff;

delay();}

while

(1);

}

voidint0()interrupt0using1

{

unchark,m;

k=0x80;

for(m=0;m<40;m++)//左点亮循环5次

{P1=k;

delay();

k=_cror_(k,1);

}

}

INT1中断:

P1接8个LED灯,点动开关接P3.2(INT0),负跳变产生中断,编写程序实现:

主程序8只LED灯一起亮灭闪烁循环往复;INT0中断程序实现8个LED灯左右点亮循环5次后退出中断。

#include

#include

#defineuncharunsignedchar

voiddelay()

{

unchari,j;

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

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

}

voidmain()

{

EA=1;

EX1=1;

IT1=1;

do{P1=0x00;

delay();

P1=0xff;

delay();}

while

(1);

}

voidint1()interrupt2using2

{

unchara,b,c;

EX1=0;

a=0x80;

for(b=0;b<5;b++)//左右点亮循环5次

{

for(c=0;c<8;c++)

{P1=0x80>>c;

delay();}

for(c=0;c<8;c++)

{P1=0x01<

delay();}

}

}

 

实验五外部中断实验2:

(中断优先级和中断嵌套实验)

两个外部中断:

P1接8个LED灯,点动开关接P3.2(INT0),K0开关接P3.3(INT1),均为负跳变产生中断和低优先级,编写程序实现如下功能:

①主程序8只LED灯一起亮灭闪烁循环往复。

②INT0中断程序实现:

8个LED灯左点亮循环5次后退出中断;INT1中断程序实现8个LED灯右点亮循环5次后退出中断。

(为方便实验现象观察,中断程序里的循环次数可改为10次)

运行程序,观察在INT0中断服务期间,INT1申请中断是否会响应?

(不会)在INT1中断期间,INT0申请中断是否会响应?

(不会)解释实验现象理解同优先级下的中断优先顺序的知识。

(自然优先级INT0>INT1,但进入中断后互不干扰;自然优先级下若同时触发INT0和INT1,则先响应INT0)

修改程序,INT0设为低优先级,INT1设为高优先级,运行程序观察实验现象:

在INT0中断程序运行中,INT1中断请求能否得到相应?

(可以)

在INT1中断程序运行中,INT0中断请求能否得到相应?

(不可以)

修改程序,INT0设为高优先级,INT1设为低优先级,运行程序观察实验现象:

在INT0中断程序运行中,INT1中断请求能否得到相应?

(不可以)

在INT1中断程序运行中,INT0中断请求能否得到相应?

(可以)

解释原因,加强对中断嵌套知识的理解。

(若手动设置优先级,(如PX0=1,PX1=0使INT0为高级中断、INT1为低级中断),高级中断可以打断执行中的低级中断)

(实验设置目的:

体会中断管理机制,理解中断嵌套规则。

#include

#include

#defineuncharunsignedchar

voiddelay()

{

unchari,j;

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

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

}

voidmain()

{

EA=1;

EX0=1;

EX1=1;

IT0=1;

IT1=1;

IP=0;

//1.IP=0即PX0=0;PX1=1;同为低优先级

//2.PX0=0;PX1=1;

//3.PX0=1;PX1=0;

do{

P1=0x00;

delay();

P1=0xff;

delay();

}

while

(1);

}

voidint0()interrupt0using1

{

unchara,b;

b=0x80;

for(a=0;a<40;a++)

{P1=b;

delay();

k=_cror_(b,1);

}

}

voidint1()interrupt2using2

{

unchark,m;

k=0x01;

for(m=0;m<40;m++)

{P1=k;

delay();

k=_crol_(k,1);

}

}

实验六定时器实验

P1接8个LED灯,点动开关接P3.2(INT0),负跳变产生中断。

编写程序实现如下功能:

①主程序8只LED灯上电全灭。

②INT0中断程序实现:

按一次启动定时器T0,再按一次停止。

停止后恢复到上电状态。

③定时器T0实现:

8个LED灯左点亮循环,每个点亮时间为1S。

(定时器分别用中断方式和查询方式实现。

定时器初值计算:

10000us=216-X*12/6得X=ec78H

中断方式:

#include

#include

unsignedchara,i=100;

voidmain()

{TMOD=0x01;

TH0=0xec;

TL0=0x78;

P1=0x00;

IT0=1;

EX0=1;

EA=1;

IT0=1;

EX0=1;

ET0=1;

TR0=0;

while

(1);}

voidtemer0()interrupt1

{TH0=0xec;

TL0=0x78;

i--;

if(i<=0)

{P1=a;

a=_cror_(a,1);

i=100;

}

}

voidint0()interrupt0

{TR0=~TR0;

if(TR0==0)

P1=0x00;}

查询方式:

#include

#include

unsignedchara,i=100;

voidmain()

{TMOD=0X01;

TH0=0Xec;

TL0=0X78;

P1=0X00;

IT0=1;

EX0=1;

EA=1;

IT0=1;

EX0=1;

TR0=0;

while

(1)

{

if(TF0)

{TF0=0?

TH0=0Xec;

TL0=0X78;

i--;

if(i<=0)

{P1=a;

a=_cror_(a,1);

i=100;}

}

}

voidint0()interrupt0

{TR0=~TR0;

if(TR0==0)

P1=0x00;}

实验七定时器计数器综合实验

P1接8个LED灯,P3.7接1个LED灯,点动开关接P3.2(INT0),负跳变产生中断,P3.3(INT1)用低电平触发中断。

编写程序实现如下功能:

①主程序9只LED灯上电全灭。

②INT0中断程序实现:

按一次启动定时器T0,再按一次停止。

停止后恢复到上电状态。

③INT1中断程序实现:

按一次启动定时器T1,再按一次停止。

停止后恢复到上电状态。

定时器T0实现:

P3.7所接1个LED灯亮灭闪烁,亮灭时间各为1S。

计数器T1实现:

记录由T1口所输入脉冲个数(P3.5输入下降沿),以二进制形式在P1口输出。

(提示:

低电平触发及时恢复高电平,以免中断重入)

(计数器输入为T1(P3.5)、T0(P3.4)外部脉冲;定时器为系统时钟12分频,内部脉冲(一个机器周期1us))

#include

#include

unsignedchari=100;

sbitP3_7=P3^7;

voidmain()

{TMOD=0X61;//(T1方式2.T0方式1)或2.TMOD=0X51;(T1.T0方式1)

TH0=0Xec;

TL0=0X78;

TH1=0Xff;//或2.TH1=0X00;

TL1=0Xff;//或2.TL1=0X00;

P1=0X00;

P3_7=0;

EA=1;

IT0=1;

EX0=1;

IT1=1;

EX1=1;

ET0=1;

ET1=1;

TR0=0;

TR1=0;

while

(1);//或2.P1=TL1;}

voidtemer0()interrupt1

{TH0=0Xec;

TL0=0X78;

i--;

if(i<=0)

{P3_7=~P3_7;

i=100;}

}

voidint0()interrupt0

{TR0=~TR0;

if(TR0==0)

P3_7=0;}

voidint1()interrupt2

{TR1=~TR1;

if(TR1==0)

P1=0;}

voidtemer1()interrupt3//2.TMOD=0X51;删掉该段

{unsignedcharb;

TH1=0Xff;

TL1=0Xff;

b++;

P1=b;}

实验八双机串行通讯基础实验

通信要求:

fosc=6M,波特率2400,(提示:

通讯双方工作在方式1,定时器1工作在方式2定时模式,计数初值设为:

0xf3,SMOD=1。

程序设计内容:

要求内部RAM30H开始的16个字节内容用程序实现赋值0~15。

用查询或中断方式实现将甲机内部RAM30H开始的16个字节的内容发送到已机并存入内部RAM40H开始的单元中,并同时从P1口输出。

为了观察发送过程,要求每发送一个数据使甲机的P1_0连接的指示灯LED0亮灭一次。

(亮灭延时时间自定,但要求能明显观察到亮灭状态转换。

温馨提示:

在中断处理模式中数据发送和接收完毕后,程序执行while

(1);语句,可在此处设置断点运行程序;或者执行一直让P1_0连接的LED0灯常亮的死循环程序;在查询模式下发送和接收完毕后最后执行while

(1);语句,可在此处设置断点运行程序;或者执行一直让P1_0连接的LED0灯常亮的死循环程序;)。

实验连线:

甲机的P1.0分别接LED0,乙机P1接LED0~LED7,甲机RXD接乙机TXD,甲机TXD接乙机RXD,两机共地。

#include//甲发送(中断)

#include

dataunsignedcharbuffer1[16]_at_0x30;

unsignedchari,temp=0,j=0;

sbitP1_0=P1^0;

voiddelay()

{

unsignedcharm,n;

for(m=0;m<255;m++)

for(n=0;n<255;n++);

}

voidmain()

{for(i=0;i<16;i++)

{buffer1[i]=i;}

P1_0=0;

TMOD=0X20;

TH1=0xf3;

TL1=0xf3;

SCON=0X40;

PCON=0X80;

EA=1;

ES=1;

TR1=1;

SBUF=buffer1[0];

while

(1);}

voidserialtrp()interrupt4

{TI=0;

SBUF=buffer1[j];

delay();

P1_0=~P1_0;

j++;

if(j==16)

j=0;

}

#include//乙接收中断

#include

#defineucharunsignedchar

uchari,j,Hong1=0x40,a=0;

voidmain()

{TMOD=0x20;

TH1=0xf3;

TL1=0xf3;

SCON=0x50;

PCON=0x80;

EA=1;

ES=1;

TR1=1;

P1=0;

while

(1);}

voidserall0()interrupt4

{RI=0;

if(a==16)

{ES=0;while

(1);}

else

{DBYTE[Hong1]=SBUF;

a++;

P1=DBYTE[Hong1];

Hong1++;}

}

#include//甲发送(查询1)

#include

dataunsignedcharbuffer1[16]_at_0x30;

unsignedchari,temp=0,j=0;

sbitP1_0=P1^0;

voiddelay()

{

unsignedcharm,n;

for(m=0;m<255;m++)

for(n=0;n<255;n++);

}

voidmain()

{

P1_0=0;

TMOD=0X20;

TH1=0xf3;

TL1=0xf3;

SCON=0X40;

PCON=0X80;

EA=1;

ES=1;

TR1=1;

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

{buffer1[i]=i;}

SBUF=buffer1[0];//可省

while

(1)

{

SBUF=buffer1[j];

delay();

P1_0=~P1_0;

j++;

if(j==16)

j=0;

while(TI==0);

}

}

#include//甲发送(查询2)

#include

#defineucharunsignedchar

sbitP1_0=P1^0;

dataunsignedcharbuffer[16]_at_0x30;

voiddelay(ucharj)

{uchart;

while(j--)

{for(t=0;t<120;t++);

}

}

voidmain()

{uchari,temp;

TMOD=0X20;

TH1=0Xf3;

TL1=0xf3;

SCON=0X40;

PCON=0X80;

TR1=1;

P1_0=0;

while

(1)

{for(i=0;i<16;i++)

{buffer[i]=i;

temp=buffer[i];

SBUF=temp;

while(TI==0);

TI=0;

P1_0=1;

delay(500);

P1_0=0;

delay(500);

}

}

}

#include//乙查询

#include

#defineucharunsignedchar

uchari,j,Hong1=0x40,a=0;

voidmain()

{TMOD=0x20;

TH1=0xf3;

TL1=0xf3;

SCON=0x50;

PCON=0x80;

TR1=1;

P1=0;

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

{while(RI==0);

RI=0;

DBYTE[Hong1]=SBUF;

a++;

P1=DBYTE[Hong1];

Hong1++;}

while

(1);}

实验九串行通信综合实验

通信要求:

fosc=6M,波特率2400,通讯双方工作在方式1,定时器1工作在方式2定时模式,计数初值设为:

0xf3,SMOD=1。

1、甲机

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

当前位置:首页 > 高等教育 > 文学

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

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