功能:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶分三种显示模式
a)显示实时速度和本次里程
b)显示当前时间
c)显示报警速度和总里程
2.超过报警速度将声光报警
3.功能按键介绍
a显示状态下:
'上’键——电机速度+1 '下’键——电机速度-1
'设置’键——电机启动/暂停
'切换’键——切换显示状态
b显示状态下:
'设置’键——进入时间设置
'切换’键——切换显示状态
*时间设置状态
'上’键——加1 '下’键——减1
'左’键/'右’键——更改设置坐标
'切换’键——确定
c显示状态下:
'设置’键——进入速度设置
'切换’键——切换显示状态
*报警速度设置状态
'上’键——加1 '下’键——减1
'左’键/'右’键——更改设置选项
'切换’键——确定
*总里程设置状态
'上’键/'下’键——清零
'左’键/'右’键——更改设置选项
'切换’键——确定
4.采用DC002作为电源接口可直接输入5V给整个系统供电
原理图:
PCB :
主程序:
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "main.h"
unsigned long time_20ms; //定时计数
char dis0[9]; //液晶数组显示暂存
char dis1[3];
unsigned int setNum = 37; //设置值
//---------------------------------------
//Name: CALTEMP
//Temperature data is T=(Data)*0.02-273.15
//---------------------------------------
bit disFlag = 0; //更新显示标志
unsigned int Tem; //温度
float objTemp, envTemp; //物体温度和环境温度
void main(void)
{
Timer0_Init(); //定时器0初始化
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear();
while (1) //主循环
{
if (KEY_ADD == 0) //有按键按下
{
DelayMs(150);
if (KEY_ADD == 0) //按键1按下
{
if (setNum < 200)
setNum++; //++
}
}
if (KEY_SUB == 0)
{
DelayMs(150);
if (KEY_SUB == 0) //按键2按下
{
if (setNum > 0)
setNum--; //--
}
}
if (disFlag == 1) //显示标志
{
Tem = ReadObjectTemp(); //读取实物温度
objTemp = (float)(Tem)*0.02 - 273.15;
Tem = ReadEnvironTemp(); //读取环境温度
envTemp = (float)(Tem)*0.02 - 273.15;
sprintf(dis0, "Env:%5.1f", envTemp); //打印环境温度
LCD_DispStr(0, 0, dis0); //显示
LCD_WriteData(0xDF);
LCD_WriteData('C');
LCD_DispStr(13, 0, "Set");
sprintf(dis0, "Obj:%5.1f", objTemp); //打印目标温度
LCD_DispStr(0, 1, dis0); //显示
LCD_WriteData(0xDF);
LCD_WriteData('C');
sprintf(dis1, "%3d", setNum); //打印温度设置值
LCD_DispStr(13, 1, dis1); //显示
if (objTemp > setNum)
{
BUZZER = 0;
} //温度高蜂鸣器鸣叫
else
{
BUZZER = 1;
} //温度低 停止
disFlag = 0;
}
}
}
void Timer0_Init()
{
TMOD &= 0xF0;
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = RH_10MS(2); //重新赋值 20ms
TL0 = RL_10MS(2);
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器开关打开
}
void Timer0_Interrupt() interrupt 1
{
TH0 = RH_10MS(2); //重新赋值 20ms
TL0 = RL_10MS(2);
time_20ms++;
if (time_20ms >= 20) //定时更新显示
{
disFlag = 1;
time_20ms = 0;
}
}