单片机实验报告
姓名: 学号:
一、 实验实现功能:
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;
}
}
}