实现定时亮灯.doc
文本预览下载声明
计算机科学与技术系
实 验 报 告
专业名称 计算机科学与技术专业
课程名称 单片机应用设计
项目名称 实现定时亮灯
班 级
学 号
姓 名
同组人员 无
实验日期 2016年5月13日
一、实验目的与要求
1、熟悉Keil C51集成环境软件的使用方法;
2、熟悉MCS51汇编指令,能自己编写简单的程序,控制硬件;
3、熟悉畅学开发平台,掌握单片机最小系统及IO口的简单控制及不同组IO口的特点。
二、实验内容
2.1 实验完成内容
设计定时关灯实验,从键盘输入时间,按一下1键灯亮,时间每秒减一,减到0为止,灯熄灭,可以再次输入时间,启动定时过程。
2.2 芯片选型
Keil 51
2.3 电路原理图
2.4 关键资源说明(所应用单片机内部资源及外围接口芯片的核心说明)
MCS-51单片机内部资源主要有并行I/O口、中断系统、定时器/计数器、以及串行接口。
2.5 程序流程图
开始
检测按键是否按下
如果按下按键检测按键值,启动定时
同时点亮LED灯,时间逐一相减
时间到0时,停止定时,同时灯灭
可再次按下按键,重新定时
实验程序
#include REG51.H
#define U8 unsigned char
#define key_port P1
bit run = 0;
sbit Lamp = P3^7;
code U8 kcode[]={0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7};
//反转码对应键值 0 1 2 3 4 5 6 7 8 9 A B
code U8 disp[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff};
U8 buf[4]={0,0,0,0};
U8 cnt=0;
U8 scn[]={0x7f,0xbf,0xdf,0xef};// 先点亮左边一个数码管
void delay_ms(U8 ms)
{ U8 i,j;
for(i=0;i100;i++)
{ for(j=0;jms;j++);};
}
U8 key(void)
{ U8 a,r=0xff;
delay_ms(20); // 延时20毫秒,消除按键抖动
if(key_port == 0xf0) goto rn;
a = key_port;
key_port = a | 0x0f;
delay_ms(20);
a = key_port;
for (r = 0;r = 11;r++)
{ if(a == kcode[r]) break;};
if(r 11) r = 0xff; //0xff表示无效
rn: key_port = 0xf0;
return r;
}
void main(void)
{ U8 k,i;
TMOD = 0x01; // 设定时器0为模式1(16位)
TH0 = 0xee; // 晶振11.0592MHz,5mS
TL0 = 0;
TR0 = 1; // 开始计数
EA = 1; // 允许中断
ET0 = 1; // 定时器0中断允许
key_port = 0xf0;
Lamp = 1; // 清除加号标志
delay_ms(20);
while(1) // 循环
{ if (key_port != 0xf0)
{ k = key();
if (k 10)
{ if(run == 0)
{ for(i=1;i=3;i++) buf[i-1]=buf[i];// 数字左移一位
buf[3] = k;// 在个位显示刚按的数字
}
}
else
{ if(k == 10){ run = 1; Lamp = 0;}
}
while(key_port != 0xf0);// 等待按键抬起
delay_ms(20);
while(key_port != 0xf0);
}
}
}
void timeint(void) interr
显示全部