资源简介
内容描述:当按下INT按钮时,数码管开始快速计时,高五位为秒数,低三位为ms数,每1ms刷新一次显示内容。当再次按下INT按钮时,停止计数。并要求当开始计时时,每过一秒要有一次蜂鸣,蜂鸣时间为200ms。开发环境为keil
代码片段和文件信息
//实验5
#include “myclock.h“
//分别记录LED上的数字
unsigned char a[8]={0};
//当前显示的LED中内容在数组a中的偏移
unsigned char offset = 0;
//用于关闭高位0的显示
unsigned char flag = 3;
//表示计时器是否开始计时,0表示未开始,非0表示开始
unsigned char begin = 0;
//表示蜂鸣器是否工作,0表示不工作,非0表示工作
unsigned char sounding = 0;
//定时器1的计数器
unsigned char t1count = 0;
void main()
{
//设置定时器工作方式
TMOD = 0x11;
//设置外部中断1为跳沿触发
IT1 = 1;
//允许定时器中断和外部中断1
enable_int();
//启动定时器T0
runT0();
//等待中断
while(1);
}
//实现1ms刷新显示
void refresh() interrupt 1
{
//重置定时器T0
runT0();
//如果开始工作,则显示数字加1
if(begin)
{
inc_a();
//每过1秒,蜂鸣器响
if(sounding)
{
SOUND_OUT = 0;
t1count = 0;
runT1();
sounding = !sounding;
}
}
//显示数据
display();
++offset;
if(offset == 8)
offset = 0;
}
//INT按钮被按下时的中断处理函数
void press() interrupt 2
{
//切换机器工作状态
begin = !begin;
}
//实现持续200ms的蜂鸣
void sound() interrupt 3
{
//T1第4次溢出,关闭蜂鸣器
if(t1count == 3)
{
//蜂鸣器停止工作
SOUND_OUT = 1;
//T1停止工作
TR1 = 0;
}
else//否则T1溢出次数加1,重新启动T1
{
runT1();
++t1count;
}
}
//将数组中的一位显示在数码管上
void display()
{
unsigned char num = a[offset];
num = get_num(num);
//高位多余的0不显示
if(offset>flag)
num = 0;
//显示小数点
else if(offset == 3)
num |= NUM_DP;
//输出数据
dat_in(num);
//选择数码管
NUMLEDxOPEN(offset);
return;
}
//将十进制数转换成相对应的数码管输入
unsigned char get_num(unsigned char num)
{
switch(num)
{
case 0:return NUM_0;
case 1:return NUM_1;
case 2:return NUM_2;
case 3:return NUM_3;
case 4:return NUM_4;
case 5:return NUM_5;
case 6:return NUM_6;
case 7:return NUM_7;
case 8:return NUM_8;
case 9:return NUM_9;
default:return 0;
}
return 0;
}
//输出数据
void dat_in(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;++i)
{
SCK = 0;
if( (dat & 0x80) != 0)
SER = 1;
else
SER = 0;
dat <<= 1;
SCK = 1;
}
RCK = 1;
RCK = 0;
}
//计时数组数据加1
void inc_a()
{
unsigned char i;
++a[0];
for(i=1;i<8;++i)
{
if(a[i-1] == 10)
{
a[i-1] = 0;
++a[i];
//用于关闭高位多余0的显示
if(i>flag)
flag = i;
//每过1s打开蜂鸣器
if(i == 3)
sounding = !sounding;
}
}
if(flag<3)
flag = 3;
}
//选择打开的数码管
void NUMLEDxOPEN(unsigned char i)
{
switch(i)
{
case 0:NUMLED8OPEN();break;
case 1:NUMLED7OPEN();break;
case 2:NUMLED6OPEN();break;
case 3:NUMLED5OPEN();break;
case 4:NUMLED4OPEN();break;
case 5:NUMLED3OPEN();break;
case 6:NUMLED2OPEN();break;
case 7:NUMLED1OPEN();break;
}
}
//允许定时器中断和外部中断1,并设置中断优先级
void enable_int()
{
//允许定时器中断
ET0 = 1;
ET1 = 1;
//允许外部中断1
EX1 = 1;
//打开中断允许总开关
EA = 1;
//设置外部中断1的优先级高于T0T1中断
PX1 = 1;
PT0 = 0;
PT1 = 0;
}
//启动定时器T0定时时间为1ms
void runT0()
{
TL0 = 0x66;
TH0 = 0xFC;
TR0 = 1;
}
//启动定时器T1,定时时间为50ms
void runT1()
{
TL1 = 0xFE;
TH1 = 0x4B;
TR1 = 1;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2170 2010-04-24 15:40 51单片机秒表定时器\实验5\clock.hex
文件 11883 2010-04-24 15:40 51单片机秒表定时器\实验5\clock.M51
文件 1410 2010-04-24 15:52 51单片机秒表定时器\实验5\clock.Opt
文件 190 2010-09-25 10:52 51单片机秒表定时器\实验5\clock.plg
文件 2001 2010-04-24 15:52 51单片机秒表定时器\实验5\clock.Uv2
文件 1412 2010-04-23 18:54 51单片机秒表定时器\实验5\clock_Opt.Bak
文件 2001 2010-04-17 13:08 51单片机秒表定时器\实验5\clock_Uv2.Bak
文件 161 2010-04-24 15:46 51单片机秒表定时器\实验5\myclock.bak
文件 3259 2010-04-24 15:47 51单片机秒表定时器\实验5\myclock.c
文件 1414 2010-04-17 15:47 51单片机秒表定时器\实验5\myclock.h
文件 855 2010-04-24 15:46 51单片机秒表定时器\实验5\myclock.LST
目录 0 2011-04-18 23:16 51单片机秒表定时器\实验5
目录 0 2011-04-18 23:16 51单片机秒表定时器
----------- --------- ---------- ----- ----
26756 13
- 上一篇:B树第三节学习插入与删除的思路与理论
- 下一篇:矩形件排样的模拟退火算法求解
相关资源
- 基于51单片机的简易电子琴设计
- 51单片机1602与DS1302万年历仿真,时钟
- 单片机类超声波测距仪的设计
- AT89C51单片机温度控制系统
- LCD显示计算器键盘按键带源程序+电路
- 基于AVR单片机的OLED现实源码
- ch438ch432多串口驱动单片机代码,硬件
- 基于单片机的照度计
- 单片机教学打铃控制器.rar
- 基于PIC单片机的风光互补路灯照明控
- ledkey.dll simboard.dll
- STC89C5xRC单片机头文件
- 单片机与GPRS模块通信需要做的工作
- 单片机控制小区门禁系统原理图
- 单片机秒表课程设计 控制暂停以及复
- 单片机的仿真记录按键按下的次数
- 温度控制系统
- 全自动电脑打铃器中北大学硬件大型
- 水温水位控制器程序C51带仿真
- USB转串口驱动源代码及单片机程序
- 5-单片机 外文文献 英文文献 外文翻译
- 51核心 自制鼠标 PS2协议 PAN3401光学芯
- 基于89C51单片机的智能超声波流量检测
- OLED12864显示屏,12位ADC,按键中断,
- 2.4G收发模块PCB、原理图、BOM、程序
- 51hex或bin反汇编.rar
- 51单片机双机通信程序(含仿真)
- 51单片机交通灯完整版
- 基于LabVIEW和单片机的数据采集系统设
- 郭天祥AVR单片机
评论
共有 条评论