急求AVR单片机8515简单程序

急求AVR单片机8515简单程序,第1张

//ICC-AVR application builder : 2008-10-23 0:28:56

// Target : 8515

// Crystal: 8.0000Mhz

#include <io8515v.h>

#include <macros.h>

unsigned char count = 0

void port_init(void)

{

PORTA = 0x00

DDRA = 0x01

PORTB = 0x00

DDRB = 0x00

PORTC = 0x00

DDRC = 0x00

PORTD = 0x00

DDRD = 0x00

}

//TIMER1 initialize - prescale:1

// desired value: 1uSec

// actual value: 1.000uSec (0.0%)

void timer1_init(void)

{

TCCR1B = 0x00//stop

TCNT1H = 0xFF//setup

TCNT1L = 0xF8

OCR1AH = 0x00

OCR1AL = 0x08

OCR1BH = 0x00

OCR1BL = 0x08

TCCR1A = 0x00

TCCR1B = 0x01//start Timer

}

#pragma interrupt_handler timer1_ovf_isr:7

void timer1_ovf_isr(void)

{

TCNT1H = 0xFF//reload counter high value

TCNT1L = 0xF8//reload counter low value

TCCR1B = 0x01//start Timer

count++

PORTA &= ~0x01// PORTA.0 = 0

if (count == 80)

{

PORTA |= 0x01// PORTA.0 = 1

count = 0

}

}

//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI()//disable all interrupts

port_init()

timer1_init()

MCUCR = 0x00

GIMSK = 0x00

TIMSK = 0x80

SEI()//re-enable interrupts

//all peripherals are now initialized

}

//

void main(void)

{

init_devices()

//insert your functional code here...

while (1)

}

1us定时器,每80us后输出一个1us的高电平脉冲。

这是用 iccavr 环境下的c代码数旅程序,您直接用该软件编译就能得到可以烧录到单片机里的16进碰毕培制文笑唯件了。

/*******************************************************************************

文件:DS1302.C

环境:编余哪译为ICC AVR6.25A,仿真为AVR Studio4.10

硬件:ATMEGA64L芯片

日期:2008年3月7日

功能:驱动时钟芯片DS1302

备注:

*******************************************************************************/

/*=======================硬件说明迅敏===============================================

指令 指令码 功能

==============================================================================*/

//=======================头文件=================================================

#include <iom64v.h>

#include <macros.h>

#include <signal.h>

#include <stdio.h>

#include <math.h>

#include <string.h>

#include "main.h"

#include "Variable.h"

#include "DS1302.h"

//==============================================================================

/****************************************************************

* 名称 : void Reset_3wire(void)

* 功能描述: reset and enable the 3-wire interfaT_CE

* 输入参量: 无

* 输出参量: 无

* 调用子程: 无

* 使用方法: 对3-wire *** 作的话,首先要使能

-------------------------------------------------*/

void Reset_3wire(void)

{

DS1302_RST_OUT// 输出

DS1302_CLK_OUT

DS1302_IO_OUT

DS1302_CLK_LOW

Delay_nus(10)

DS1302_RST_LOW

Delay_nus(10)

DS1302_RST_HIGH

Delay_nus(10)

}

/****************************************************************

* 名称 : void Write_Byte_3W(unsigned char W_Byte)

* 功能描述: write one byte to the deviT_CE

* 输入参量: 需要写的字竖昌码节

* 输出参量: 无

* 调用子程: 无

* 使用方法: 无论读写,都首先要写东西

-------------------------------------------------*/

void Write_Byte_3W(unsigned char W_Byte)

{

unsigned char i

for(i = 0i <8i++)

{

DS1302_IO_LOW

if(W_Byte &0x01)

{

DS1302_IO_HIGH /* set port pin high to read data */

}

Delay_nus(10)

DS1302_CLK_LOW

Delay_nus(10)

DS1302_CLK_HIGH

Delay_nus(10)

W_Byte >>= 1

}

}

//****************************************************************

/****************************************************************

* 名称 : unsigned char Read_Byte_3W()

* 功能描述: read one byte from the deviT_CE

* 输入参量: 需要写的字节

* 输出参量: 读出的数据

* 调用子程: 无

* 使用方法: 从3 线器件读数据

----------------------------*/

unsigned char Read_Byte_3W(void)

{

unsigned char i

unsigned char R_Byte

unsigned char TmpByte

R_Byte = 0x00

DS1302_IO_IN //0xF7//改变io 口的方向为输入

Delay_nus(10)

for(i = 0i <8i++)

{

DS1302_CLK_HIGH

Delay_nus(10)

DS1302_CLK_LOW //下降沿数据有效

Delay_nus(10)

if(READ_DS1302_IO)

TmpByte=1//位 *** 作要小心

else

TmpByte=0

TmpByte <<= 7

R_Byte >>= 1

R_Byte |= TmpByte

}

return R_Byte

}

//******************************************************************

/****************************************************************

* 名称 : Get_Time

* 功能描述: 读取DS1302 当前时间

* 输入参量: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年

7Byte (BCD 码) 1B 1B 1B 1B 1B 1B 1B

* 输出参量: 无

* 调用子程: 无

* 使用方法:

----------------------------*/

void DS1302_Get_Time(unsigned char ucCurtime[])

{

unsigned char i

Reset_3wire()

Write_Byte_3W(0xBF)/* clock burst */

for(i=0i<7i++)

ucCurtime[i]=Read_Byte_3W()

//Reset_3wire()

DS1302_RST_LOW

}

/****************************************************************

* 名称 : Set_Time

* 功能描述: initialize time &date from user entries

* 输入参量: unsigned char yr, mn, date, dy, hr, min, sec, day设置时间并启动

* 输出参量: OK--- 设置成功

* ERROR --- 时间格式错误,无法设置

* 调用子程: 无

* 使用方法:

----------------------------*/

unsigned char DS1302_Set_Time(unsigned char *pClock)

{

unsigned char i

i = Check_Time(pClock)

if(i == ERROR)

return ERROR

pClock[5] = Get_Day(pClock[6],pClock[4],pClock[3])//取星期

//hr = hr &0x3f/* forT_CE clock to 24 hour mode */

Reset_3wire()

Write_Byte_3W(0x8e)/* control register */

Write_Byte_3W(0)/* disable write protect */

Reset_3wire()

//Write_Byte_3W(0x90)/* trickle charger register */

//Write_Byte_3W(0xab)/* enable, 2 dT IOdes, 8K resistor */

//Reset_3wire()

Write_Byte_3W(0xbe)/* clock burst write (eight registers) */

for(i=0i<7i++)

{

Write_Byte_3W(*(pClock++))

}

Write_Byte_3W(0)/* must write control register in burst mode */

//Reset_3wire()

DS1302_RST_LOW

return OK

}//******************************************************************

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

//函数名称:Get_Day

//函数功能:根据年月日算出星期

//函数参数:year --- 年

// month --- 月

// date --- 日

//函数返回:day --- 星期

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

//计算公式使用著名的蔡勒(Zeller)公式。即:

//w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

//公式中的符号含义如下,

//w:星期;

//c:世纪-1;

//y:年(两位数);

//m:月(m大于等于3,小于等于14,即在蔡勒公式中,

// 某年的1、2月要看作上一年的 13、14月来计算,

// 比如2003年1月1日要看作2002年的13月1日来计算);

//d:日;[ ]代表取整,即只要整数部分。

//C是世纪数减一,y是年份后两位,M是月份,d是日数。

//1月和2月要按上一年的13月和 14月来算,这时C和y均按上一 年取值。

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

unsigned char Get_Day(unsigned char year,unsigned char month,unsigned char date)

{

unsigned char day

unsigned int temp

unsigned char century

year = Hex_To_Decimal(year)

month = Hex_To_Decimal(month)

date = Hex_To_Decimal(date)

century = 20

if(month <3)

{

month += 12

if(year == 0)

{

year = 99

century --

}

else

year --

}

temp = (month + 1) * 26

temp = temp / 10

temp += year

temp += (year >>2)

temp += (century >>2)

temp -= (century <<1)

temp += date

temp --

day = temp % 7

if(day == 0)

day = 7

return day

}

//=======================函数===============================================

//函数名称:Check_Time

//函数功能:检查时间格式是否正确,只能检查2000-2099年

//函数参数:buffer --- 时间:字节从高到低,年 星期 月 日 时 分 秒

//函数返回:result --- OK: 格式正确

// ERROR:格式错误

//==============================================================================

unsigned char Check_Time(unsigned char *buffer)

{

unsigned char year

unsigned char month

unsigned char date

unsigned char hour

unsigned char minute

unsigned char second

year = Hex_To_Decimal(buffer[6])

month = Hex_To_Decimal(buffer[4])

date = Hex_To_Decimal(buffer[3])

hour = Hex_To_Decimal(buffer[2])

minute = Hex_To_Decimal(buffer[1])

second = Hex_To_Decimal(buffer[0])

if(second >= 60)

buffer[0] = 0x30

if(minute >= 60)

return ERROR

if(hour >= 24)

return ERROR

if(month >= 13)

return ERROR

if(month &1)

{

if(date >= 32)

return ERROR

}

else if(month == 2)

{

if(year % 4)

{

if(date >= 29)

return ERROR

}

else

{

if(date >= 30)

return ERROR

}

}

else

{

if(date >= 31)

return ERROR

}

return OK

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8268446.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存