⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 51edn开发板程序
💻 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 + -