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

📄 main.c

📁 PIC18系列下的DS1302时钟程序 源吗哦 测试通过可以用
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <p18f2520.h>	//头文件引用
//大LED数码管显示代码表
const unsigned char LEDCODE[]=
{
  0x3F,0x06,0x5B,0x4F,//0,1,2,3
  0x66,0x6D,0x7D,0x07,//4,5,6,7
  0x7F,0x6F,		  //8,9
};
//宏定义
#define TRUE  1
#define FALsE 0
 
//-------------------------------------------------------------
//---定义软件定时器定时1s和0.5秒结构体变量
struct TIMER_sTRUCT
{
  unsigned int Interval;
  unsigned char Enable;	
};
struct TIMER_sTRUCT second_1s,second_Halfs;
//-------------------------------------------------------------

//-------------------------------------------------------------
//---定义实时带温度与闹铃功能的日历/时钟结构体变量
struct REALCLOCK_sTRUCT
{
  unsigned char Year;		//年份
  unsigned char Month;		//月份
  unsigned char Day;		//日
  unsigned char Week;		//星期
  unsigned char Hour;		//时
  unsigned char Minute;		//分
  unsigned char second;		//秒
  unsigned char Temp;		//温度
};
struct REALCLOCK_sTRUCT RealClock;
//-------------------------------------------------------------

//-------------------------------------------------------------
//---定义定时闹钟结构体变量
struct ALARMCLOCK_sTRUCT
{  
  unsigned char Day;		//日
  unsigned char Week;		//星期
  unsigned char Hour;		//时
  unsigned char Minute;		//分
  unsigned char second;		//秒
  unsigned char status;  	//状态
};
struct ALARMCLOCK_sTRUCT AlarmClock;
//-------------------------------------------------------------

//-------------------------------------------------------------
//---定义PIC单片机与74HC595芯片接口连接关系
#define HC595_sER LATCbits.LATC0
#define HC595_RCLK LATCbits.LATC1
#define HC595_sRCLK LATCbits.LATC2
#define HC595_sRCLR LATCbits.LATC3
#define HC595_OE LATCbits.LATC4

//---定义LED数码管显示缓冲区
unsigned char LEDBuffer[16];

//---定义大LED数码管初始化函数
void InitizeLED(void)
{
  HC595_OE=1;//并行输出为高阻状态
  HC595_sRCLR=0;//清空移位寄存器
  HC595_sER=0;//清零
  HC595_RCLK=0;//移位时钟初始为低
  HC595_sRCLK=0;//存储器时钟初始为低
  HC595_OE=0;//允许并行输出
  HC595_sRCLR=1;//结束复位状态
}

//---定义大LED显示驱动函数
//*LedData指针,DataLength数据长度
void sendDataToLED(unsigned char *LedData,unsigned char DataLength)
{
  unsigned char i,j,temp;
  
  for(j=0;j<DataLength;j++)
    {
	  temp=LEDCODE[*LedData];//取出LED显示的代码表送入变量中
	  for(i=0;i<8;i++)
	    {
		  if(0x80==(temp & 0x80))HC595_sER=1;//将字节按位移出
		    else HC595_sER=0;
		  HC595_RCLK=1;//将数据送入移位寄存器中
		  HC595_RCLK=0;
		  temp<<=1;//当前指针的内容左移一位
		}
	  LedData++;//指针指向下一个数据
	}
  HC595_sRCLK=1;//将移位寄存器中的内容送到并行输出口
  HC595_sRCLK=0;
}
//-------------------------------------------------------------

//-------------------------------------------------------------
//---定义PIC单片机与Ds1302引脚之间的连接关系
#define Ds1302CE_1 LATCbits.LATC5=1
#define Ds1302CE_0 LATCbits.LATC5=0
#define Ds1302CE_O TRISC &=0xDF

#define Ds1302IO_O TRISC &=0xBF
#define Ds1302IO_I TRISC |=0x20
#define Ds1302IO_1 LATCbits.LATC6=1
#define Ds1302IO_0 LATCbits.LATC6=0
#define Ds1302IO_D PORTC & 0x40

#define Ds1302CK_1 LATCbits.LATC7=1
#define Ds1302CK_0 LATCbits.LATC7=0
#define Ds1302CK_O TRISC &=0x7F

//---Ds1302初始化函数
void Init_Ds1302_RTC(void)
{
  Ds1302CK_O;//置CK为输出
  Ds1302CE_O;//置CE为输出
  Ds1302CE_0;//输出为0
  Ds1302CK_0;//输出为0
  Ds1302IO_1;//置IO为输入
  Ds1302IO_I;
}

//---读取Ds1302日历函数
unsigned char Read_Ds1302_RTC(unsigned char RTC_Address)
{
  unsigned char i;
  unsigned int temp;
  
  Ds1302CE_0;//CE=0
  Ds1302CK_0;//CK=0
  Ds1302IO_O;//Ds1302为IO为输出
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
  Ds1302CE_1;//CE=1
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
  for(i=8;i>0;i--)//CPU送出访问Ds1302的地址
    { //以串行方式从PIC单片机的RC6引脚输出
      if(RTC_Address & 0x01)Ds1302IO_1;
        else Ds1302IO_0;
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      Ds1302CK_1;//CK=1
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      Ds1302CK_0;//CK=0
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
	  RTC_Address>>=1;//右移一位
    }
  Ds1302IO_1;//PIC单片机的RC7为输入状态
  _asm//简短延时
   NOP
   NOP
  _endasm
  Ds1302IO_I;
  _asm//简短延时
   NOP
   NOP
  _endasm
  temp=0;
  if(Ds1302IO_D)temp|=0x8000;
  temp>>=1;//右移一位
  for(i=7;i>0;i--)
    {       
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      Ds1302CK_1;//CK=1
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      Ds1302CK_0;//CK=0
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      if(Ds1302IO_D)temp|=0x8000;//RC7引脚上的电平并保存到变量中
	  temp>>=1;//右移一位
    }	
  Ds1302CE_0;//CE=0
  temp<<=1;//左移一位
  return(temp/256);//返回读取到的内容
}

//---写入Ds1302日历函数
void Write_Ds1302_RTC(unsigned char RTC_Address,unsigned char RTC_Data)
{
  unsigned char i;
  
  Ds1302CE_0;//CE为输出
  Ds1302CK_0;//CK为输出
  Ds1302IO_O;//IO为输出
  _asm//简短延时
   NOP
   NOP
  _endasm
  Ds1302CE_1;//CE=1
  _asm//简短延时
   NOP
   NOP
  _endasm
  for(i=8;i>0;i--)
    { //送地址给Ds1302     
      if(RTC_Address & 0x01)Ds1302IO_1;
      else Ds1302IO_0;
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      Ds1302CK_1;//CK=1
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      Ds1302CK_0;//CK=0
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      RTC_Address>>=1;//右移一位
    }
  for(i=8;i>0;i--)
    { //送数据给Ds1302     
      if(RTC_Data & 0x01)Ds1302IO_1;
      else Ds1302IO_0;      
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      Ds1302CK_1;//CK=1
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      Ds1302CK_0;//CK=0
	  _asm//简短延时
	   NOP
	   NOP
	  _endasm
      RTC_Data>>=1;//右移一位  
    }
  Ds1302CE_0;//CE=0
}
//-------------------------------------------------------------

//-------------------------------------------------------------
//---定义ADC缓冲区,和指针变量
unsigned char ADCBuffer[5];				//ADC采集缓冲区
unsigned char ADCBufferPointer;			//ADC采集缓冲区指针
unsigned char TemperatureDisplayFlag;	//当缓冲区满时,处理完后标志

//---ADC初始化函数定义
void ADC_Initize(void)
{
  unsigned char i;
  ADCON1=0x07;//初始化ADC的参考电压取VCC,GND
  ADCON2=0x00;//左对齐,0TAD,FOsC/2
  ADCON0=0x03;//选择通道0,启动A/D转换开始
  //初始化ADCBuffer变量指针和缓冲区
  ADCBufferPointer=0;
  for(i=0;i<sizeof(ADCBuffer);i++)ADCBuffer[i]=0;
}
//-------------------------------------------------------------

//-------------------------------------------------------------
//---初始化PIC18F单片机工作于内部时钟8MHz状态下
void INTOsC_Initize(void)
{
  OSCCON=0x70;//选择内部8MHz的主振荡器	
}
//-------------------------------------------------------------

//-------------------------------------------------------------
//---TMR0定时器初始化函数
void TMR0_Initize(void)
{
  T0CONbits.TMR0ON=FALsE;//TMR0停止运行
  T0CON=0x12;//TMR0初始化为8位定时,预分频比为1:8
  TMR0L=256-25;//定时100ms初值
  T0CONbits.TMR0ON=TRUE;
}
//-------------------------------------------------------------

//-------------------------------------------------------------
//---延时函数的定义
void Delay(unsigned int t)
{
  while(t--);	
}
//-------------------------------------------------------------

//-------------------------------------------------------------
//---按键引脚的定义
#define DATEKEY PORTBbits.RB0
#define TIMEKEY PORTBbits.RB1
#define ALARMKEY PORTBbits.RB2
#define NUMBERADDKEY PORTBbits.RB3
#define NUMBERsUBKEY PORTBbits.RB4
//---功能按键状态变量定义
unsigned char DateKeyID;
unsigned char TimeKeyID;
unsigned char AlarmKeyID;
//-------------------------------------------------------------

//-------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -