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

📄 funcs.c

📁 1.将uC/OS-II操作系统移植到Mega16上 2.建立两个任务
💻 C
字号:

#ifndef  OS_MASTER_FILE
#include "includes.h"
#include "AVR_PQ1A.h"
#endif

#pragma data:code 
const SEGMENT[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
		   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#pragma data:data 	 
/*******************************************
函数名称: DS1302_init
功    能: 初始化DS1302的数据接口
参    数: 无
返回值  : 无
/********************************************/
void DS1302_portinit(void)		  
{
 DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
}
/*******************************************
函数名称: DS1302_writeB
功    能: 向DS1302写入一个字节数据(没有RST操作)
参    数: byte--要写入的数据
返回值  : 无
/********************************************/
void DS1302_writeB(uchar byte)
{
 uchar i;
 for(i=0;i<8;i++)		 	  //8位数据计数
 {
  PORTB&=~BIT(RTC_CLK);		  //拉低时钟端
  if(byte&0x01)				  //当前位是否是1
  {
   PORTB|=BIT(RTC_DATA);	  //当前位是1,拉高数据端
  }
  else						  
  {
   PORTB&=~BIT(RTC_DATA);	  //当前位是0,拉低数据端
  }  
  Delayus(10);				  //调整时钟和脉冲宽度
  PORTB|=BIT(RTC_CLK);		  //时钟上升沿(DS1302采样数据)
  byte>>=1;					  //数据右移1位,为送出新数据位做准备
 }
}
/*******************************************
函数名称: DS1302_readB
功    能: 从DS1302读出一个字节数据(没有RST操作)
参    数: 无
返回值  : byte--读出的数据
/********************************************/
uchar DS1302_readB(void)
{
 uchar i,byte=0;
 DDRB&=~BIT(RTC_DATA);		 //将数据端口设置为输入		  
 PORTB&=~BIT(RTC_DATA);		 //无上拉电阻
 for(i=0;i<8;i++)			 //8位数据计数
 {
  byte>>=1;  				 //保存读入的数据位
  PORTB|=BIT(RTC_CLK);		 //时钟上升沿
  Delayus(10);				 //延时,调整时钟脉冲宽度
  PORTB&=~BIT(RTC_CLK);		 //时钟下降沿,DS1302输出数据位
  Delayus(10);				 //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
  if(PINB&BIT(RTC_DATA))	 //当前位是否是高电平
  {
   byte|=BIT(PB7);			 //是高电平就将返回数据的当前位置1
  }
  else
  {
   byte&=~BIT(PB7);			 //是低电平就将返回数据的当前位置0
  }
 }
 DDRB|=BIT(RTC_DATA);		 //最后将数据端口设置为输出
 return byte;				 //返回读出的数据
}
/*******************************************
函数名称: DS1302_writeD
功    能: 向DS1302的某个地址写入一个字节数据
参    数: addr--地址值(寄存器或RAM)
	  	  data--要写入的地址
返回值  : 无
/********************************************/
void DS1302_writeD(uchar addr,uchar data)
{
 PORTC&=~BIT(RTC_CS);	 //拉低片选端
 PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
 Delayus(10);
 PORTC|=BIT(RTC_CS);	 //拉高片选端
 Delayus(10); 			 //调整片选脉冲
 DS1302_writeB(addr);	 //写入操作命令(地址)
 Delayus(10);
 PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
 Delayus(10);
 DS1302_writeB(data);	 //写入数据
 PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
 Delayus(10);			 //调整片选脉冲
 PORTC&=~BIT(RTC_CS);	 //拉低片选端
}
/*******************************************
函数名称: DS1302_readD
功    能: 从DS1302的某个地址读出一个字节数据
参    数: addr--地址值(寄存器或RAM)
返回值  : data--读出的数据
/********************************************/
uchar DS1302_readD(uchar addr)
{
 uchar data;
 PORTC&=~BIT(RTC_CS);	 //拉低片选端
 PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
 Delayus(10);
 PORTC|=BIT(RTC_CS);	 //拉高片选端
 Delayus(10); 			 //调整片选脉冲
 DS1302_writeB(addr);	 //写入操作命令(地址)
 Delayus(10);
 data=DS1302_readB();	 //读出数据
 Delayus(10);
 PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
 PORTC&=~BIT(RTC_CS); 	 //拉低片选端
 return data;			 //返回读出的数据
}
/*******************************************
函数名称: DS1302_getT
功    能: 读取DS1302的当前时间的时、分、秒
参    数: time[]--读取的时间数组
返回值  : 无
/********************************************/
void DS1302_getT(INT8U time[])
{
    uchar i;
    uchar addr = 0x80; 			 	  		  //读取地址从秒寄存器开始 
    for(i=0;i<3;i++)
    {
        time[i*2]=DS1302_readD(addr|RD);    // 秒 分 时 日 月 星期 年        
        addr+=2;
    }
    PORTB&=~BIT(RTC_CLK);	 				  //拉低时钟端(时钟端在不操作时为低)
}

/*******************************************
函数名称: One_smg_display
功    能: 指定的数码管显示指定的内容
参    数: data--显示的内容(0-15)
	  	  number--指定的数码管(1-6)
返回值  : 无
/********************************************/
void One_smg_display(uchar data,uchar number)
{ 
 PORTB|=0x3F;			   //输出位选
 PORTA|=BIT(BITLK);		   //更新位选
 //Delayus(50);			   //调整时序
 PORTA&=~BIT(BITLK);	   //锁存位选

 PORTB=SEGMENT[data];	   //输出段选
 PORTA|=BIT(SEGLK);		   //更新段选
 //Delayus(50);			   //调整时序
 PORTA&=~BIT(SEGLK);	   //锁存段选
 
 number=~BIT(number-1);	   //调整位选(指定时是1~6,而操作的时候是0~5)
 PORTB=number;			   //输出位选
 PORTA|=BIT(BITLK);		   //更新位选
 //Delayus(50);				   //调整时序
 PORTA&=~BIT(BITLK);	   //锁存位选
}
/*******************************************
函数名称: All_smg_display
功    能: 6个数码管显示指定的内容
参    数: *pdata--显示内容数组地址
返回值  : 无
/********************************************/
void All_smg_display(uchar *pdata)
{
 uchar i;
 for(i=0;i<6;i++)
 	{
	 One_smg_display(pdata[5-i],i+1);
	 Delayms(3);
	}
}

/*******************************************
函数名称: One_led
功    能: 点亮或者熄灭指定的LED
参    数: number--指定的LED
	  	  light--为TRUE的时候为点亮LED,为FALSE的时候为熄灭LED
返回值  : 无
/********************************************/
void One_led(uchar number,uchar light)
{
 uchar i;
 if(light==TRUE)		   //点亮操作
 {
  PORTB&=~BIT(number);	   //输出数据
  PORTA|=BIT(LEDLK);	   //更新数据
  //Delayms(5);			   //调整时序
  PORTA&=~BIT(LEDLK);	   //锁存数据
 }
 else
 {
  PORTB|=BIT(number);	   //输出数据
  PORTA|=BIT(LEDLK);	   //更新数据
  //Delayms(5);			   //调整时序
  PORTA&=~BIT(LEDLK);	   //锁存数据
 }
}
/*******************************************
函数名称: All_led
功    能: 点亮或者熄灭全部LED
参    数: light--为TRUE的时候为点亮全部LED,为FALSE的时候为熄灭全部LED
返回值  : 无
/********************************************/
void All_led(uchar light)
{
 if(light)
 {
  PORTB&=~ALLLED;
  PORTA|=BIT(LEDLK);
  //Delayms(5);
  PORTA&=~BIT(LEDLK);
 }
 else
 {
  PORTB|=ALLLED;
  PORTA|=BIT(LEDLK);
  //Delayms(5);
  PORTA&=~BIT(LEDLK);
 }
}

⌨️ 快捷键说明

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