实验1-流水灯实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一流水灯实验
一、实验目的和要求
1、学习并掌握延时程序的C语言编程方法。
2、掌握并行口编程的方法。
二、实验设备
1、计算机一台。
2、MCS51单片机实验系统一套。
3、上位机端Keil C51编译系统。
三、实验线路图
四、实验内容
1、在Keil中,建立一个Project,单片机选AT89S52,晶振选12MHz,加
入下列程序exp11.c,编译通过后,进入Start Debug Session状态,全速运行RUN,打开Peripherals→I/O-ports→port 0,观察P0.0引脚的状态,现象记录入实验报告。
程序exp11.c
#include
sbit P00 = P0^0;
void delay(unsigned int t)
{ while(--t); }
main()
{ while(1)
{ P00=0;
delay(62470);
P00=1;
delay(62470);
}
}
2、将程序exp11.c编译后的.HEX烧录入单片机学习板,观察指示灯LS1的
现象。分析并说明灯LS1和P0.0引脚高低电平的关系。
3、分析exp11.c程序中delay()函数中,在12MHz晶振下,传递的参数t,跟延时时间的关系。改写函数delay(),并利用Debug单步执行的调试功能,调整参数,令传递的参数t数值对应时间单位为毫秒,如delay(500)为延时500毫秒。改写后的delay()函数写入实验报告,仿真调试并记录下delay(100),delay(200),delay(300),delay(400),delay(500)对应实际执行延时的时间,以横坐标为参数t,纵坐标为实际延时时间,在实验报告上画出对应曲线,分析t 跟实际延时时间的线性度,并指出该函数允许的最短和最长延时时间。
4、在步骤3的基础上,再次改写程序,实现流水灯功能,初始化状态8灯全灭,每隔0.5秒,实现LS1→LS2→... →LS8依次点亮、熄灭,并不断循环的效果。主程序while(1){...;}部分写入实验报告。
5、在步骤4的基础上,再次改写程序,实现初始化状态8灯全灭,每隔0.5秒,实现LS1→LS2→... →LS7→LS8→LS7→.. →LS1依次来回点亮、熄灭,并不断循环的效果。程序不需要写入报告。
6、在Keil中,重新建立一个Project,单片机选AT89S52,晶振选12MHz,加入下列程序exp12.c,编译通过后,将.HEX烧录入单片机学习板,观察指示灯LS1的现象。观察P0.0引脚的状态,现象记录入实验报告。
程序exp12.c
#include
unsigned char bdata flag;
unsigned char count;
sbit flag0 = flag^0;
sbit P00 = P0^0;
void timer0() interrupt 1 using 1
{
TH0 = 0x3C;
TL0 = 0xB0;
count++;
if(count==10)
{flag0 = 1;
count = 0;
}
}
main()
{ flag0=0;
count=0;
P00=1;
TMOD=0x01;
TH0 = 0x3C;
TL0 = 0xB0;
EA=1;
ET0=1;
TR0=1;
while(1)
{ while(!flag0);
flag0=0;
P00=!P00;
}
}
7、分析程序exp12.c中的中断服务函数里,TH0、TL0初值和if(count==10){...}
语句对定时时间的影响。修改中断服务程序,实现100毫秒、200毫秒,300毫秒、400毫秒、500毫秒的定时,并进入Start Debug Session状态,仿真调试,测试实际定时的时间,以定时数值为横坐标,实际定时时间为纵坐标,画出曲线,并跟步骤3的曲线进行对比,说明循环等待延时和T0定时器中断定时,这两种编程方法的准确性。
五、编程任务
修改程序exp12.c,实现步骤5一样的流水灯效果。