单片机跑马灯(流水灯)控制实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机实验报告

姓名:学号:

一、实验实现功能:

1:计数器功能

2:流水灯

二、具体操作:

1、计数器功能

数码管的动态显示。每按一次K2键计数器加1通过数码管显示出来,计数器可以实现从0计数到9999。

2、流水灯

当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流点亮每次只点亮一个,间隔时间为50ms。

三、程序流程图

四、程序

#include

typedef unsigned char uint8;

typedef unsigned int uint16; //类型定义

sbit P2_1 = P2^1;

sbit P2_2 = P2^2;

sbit P2_3 = P2^3;

sbit P2_4 = P2^4; //位声明四个数码管开关

sbit Key2 = P3^2;

sbit Key3 = P3^3; //位声明2个按键K2和K3

sbit Ledk = P2^0 ; //LED 开关

void delay(uint16 i); //延时函数声明

void refresh (); // 数码管刷新函数声明

void liushuideng(); //流水灯函数声明

uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//数码管的真值表

uint8 out[4] = {0}; // 数组变量

uint16 counter=0; //用作计数器的变量

uint16 Time_counter=0; //用作定时器的变量

void main() //主函数

{

TMOD = 0x01; //定时器0,工作方式一

TH0 = 0xFC;

TL0 = 0x18; //定时器初值使每次循环为1ms

TR0 = 0; //定时器0开始作

ET0 = 0; // 定时器中断关

EA = 0; // 关中断

while(1) //计数器模式

{

Ledk =1 ; //led开关关

out[0]=number[counter%10]; //取个位

out[1]=number[counter%100/10]; //十位

out[2]=number[counter%1000/100]; //百位

out[3]=number[counter/1000]; //千位

if (!Key2) //计数器加1

{

++counter; //自加

out[0]=number[counter%10]; //取个位

out[1]=number[counter%100/10]; //十位

out[2]=number[counter%1000/100]; //百位

out[3]=number[counter/1000]; //千位

while(!Key2) //等待键盘抬起

refresh(); //刷新数码管

}

refresh(); //刷新数码管

if (!Key3) // 进入跑马灯模式

liushuideng();

}

} //主函数结束

/*******************延时*************/

void delay(uint16 i)

{

uint8 j; // 定义局部变量

for(i;i>0;i--) //循环i*240 次

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

}

/************数码管刷新******************/

void refresh ()

{

uint8 j;

for (j=0;j<4;j++) //四次循环刷新数码管

{

switch(j)

{

case 0: P2_1=1;P2_2=1;P2_3=1;P2_4=0;break;

case 1: P2_1=1;P2_2=1;P2_3=0;P2_4=1;break;

case 2: P2_1=1;P2_2=0;P2_3=1;P2_4=1;break;

case 3: P2_1=0;P2_2=1;P2_3=1;P2_4=1;break;

//每次循环只选中一个数码管

default:break;

}

P0 = out[j]; // 位选,给数码管送值

delay (20); //延时消抖

}

}

/*************定时器的中断服务函数**************/

void Timer0_Overflow() interrupt 1 //定时器0溢出中断,这个语句1ms执行一次{

TH0 = 0xFC;

TL0 = 0x18; //每1ms重新赋定时器初值

Time_counter++; //计数,看经过了几个1ms

}

/***********************流水灯子函数****************************/ void liushuideng()

{

uint8 j = 0 ; //定义局部变量

P0 = 0xff; // 小灯全关

TR0 = 1; //定时器1开始计时

EA = 1; //中断开放

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

while(1)

{

Ledk = 0 ; //打开LED开关

P2 = P2|0x1E; //关掉数码管

if(50 == Time_counter) //50个毫秒

{

P0=~(1<

Time_counter = 0; //清零开始下一次循环定时

}

if (8==j) //移完8次再重新移

{

j=0;

}

}

}

相关文档
最新文档