51单片机实训周-智能秒表程序
单片机实训周做的项目,选题是智能秒表,用开发板实现。
本次实验开发语言以C51语言为主,运用《单片机原理及应用》中已学习的相关知识,综合运用单片机I/O口、定时器、中断、串行口及输入(如按键)、输出(如LED小灯、数码管)设备,实现项目的基本功能。
题目要求:
智能秒表程序:
- 按键功能:通过按键控制秒表的启停、复位;
- 数码管显示:显示计时时间,注意误差修正;
- 串口通信:使用串口控制秒表的启停、复位。
设计思路
配置并启动T0,使用T0中段来进行数码管,按键、按键扫描和秒表的计时。使用第四行作为独立按键来使用,进行秒表的启停和复位,Esc键代表复位调用复位函数,回车键代表启停调用启停函数。按键驱动函数来检测按键动作,调度相应动作函数。动作函数为启停和复位。按键扫描函数,需在定时中断中调用,并且进行按键消抖,将按键动作赋值给数组使驱动函数调用动作函数。数码管动态扫描刷新函数需在定时中断中调用。秒表计数函数是每隔10ms调用一次进行秒表计数累加,能保留小数点后两位,当处于运行状态时才会递增计数值即此时的启停函数的秒表运行标志变量为1。秒表计数显示函数将小数部分转换到低2位,整数部分转换到高4位,并且高位的0显示为空字符同时显示小数点。数码管动态扫描函数,在中断时调用,将缓冲区数据送到P0口,显示消隐。使用串口控制秒表的启停、复位,需要增加串口配置函数,设置通信波特率为9600,使用T1定时计数器。UART 中断服务函数在电脑通过串口调试助手发送指令时调用动作函数。P为暂停,E为启动调用启停函数,R为复位调用复位函数。
#include <reg52.h>
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;
unsigned char sbufMessage[] = {
0x53, 0x54, 0x41, 0x52, 0x54,
0x50, 0x41, 0x55, 0x53, 0x45,
0x52, 0x45, 0x53, 0x45, 0x54
};
unsigned char sbufMessageN[] = {
0x0D, 0x0A};
unsigned char code LedChar[] = {
//数码管显示字符转换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {
//数码管显示缓冲区
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char KeySta[4] = {
//按键当前状态
1, 1, 1, 1
};
bit StopwatchRunning = 0; //秒表运行标志
bit StopwatchRefresh = 1; //秒表计数刷新标志
unsigned char DecimalPart = 0; //秒表的小数部分
unsigned