仿真图:
芯片/模块的特点:
AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。
AT89C52的主要特点如下:
内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。
RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。
外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。
通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。
定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。0
串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。
低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。
宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。
主程序:
#define __MAIN_C
#include <reg52.h>
#include "main.h"
bit dispFlag = 1;
bit startFlag = 0;
unsigned char dis[16];
unsigned char xdata dis1[16];
char time10ms = 0;
char timeSecond = 0;
char timeMinute;
char setTimeMinute = 10;
unsigned char round = 1;
unsigned char scoreA = 0;
unsigned char scoreB = 0;
bit team = 0;
void main()
{
KEY_PORT = 0xFF;
//初始化
LCD_Init();
Timer0_Init();
Timer1_Init();
DelayMs(20);
//开机显示
LCD_DispStr(0, 0, " Welcome! ");
DelayS(2);
LCD_Clear();
timeMinute = setTimeMinute;
while(1)
{
if (dispFlag)
{
dispFlag = 0;
sprintf(dis, "R:%1d T:%02d:%02d:%02d", (int)round, (int)timeMinute, (int)timeSecond, (int)time10ms);
LCD_DispStr(0, 0, dis);
DelayMs(10);
if (team == 0)
{
sprintf(dis1, ">A %03d--%03d B ", (int)scoreA, (int)scoreB);
LCD_DispStr(0, 1, dis1);
}
else
{
sprintf(dis1, " A %03d--%03d >B ", (int)scoreA, (int)scoreB);
LCD_DispStr(0, 1, dis1);
}
}
KeyDriver();
}
}
void Timer0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = RH_10MS(10); //10ms
TL0 = RL_10MS(10);
TR0 = 1; //启动T0计时
ET0 = 1; //打开T0中断
EA = 1; //打开总中断
}
void Timer1_Init(void)
{
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = RH_10MS(1); //10ms
TL1 = RL_10MS(1);
TR1 = 0; //启动T1计时
ET1 = 1; //打开T1中断
EA = 1; //打开总中断
}
void Timer0_Intterupt() interrupt 1
{
static unsigned int cnt = 0;
TH0 = RH_10MS(1); //10ms
TL0 = RL_10MS(1);
dispFlag = 1;
KeyScan();
cnt++;
if (cnt >= 50) //500ms
{
LED_YELLOW = ~LED_YELLOW;
cnt = 0;
}
}
void Timer1_Intterupt() interrupt 3
{
TH1 = RH_10MS(1); //10ms
TL1 = RL_10MS(1);
KeyScan();
time10ms--;
if (time10ms < 0) //1s
{
time10ms = 99;
timeSecond--;
if (timeSecond < 0)
{
timeSecond = 59;
timeMinute--;
if (timeMinute < 0)
{
timeMinute = setTimeMinute;
timeSecond = 0;
time10ms = 0;
round++;
BUZZER = 0;
TR1 = 0;
if (round > 4)
{
round = 1;
}
}
}
}
}
设计文件: