单片机跑马灯(流水灯)控制实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; } } }