📄 main.c
字号:
/********************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
欢迎访问我的USB专区:http://group.ednchina.com/93/
欢迎访问我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
欢迎大家访问wang1jin的博客:
http://www.ednchina.com/blog/wang1jin/
main.c file
作者:Computer-lov
建立日期:2007-11-20
修改日期:2007-11-20
版本:V1.0
版权所有,盗版必究。
Copyright(C) Computer-lov 2007-2017
All rights reserved
********************************************************************/
#include "config.h"
#include "at89x52.h"
#include "Key.h"
#include "UART.h"
#include "MyType.h"
#include "led.h"
#include "lcd1602.h"
#include "adc.h"
#include "ds18b20.h"
#include "ds1302.h"
#include "time.h"
#include "main.h"
uint8 DispStatus;
uint8 DispBuffer[32];
code uint8 HeadTable[][72]={
"********************************************************************\r\n",
"****** EDN 51学习板测试程序 ******\r\n",
"****** 建立日期:",__DATE__," ******\r\n",
"****** 建立时间:",__TIME__," ******\r\n",
"****** 作者:电脑圈圈 ******\r\n",
"****** USB专区:http://group.ednchina.com/93/ ******\r\n",
"****** BLOG1:http://www.ednchina.com/blog/computer00 ******\r\n",
"****** BLOG2:http://computer00.21ic.org ******\r\n",
"********************************************************************\r\n",
};
/********************************************************************
函数功能:显示ADC结果函数。
入口参数:无。
返 回:无。
备 注:结果通过串口发送。如果使用了LCD,结果同时会显示在LCD上。
********************************************************************/
void DispAdc(void)
{
uint32 Vadc;
Prints("ADC0: ");
Vadc=ReadAdc(0); //读ADC通道0
Vadc=Vadc*100*5; //换算为电压值
Vadc/=256;
DispBuffer[5]=0;
DispBuffer[4]='V'; //转换为显示的字符串
DispBuffer[3]='0'+Vadc%10;
Vadc/=10;
DispBuffer[2]='0'+Vadc%10;
Vadc/=10;
DispBuffer[1]='.';
DispBuffer[0]='0'+Vadc%10;
Prints(DispBuffer);
#ifdef LCD
if(DispStatus==DISP_ADC)
{
LcdCls();
LcdPrints("ADC0: ");
LcdPrints(DispBuffer);
}
#endif
Prints(" ADC1: ");
Vadc=ReadAdc(1);
Vadc=Vadc*100*5;
Vadc/=256;
DispBuffer[5]=0;
DispBuffer[4]='V';
DispBuffer[3]='0'+Vadc%10;
Vadc/=10;
DispBuffer[2]='0'+Vadc%10;
Vadc/=10;
DispBuffer[1]='.';
DispBuffer[0]='0'+Vadc%10;
Prints(DispBuffer);
Prints("\r\n");
#ifdef LCD
if(DispStatus==DISP_ADC)
{
LcdSetPosition(0x40);
LcdPrints("ADC1: ");
LcdPrints(DispBuffer);
}
#endif
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:显示温度函数。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void DispTemperature(void)
{
uint32 T;
uint8 i;
Prints("Temperature: ");
DS18B20ReadScratchpad(); //读温度
DS18B20ConvertT(); //启动转换。转换需要750ms才能完成
i=0;
if(Temperature<0) //符号判断
{
DispBuffer[i++]='-';
T=Temperature*-1;
}
else
{
DispBuffer[i++]=' ';
T=Temperature;
}
T*=625; //转换为温度
DispBuffer[i++]='0'+(T%10000000)/1000000; //转换为显示的字符串
DispBuffer[i++]='0'+(T%1000000)/100000;
DispBuffer[i++]='0'+(T%100000)/10000;
DispBuffer[i++]='.';
DispBuffer[i++]='0'+(T%10000)/1000;
DispBuffer[i++]='0'+(T%1000)/100;
DispBuffer[i++]='0'+(T%100)/10;
DispBuffer[i++]='0'+(T%10);
DispBuffer[i++]=' ';
DispBuffer[i++]=0xdf;
DispBuffer[i++]='C';
DispBuffer[i]=0;
for(i=1;i<3;i++) //去掉前面多余的0
{
if(DispBuffer[i]!='0')
{
break;
}
}
DispBuffer[i-1]=DispBuffer[0];
Prints(&(DispBuffer[i-1]));
Prints("\r\n");
#ifdef LCD //如果有LCD,则同时显示到LCD上
if(DispStatus==DISP_TEMP)
{
LcdCls();
LcdPrints("Temperature: ");
LcdSetPosition(0x40);
LcdPrints(&(DispBuffer[i-1]));
}
#endif
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:显示按键按下函数。
入口参数:按下的键码。
返 回:无。
备 注:无。
********************************************************************/
void DispKeyDown(uint8 k)
{
Prints("KEY");
UartPutChar(k+'0');
Prints(" down.\r\n");
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:显示按键弹起函数。
入口参数:弹起的键码。
返 回:无。
备 注:无。
********************************************************************/
void DispKeyUp(uint8 k)
{
Prints("KEY");
UartPutChar(k+'0');
Prints(" up.\r\n");
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:主函数。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void main(void)
{
uint8 i;
uint8 NeedRefresh;
uint16 BeepAlarmCount;
uint16 OldSystemTick;
DispStatus=DISP_TIME;
UartInit(); //初始化串口
InitKeyboard(); //初始化键盘
#ifdef LCD
LcdInit(); //LCD初始化
LcdPrints("Waiting.........");
#endif
DS1302Init();
for(i=0;i<13;i++) //显示信息
{
Prints(HeadTable[i]);
}
DS18B20Init();
// ReadAlarmClock();
#ifdef LCD
LcdCls();
#endif
Prints("\r\nYour DS18B20's ROM is: ");
for(i=0;i<8;i++)
{
PrintHex(DS18B20Rom[i]);
}
Prints("\r\n");
Prints("\r\nSystem time is set to: \r\n");
DispTime();
while(1)
{
if(SystemTick>9999)SystemTick=0;
#ifndef LCD //如果没有使用LCD,则使用数码管显示系统时钟节拍
LedBuffer[3]=(SystemTick/2)%10;
LedBuffer[2]=((SystemTick/2)%100)/10;
LedBuffer[1]=((SystemTick/2)%1000)/100;
LedBuffer[0]=((SystemTick/2)%10000)/1000;
#endif
if(SystemTick%200==0)NeedRefresh=1;
if(NeedRefresh) //每秒刷新一次
{
NeedRefresh=0;
Prints("\r\n");
DispAdc();
DispTemperature();
DispTime();
if(Temperature>(16*(10*(int16)(AlarmTemperature>>4)+(AlarmTemperature&0x0F)))) //检查温度是否超过
{
BeepAlarmCount=30;
i=20;
}
/* if(AlarmTime[3]==1) //检查闹钟时间是否到
{
if(AlarmTime[2]==Time[2])
{
if(AlarmTime[1]==Time[1])
{
if(AlarmTime[0]==Time[0])
{
BeepAlarmCount=344;
i=20;
}
}
}
}*/
}
if(OldSystemTick!=SystemTick) //每5ms进入1次
{
OldSystemTick=SystemTick;
if(BeepAlarmCount)
{
i--;
switch(BeepAlarmCount%8) //BB响处理
{
case 0: //短响
case 6:
case 4:
BeepOn();
if(i==0)
{
BeepAlarmCount--;
i=20;
}
break;
case 7: //短停
case 5:
case 1:
BeepOff();
if(i==0)
{
BeepAlarmCount--;
i=20;
}
break;
case 2: //长响
BeepOn();
if(i==0)
{
BeepAlarmCount--;
i=80;
}
break;
case 3: //长停
BeepOff();
if(i==0)
{
BeepAlarmCount--;
i=80;
}
break;
}
}
}
if(KeyDown) //有键按下
{ //处理按下的键
NeedRefresh=1;
BeepAlarmCount=0;
if(KeyDown&KEY1)
{
DispKeyDown(1);
KeyDown&=~KEY1;
OnLed1();
DispStatus=DISP_ADC; //显示ADC
}
if(KeyDown&KEY2)
{
DispKeyDown(2);
KeyDown&=~KEY2;
OnLed2();
DispStatus=DISP_TIME; //显示时间
}
if(KeyDown&KEY3)
{
DispKeyDown(3);
KeyDown&=~KEY3;
OnLed3();
DispStatus=DISP_TEMP; //显示温度
}
if(KeyDown&KEY4)
{
DispKeyDown(4);
KeyDown&=~KEY4;
OnLed4();
DispStatus=DISP_SET_TIME; //设置时间
DispSetTime();
}
if(KeyDown&KEY5)
{
DispKeyDown(5);
KeyDown&=~KEY5;
OnLed5();
}
if(KeyDown&KEY6)
{
DispKeyDown(6);
KeyDown&=~KEY6;
OnLed6();
}
if(KeyDown&KEY7)
{
DispKeyDown(7);
KeyDown&=~KEY7;
OnLed7();
}
if(KeyDown&KEY8)
{
DispKeyDown(8);
KeyDown&=~KEY8;
OnLed8();
DispStatus=DISP_SET_ALARM_TIME;
SetAlarmClock();
}
}
if(KeyUp) //有键释放
{ //处理释放的键
if(KeyUp&KEY1)
{
DispKeyUp(1);
KeyUp&=~KEY1;
OffLed1();
}
if(KeyUp&KEY2)
{
DispKeyUp(2);
KeyUp&=~KEY2;
OffLed2();
}
if(KeyUp&KEY3)
{
DispKeyUp(3);
KeyUp&=~KEY3;
OffLed3();
}
if(KeyUp&KEY4)
{
DispKeyUp(4);
KeyUp&=~KEY4;
OffLed4();
}
if(KeyUp&KEY5)
{
DispKeyUp(5);
KeyUp&=~KEY5;
OffLed5();
}
if(KeyUp&KEY6)
{
DispKeyUp(6);
KeyUp&=~KEY6;
OffLed6();
}
if(KeyUp&KEY7)
{
DispKeyUp(7);
KeyUp&=~KEY7;
OffLed7();
}
if(KeyUp&KEY8)
{
DispKeyUp(8);
KeyUp&=~KEY8;
OffLed8();
}
}
}
}
////////////////////////End of function//////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -