AVR M16实验之七 DS1302测试

发布者:云自南国来最新更新时间:2015-11-12 来源: eefocus关键字:AVR  M16实验  DS1302测试 手机看文章 扫描二维码
随时随地手机看文章
/**********************************************************************
* 文件名称: main.c
* 程序作者: kidcao1987
* 程序版本: V1.0
* 功能描述: 装上LCD1602,在其上显示时间,年月等
* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:http://bbs.cepark.com
**********************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define SCLK PA1
#define IO PA2
#define RST PA3
#define RS PA4
#define RW PA5
#define EN PA6

uchar DisplayNum[]={"0123456789"};
uint Calendar[]={0x10,0x02,0x4,0x12,0x22,0x40,0x00};//年月周日时分秒
uchar Weeks[7][3]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};//字符数组
uchar ConversionResult[]={"20**-**:*-**-**-**-**"};//开辟空间存储转换结果
uchar i=1;

void LCD1602_Initial(void);
void LCD1602_CommandWrite(uchar com);
void LCD1602_ByteWrite(uchar date);
void LCD1602_Display(uchar adr,uchar date);
void LCD1602_BusyCheck(void);
void PORTx_Initial(void);
void Initial_DS1302(void);
void DS1302_RST(void);
void DS1302_ByteWrite(uchar command,uchar Byte);
uchar DS1302_ByteRead(uchar command);
void DS1302_TimeShow(void);
uchar BCD_Conversion(uchar date);
void Calendar_ReadBack(void);

int main(void)

PORTx_Initial();//初始化IO
LCD1602_Initial();//初始化1602
Initial_DS1302();//初始化DS1302
while(1)
{
DS1302_TimeShow();//显示时间
}
}
/*LCD1602初始化*/
void LCD1602_Initial(void)

LCD1602_CommandWrite(0x38);
_delay_ms(15);
LCD1602_CommandWrite(0x38);
_delay_ms(5);
LCD1602_CommandWrite(0x38);
_delay_ms(5);
LCD1602_CommandWrite(0x01);
_delay_ms(1);
LCD1602_CommandWrite(0x38);
_delay_ms(1);
LCD1602_CommandWrite(0x0c);
_delay_ms(1);
LCD1602_CommandWrite(0x06);
}
/*端口初始化函数*/
void PORTx_Initial(void)
{
PORTA&=~((1<PORTA&=~((1<<4)|(1<<5)|(1<<6));
DDRA|=(1<
PORTB=0x00;
DDRB=0xff; //B口初始化为输出方向输出低电平
}
/*DS1302初始化函数*/
void Initial_DS1302(void)
{
DS1302_RST();
DS1302_ByteWrite(0x90,0xa9);//使能充电,双二极管,2K电阻
DS1302_RST();
DS1302_ByteWrite(0x8e,0x00);//关闭写保护
DS1302_RST();
DS1302_ByteWrite(0x8c,Calendar[0]);//10年
DS1302_RST();
DS1302_ByteWrite(0x88,Calendar[1]);//2月
DS1302_RST();
DS1302_ByteWrite(0x8a,Calendar[2]);//周三
DS1302_RST();
DS1302_ByteWrite(0x86,Calendar[3]);//10日
DS1302_RST();
DS1302_ByteWrite(0x84,Calendar[4]);//00时
DS1302_RST();
DS1302_ByteWrite(0x82,Calendar[5]);//00分
DS1302_RST();
DS1302_ByteWrite(0x80,0x00);//00秒
DS1302_RST();
}
/*DS1302复位函数*/
void DS1302_RST(void)
{
PORTA&=~(1<_delay_us(1);
PORTA|=(1<_delay_us(1);
}
/*DS1302字节写入函数*/
void DS1302_ByteWrite(uchar command,uchar Byte)
{
uchar n=0;
for(n=0;n<8;n++)
{
if(command&0x01)
PORTA|=(1<else
PORTA&=~(1<PORTA|=(1<_delay_us(1);
PORTA&=~(1<_delay_us(1);
command>>=1;
}
for(n=0;n<8;n++)
{
if(Byte&0x01)
PORTA|=(1<else
PORTA&=~(1<PORTA|=(1<_delay_us(1);
PORTA&=~(1<_delay_us(1);
Byte>>=1; 
}
}[page]
/*DS1302字节读取函数,注意下降沿读出数据和第八个下降沿*/
uchar DS1302_ByteRead(uchar command)
{
uchar i=0,n=0,readback=0;
PORTA|=(1<DDRA|=(1<for(n=0;n<8;n++)
{
PORTA&=~(1<_delay_us(1);
if(command&0x01)
PORTA|=(1<else
PORTA&=~(1<command>>=1;
PORTA|=(1<_delay_us(1);
}
PORTA|=(1<DDRA&=~(1<for(i=0;i<8;i++)
{
readback>>=1;
PORTA|=(1<_delay_us(1);
PORTA&=~(1<_delay_us(1);
if(PINA&(1<readback|=0x80;
}
return readback;
}
/*读取DS1302数据,分别是年月周日时分秒*/
void Calendar_ReadBack(void)
{
DS1302_RST();
Calendar[0]=DS1302_ByteRead(0x8d);
DS1302_RST();
Calendar[1]=DS1302_ByteRead(0x89);
DS1302_RST();
Calendar[2]=DS1302_ByteRead(0x8b);
DS1302_RST();
Calendar[3]=DS1302_ByteRead(0x87);
DS1302_RST();
Calendar[4]=DS1302_ByteRead(0x85);
DS1302_RST();
Calendar[5]=DS1302_ByteRead(0x83);
DS1302_RST();
Calendar[6]=DS1302_ByteRead(0x81);
DS1302_RST();
}
/*1602写命令字子函数*/
void LCD1602_CommandWrite(uchar com)
{
LCD1602_BusyCheck();
PORTA&=~(1<PORTB=com; //将数据送到8位并行数据口
PORTA|=(1<_delay_ms(1); //延时5ms,保持EN电平
PORTA&=~(1<}
/*1602写数据子函数*/
void LCD1602_ByteWrite(uchar date)
{
LCD1602_BusyCheck();
PORTA|=(1<PORTB=date; //将数据送到8位并行数据口
PORTA|=(1<_delay_ms(1); //延时5ms,保持EN电平
PORTA&=~(1<}
/*在某位置显示某字符,参数adr为待写地址,date为待写字节*/
void LCD1602_Display(uchar adr,uchar date)
{
LCD1602_BusyCheck();
LCD1602_CommandWrite(adr);
LCD1602_BusyCheck();
LCD1602_ByteWrite(date); 
}
void LCD1602_BusyCheck(void)
{
PORTB=0xff;
DDRB=0x00;
PORTA|=(1<PORTA&=~(1<PORTA|=(1<_delay_us(5);
while(PINB&0x80);
PORTA&=~(1<PORTA&=~(1<PORTB=0xff;
DDRB=0xff;
}
/*将BCD码转换为10进制*/
uchar BCD_Conversion(uchar date)
{
uchar highbit=0,lowbit=0,Result;
highbit=date/16;
lowbit=date%16;
Result=highbit*10+lowbit;
return Result;
}
void DS1302_TimeShow(void)
{
Calendar_ReadBack();
ConversionResult[2]=(BCD_Conversion(Calendar[0]))/10;
ConversionResult[3]=(BCD_Conversion(Calendar[0]))%10;//转换后存入年
ConversionResult[5]=(BCD_Conversion(Calendar[1]))/10;
ConversionResult[6]=(BCD_Conversion(Calendar[1]))%10;//转换后存入月
ConversionResult[8]=Calendar[2];//不转换直接存入周
ConversionResult[10]=(BCD_Conversion(Calendar[3]))/10;
ConversionResult[11]=(BCD_Conversion(Calendar[3]))%10;//转换后存入日
ConversionResult[13]=(BCD_Conversion(Calendar[4]))/10;
ConversionResult[14]=(BCD_Conversion(Calendar[4]))%10;//转换后存入时
ConversionResult[16]=(BCD_Conversion(Calendar[5]))/10;
ConversionResult[17]=(BCD_Conversion(Calendar[5]))%10;//转换后存入分
ConversionResult[19]=(BCD_Conversion(Calendar[6]))/10;
ConversionResult[20]=(BCD_Conversion(Calendar[6]))%10;//转换后存入秒
uchar n;
/*以下为1602显示语句*/
for(n=0;n<2;n++)
{
LCD1602_Display(0x81+n,ConversionResult[n]);
}
for(n=2;n<4;n++)
{
LCD1602_Display(0x81+n,DisplayNum[ConversionResult[n]]);
}
LCD1602_Display(0x85,ConversionResult[4]);
for(n=5;n<7;n++)
{
LCD1602_Display(0x81+n,DisplayNum[ConversionResult[n]]);
}
LCD1602_Display(0x88,ConversionResult[4]);
for(n=8;n<10;n++)
{
LCD1602_Display(0x81+n,DisplayNum[ConversionResult[n+2]]);
}
for(n=0;n<3;n++)
{
LCD1602_Display(0x80+13+n,Weeks[ConversionResult[8]][n]);
}
for(n=0;n<2;n++)
{
LCD1602_Display(0x80+0x42+n,DisplayNum[ConversionResult[n+13]]);
}
LCD1602_Display(0x80+0x40+4,ConversionResult[7]);
for(n=3;n<5;n++)
{
LCD1602_Display(0x80+0x42+n,DisplayNum[ConversionResult[n+13]]);

LCD1602_Display(0x80+0x40+7,ConversionResult[7]);
for(n=6;n<8;n++)
{
LCD1602_Display(0x80+0x42+n,DisplayNum[ConversionResult[n+13]]);

}

视频地址:

http://v.youku.com/v_show/id_XMTYxNDk1ODY4.html

关键字:AVR  M16实验  DS1302测试 引用地址:AVR M16实验之七 DS1302测试

上一篇:AVR M16实验之八 AT24C02测试
下一篇:AVR M16实验之六 DS18B20测温

推荐阅读最新更新时间:2024-03-16 14:39

AVR掉电保护电路设计图剖析 —电路图天天读(221)
  AVR自带的BOD电路,作用是在电压过低(低于设定值)时产生复位信号,防止CPU意外动作。对EEPROM的保护作用是当电压过低时保持RESET信号为低,防止CPU意外动作,错误修改了EEPROM的内容而我们所理解的掉电检测功能是指具有预测功能的可以进行软件处理的功能。   例如,用户想在电源掉电时把SRAM数据转存到EEPROM,可行的方法是外接一个在4.5V翻转的电压比较器 (VCC=5.0V,BOD=2.7V),输出接到外部中断引脚(或其他中断),一但电压低于4.5V,马上触发中断,在中断服务程序中把数据写到 EEPROM中保护起来注意:写一个字节的EEPROM时间长达8mS,所以不能写入太多数据,电源滤波电容也要选大
[单片机]
<font color='red'>AVR</font>掉电保护电路设计图剖析 —电路图天天读(221)
AVR ASF4库函数学习笔记】二、GPIO
平台:Microchip Studio (原Atmel Studio 7) 欣世纪 DMAVR-L Atmega 128A - AU 头文件为port.h 枚举类型 enum port_pull_mode { PORT_PULL_OFF, PORT_PULL_UP, }; enum port_dir { PORT_DIR_IN, PORT_DIR_OUT, PORT_DIR_OFF, }; 函数 X = ABCDEFG static inline bool PORTX_get_pin_level(const uint8_t pin) 读取连接到端口的引脚上的电平 stat
[单片机]
AVR单片机的调频立体声收音机设计解析
引言 早期的数字FM处理芯片TEA5767由Philips公司开发并被广泛地使用,但该芯片需要外加音频放大电路才能驱动耳机。鉴于此,国内锐迪科微电子公司独立开发了一颗具备高接收灵敏度的FM立体声数字芯片RDA5807P,具有自动搜台、重低音、静音、休眠、直接驱动耳机等优异的性能。本文介绍用RDA5807P芯片设计和制作了一款带遥控功能的收音机。 1 收音机总体设计方案 收音机的总体设计框图如图1所示。本收音机采用单节3.7 V、容量1500 mAh的锂电池作力电源,在使用寿命期内可以用手机充电器反复对它进行充电,使用非常方便。采用低功耗的AVR单片机ATmega8L作为微控制器,负责处理和协调各模块电路的工作,AT
[单片机]
<font color='red'>AVR</font>单片机的调频立体声收音机设计解析
AVR 内部EEPROM读写式例
本程序简单的示范了如何使用ATMEGA16的EERPOM EEPROM的简介 EEPROM的写操作 EEPROM的读操作 出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器 在打开调试文件到JTAG后, 打开Debug - JTAG ICE Options菜单, 然后在JTAG ICE Properties中点击Dbug页面,将preserve eeprom选项选中。 在每次仿真调试时候,就保护EEPROM内容了。 否则,会按照默认设置擦除EEPROM的内容。 由于定义了EEPROM变量,JTAG调试时会询问是否初始化EEPROM,请选择 EEPROM的数据也可以在view- memory,选E
[单片机]
avr定时器T0,T1,T2初始化配置及其说明
#include iom16v.h #include macros.h unsigned char shi,fen,miao; unsigned char t=0; #define DATA_T0_INIT 156 #define DATA_T1_INIT 31249 #define DATA_T2_INIT 156 unsigned int T0_CAPT=0; //T0/C0溢出中断向量端口 #pragma interrupt_handler Timer0_over:iv_TIMER0_OVF //T0/C0比较匹配中断向量端口 #pragma interrupt_handler Timer0_COMP:iv_TIMER
[单片机]
AVR 比较匹配中断
CTC:比较匹配时清零计数器模式,。当计数器TCNT0的数值等于比较寄存器OCR0时计数器TCNT0自动清零。OCR0定义了计数器的最大(TOP)值,这个模式使得用户可以很容易地控制比较匹配输出的频率。T/C0的比较输出脚为OC0(PB3),PB口的第三脚,在此模式下可以在OC0上输出PWM控制外部设备。 例如:在OC0脚上输出20HZ的方波信号,方波的周期时间为T=1/20HZ=0.05秒=50ms,半个周期为25ms,系统采用8MHZ晶振,1024分频,时钟计数频率为8000000/1024=7812.5HZ,每个时钟脉冲时间为1/7812.5=0.128ms, 定时25ms的计数值为25ms/0.128ms=195,将195
[单片机]
采用AVR单片机的小型采暖炉控制系统抗干扰设计
1. 引言 : AVR单片机在工业控制领域应用时不同于民用、商用领域中的应用。工业控制所处的环境相对比较恶劣,干扰源多。其常见干扰源来自现场工业电气在投入、运行、切断等工况下产生的静电感应、尖峰电压、浪涌电流等干扰。实践表明,在工作室中按用户要求设计的小型工业采暖控制系统,尽管各项逻辑功能及技术指标的测试都正常,但该系统拿到现场上却不能使用;检测失灵,操作失控,显示花屏等现象接踵而来。经分析,其干扰是从现场不同路径传入单片机控制系统的。切断干扰源,提高单片机抗干扰能力是解决控制系统正常工作的前提。 2 抗干扰措施 2.1 测温信号的抗干扰 测温电路采用的是单总线芯片DS18B20,该芯片具有测温精度高,连接线路简单
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved