石家庄铁道大学单片机实验教学文案.docx
《石家庄铁道大学单片机实验教学文案.docx》由会员分享,可在线阅读,更多相关《石家庄铁道大学单片机实验教学文案.docx(41页珍藏版)》请在冰豆网上搜索。
石家庄铁道大学单片机实验教学文案
石家庄铁道大学单片机实验
石家庄铁道大学单片机实验题目
实验一数据区赋值
(用指针、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、甲机