admin 管理员组

文章数量: 1184232


2024年4月27日发(作者:异步fifo是什么意思)

单片机实验报告

姓名: 学号:

一、 实验实现功能:

1:计数器功能

2:流水灯

二、

具体操作:

1、计数器功能

数码管的动态显示。每按一次K2键计数器加1通过数码管显示出来,计数

器可以实现从0计数到9999。

2、流水灯

当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流

点亮每次只点亮一个,间隔时间为50ms。

三、 程序流程图

设置初值,启动定时器,

打开中断

开始

定时器T0

中断关闭

复位

Key1按下

跑马灯点亮

间隔50ms

流水灯模式

计数器模式

中断打开

Key2按下

Key3按下

计数器加1

数码管显示

数字加1

1

四、 程序

#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]; //千位

2

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

}

3

/***********************流水灯子函数****************************/

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;

}

4


本文标签: 数码管 模式 中断 函数