仿真图:
芯片/模块的特点:
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,可以满足大多数应用需求。
主程序:
#include <reg52.h>
#include "main.h"
float speed = 0;
unsigned int timeCnt = 0;
void main()
{
// 初始化
LCD_Init();
// 定时器初始化
#if _TIMER0_STATUS_
Timer0_Init();
#endif
// 开机显示
LCD_DispStr(0, 0, " Welcome!!! ");
DelayS(2);
LCD_Clear();
LCD_DispStr(0, 0, " Speedometer ");
LCD_DispStr(0, 1, "Speed: 0.00km/h");
while(1)
{
DispSpeed();
LED_GREEN = 0;
}
}
void DispSpeed()
{
unsigned char dispRow[16];
if (!INFRARED_START)
{
BUZZER = 0;
TH0 = RH_10MS(1); //10ms
TL0 = RL_10MS(1);
timeCnt = 0;
LCD_DispStr(0, 1, "Speed: -.--km/h");
TR0 = 1; //打开定时器
}
else
{
BUZZER = 1;
}
if (!INFRARED_STOP)
{
BUZZER = 0;
TR0 = 0; //关闭定时器
speed = 3.6*1000/((float)timeCnt*10); //设置两个探头距离为1m
if (speed > 999) //速度误操作处理
{
speed = 999;
}
sprintf(dispRow, "Speed:%6.2fkm/h", speed);
LCD_DispStr(0, 1, dispRow);
}
}
#if _TIMER0_STATUS_
void Timer0_Init()
{
TMOD &= 0xF0; //Timer0 16位装载
TMOD |= 0x01;
TH0 = RH_10MS(1); //10ms
TL0 = RL_10MS(1);
TR0 = 0; //关闭T0计时
ET0 = 1; //打开T0中断
EA = 1; //打开总中断
}
void Timer0_Intterupt() interrupt 1
{
TH0 = RH_10MS(1); //10ms
TL0 = RL_10MS(1);
if (timeCnt < 0xFFFF)
{
timeCnt++;
}
}
#endif
设计文件: