文档详情

实现定时亮灯.doc

发布:2017-04-20约2.82千字共6页下载文档
文本预览下载声明
计算机科学与技术系 实 验 报 告 专业名称 计算机科学与技术专业 课程名称 单片机应用设计 项目名称 实现定时亮灯 班 级 学 号 姓 名 同组人员 无 实验日期 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
显示全部
相似文档