您的当前位置:首页正文

单片机程序 流水灯

2023-07-31 来源:二三四教育网


一、实验目的及要求

1、 学会如何将3个端口内每个对应的位组合在一起,形成一个控制字,用来定义相应I/O口位的输入输出状态和方式。

2、 学会用按键控制LED灯的图案变化。

3、 将IOA作为按键输入,IOB输出到LED。通过按键的设定来展示出不同的LED花样效果来,花样可如下:

(a)所有八个LED循环闪烁;

(b)依次点亮一个LED,从左至右循环; (c)依次点亮一个LED,从右至左循环; (d)依次点亮两个LED,从左至右循环; (e)其余可自由发挥。

二、仪器用具 仪器名称 装有μ’nSP™ IDE仿真环境的PC机 μ’nSP™十六位单片机实验箱 连接I/O口的排线 规格/型号 数量 1 1 2 备注 三、实验方法与步骤

1、根据实验内容连接硬件电路并检查。 2、画流程图并编写程序代码。 3、编译程序,软件调试。

4、通过硬件调试完成实验要求。

四、硬件设备

五、实验程序流程图和源程序

程序流程图:

开始 设置IOA作为输入按键 设置IOB输出到LED 按键扫描,获取键判断键值? 通过判断返回值执行花样的子函数 结束 实验程序:

#include\"spce061A.h\"

unsigned int saomiao(void); void delay(void); void youyi(void); void zuoyi(void); void lwyouyi(void); void lwzuoyi(void); void xiangw(void); void xiangn(void);

int main(void) {

unsigned int key=0,temp=0;

*P_IOA_Dir=0xffff; *P_IOA_Attrib=0xffff; *P_IOA_Data=0x0000; *P_IOB_Dir=0x0000; *P_IOB_Attrib=0x0000; *P_IOB_Data=0x0000;

while(1) {

temp=saomiao(); if(temp!=0) {

key=temp; }

switch(key) {

case 1: zuoyi();break; case 2: youyi();break; case 3: lwyouyi();break; case 4: lwzuoyi();break; case 5: xiangw();break; case 6: xiangn();break; default:break; } } }

unsigned int saomiao(void)//按键扫描子函数 {

unsigned int n;

if(*P_IOB_Data==0x0001) n=1;

else if(*P_IOB_Data==0x0002) n=2;

else if(*P_IOB_Data==0x0004) n=3;

else if(*P_IOB_Data==0x0008) n=4;

else if(*P_IOB_Data==0x0010) n=5;

else if(*P_IOB_Data==0x0020) n=6; else

n=0; return n; }

void zuoyi(void) //花样左移子函数 {

unsigned int i; for(i=1;i<=128;) {

*P_IOA_Data=i; i=i*2; delay();

*P_Watchdog_Clear=0x0001; } }

void youyi(void)//花样右移子函数 {

unsigned int i; for(i=128;i>=1;) {

*P_IOA_Data=i; i=i/2;//i>>=1; delay();

*P_Watchdog_Clear=0x0001; } }

void lwzuoyi(void)//花样两位左移子函数 {

unsigned int i; for(i=3;i<=192;)

{

*P_IOA_Data=i; i=i*2;//i<<=1; delay();

*P_Watchdog_Clear=0x0001; } }

void lwyouyi(void)//花样两位右移子函数 {

unsigned int i; for(i=192;i>=3;) {

*P_IOA_Data=i; i=i/2; //i>>=1; delay();

*P_Watchdog_Clear=0x0001; } }

void xiangw (void) //花样由内向外移动 {

unsigned int i,j;

for(i=16,j=8;i<=128,j>=1;) {

*P_IOA_Data=i+j; i=i*2;//i<<=1; j=j/2;//j>>=1; delay();

*P_Watchdog_Clear=0x0001; } }

void xiangn (void) //花样由外向内移动 {

unsigned int i,j;

for(i=1,j=128;i<=8,j>=16;) {

*P_IOA_Data=i+j; i=i*2;//i<<=1; j=j/2;//j>>=1; delay();

*P_Watchdog_Clear=0x0001; } }

void delay(void)//延时函数 {

unsigned int i,j; for(i=0;i<100;i++) {

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

*P_Watchdog_Clear=0x0001; } }

六、实验现象

1、当按键1按下时:LED流水灯向左移动; 2、当按键2按下时:LED流水灯向右移动;

3、当按键3按下时:LED流水灯向右每次移动两位; 4、当按键4按下时:LED流水灯向左每次移动两位; 5、当按键5按下时:LED流水灯由内向外移动; 6、当按键6按下时:LED流水灯由外向内移动;

七、实验收获

 通过对流水灯控制实验的完成,基本掌握了凌阳单片机I/O口的参数设置方

法。

 基本掌握了按键的设置和使用方法。

 在控制流水花色变化的程序实现中,学会了左移与右移的两种算术和逻辑操

作方法。

 基本掌握了程序的在线仿真操作方法。

 基本掌握了硬件按键与流水灯之间线路的连接。

 在程序的编写与调试过程中,学会了要用细心和谨慎的态度来完场实验的各

个环节。

因篇幅问题不能全部显示,请点此查看更多更全内容