Atmega16与DS1302数码管显示程序

发布者:pingbashou最新更新时间:2015-04-28 来源: 51hei关键字:Atmega16  DS1302  数码管显示 手机看文章 扫描二维码
随时随地手机看文章
/*本程序为八位共阴极数码管且有两个573控制的动态扫描,本程序只用数码管显示到秒钟,

其他的要显示请自己编写,能用1602显示更好*/
#include
#include //这里面有BIT(),所以要包含
#define uchar unsigned char
#define uint unsigned int
//#pragma data:code //注code的功能是把后面的数据存在程序存贮器中,不用code就放到了随机存贮器中.
const table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00} ;
/*如果用uchar table[]就放到了数据存贮器中。决不要这样用,这样占用空间多。*/
/*两个573,段码PA3,位码PA4*/
void delay_ms(uint ms)
{
        uint i,j;
 for(i=ms;i>0;i--)
  
    for(j=220;j>0;j--);
     
}
uchar time[7]={12,3,7,25,16,59,55};//年,周,月,日,时,分,秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar year,week,month,day,hour,minute,second;
#define SCK_CLR  PORTA&=~BIT(0)
//拉低时钟线
#define SCK_SET  PORTA|=BIT(0)
//拉高时钟线
#define SCK_OUT  DDRA|=BIT(0)
//把SCK设为输出
#define RST_CLR  PORTA&=~BIT(2)
//拉低RST线
#define RST_SET  PORTA|=BIT(2)
//拉高RST线
#define RST_OUT  DDRA|=BIT(2)
//把RST设为输出
#define IO_CLR  PORTA&=~BIT(1)
//拉低IO线
#define IO_SET  PORTA|=BIT(1)
//拉高IO线
#define IO_OUT  DDRA|=BIT(1)
//把IO设为输出
#define IO_IN  DDRA&=~BIT(1)
//把IO设为输出
#define IO_RD PINA&BIT(1)
//从IO中读数据
 

void show(uchar dat,uchar wei)
{
  
   DDRA|=BIT(3);//把PA3设为输出
   DDRA|=BIT(4);//把PA4设为输出
   DDRB=0XFF;//把PB口设为输出型,全为高
    PORTA|=BIT(3);
 PORTB=table[dat];
 PORTA&=~BIT(3);
 
 PORTB=0XFF;
 PORTB&=~BIT(wei);
 PORTA|=BIT(4);
 PORTA&=~BIT(4);
 delay_ms(1);
}
 
/********1302部分*************/
void write_1302_byte(uchar dat)
{
uchar i;
IO_OUT;
  for(i=0;i<8;i++)
    {
   if(dat&0x01)
     {
  IO_SET;
  }
  else
  {
  IO_CLR;
  }
   SCK_SET;
   SCK_CLR;
   dat=dat>>1;
 }
}
uchar read_1302(uchar add)
{
uchar i,value;
RST_CLR;
SCK_CLR;
RST_SET;
write_1302_byte(add);
IO_IN;
  
    for(i=0;i<8;i++)
  {
  value=value>>1;
    if(IO_RD)
      {
   value=value|0x80;
   }
     SCK_SET;
  SCK_CLR;
 
  }
   RST_CLR;
   return value;
}
void write_1302(uchar add,uchar dat)
{
RST_CLR;
SCK_CLR;
RST_SET;
write_1302_byte(add);
write_1302_byte(dat);
RST_CLR;
}
void init_1302()
{
uchar i,k;
  for(i=0;i<7;i++)
     {
  k=time[i]/10;
  time[i]=time[i]%10;
  time[i]=time[i]+k*16;//这几句是把10进制数变成BCD16进制码
  }
  write_1302(0x8e,0x00);//去除写保护
  for(i=0;i<7;i++)
    {
 write_1302(write_add[i],time[i]);
 }
   write_1302(0x8e,0x80);//加上写保护 
}
 
 
void read_time()//读出所有时间
{
uchar i;
for(i=0;i<7;i++)
  {
  time[i]=read_1302(read_add[i]);
  }
}
void time_pro()//把读出的数值赋给年月日时分秒周
{
year=time[0];
week=time[1];
month=time[2];
day=time[3];
hour=time[4];
minute=time[5];
second=time[6];
}

void display_sec(uchar dat)
{
uchar a,b;
a=dat/16;//把BCD码转换成10进制数
b=dat%16;
show(a,0);
show(b,1);
}
/*显示年月日周时分请用上述程序稍加改动即可*/
void main()
{
SCK_OUT;
RST_OUT;
init_1302();
  while(1)
     {
  read_time();
 time_pro();
 display_sec(second);
  }
}

关键字:Atmega16  DS1302  数码管显示 引用地址:Atmega16与DS1302数码管显示程序

上一篇:ATMEGA16与DS18B20数码管显示
下一篇:一个avr单片机的汇编程序,注意几个宏指令

推荐阅读最新更新时间:2024-03-16 13:59

51实验14.数码管从 000 显示到999
#include reg52.h typedef unsigned int u16; typedef unsigned char u8; //138译码器管脚位定义 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; //数码表 u8 code smgduan ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //延时函数 void delay(u16 i) { while(i--); } void DigDispla
[单片机]
基于ds1302的电子日历系统
  基于ds1302的电子日历系统在硬件选择上主要采用AT89S51作为主控制系统;DS1302提供时钟;DS18B20作为数字式温度传感器;LCD1602液晶屏作为显示。   AT89C51单片机   单片机最小系统   AT89C51单片机采用Flash ROM,内部具有4KB ROM存储空间,相对于本设计而言程序空间完全够用。能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,而且运用于电路设计中时具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,避免芯片的多次拔插对芯片造成的损坏。   ds1302   DS1302与单片机的连接   DS130是美国DA
[单片机]
基于<font color='red'>ds1302</font>的电子日历系统
单片机电子秒表时钟 数码管显示
电子秒表时钟 数码管显示 可设置时间 可用于秒表暂停、清零蜂鸣器按键音 单片机源程序如下: #include reg51.h #include delay.h #include intrins.h unsigned char code LED ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //定义共阴极LED7段显示码 unsigned char dispbit ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义数码管位码 unsigned char hour=23,min=58,sec=52,
[单片机]
单片机电子秒表时钟 <font color='red'>数码管</font><font color='red'>显示</font>
基于AVR ATMega16 的PID 控制算法程序
最近由于有些时间,于是想起了做一个PID设计,在网上收集了不少关于PID控制的理论,于是计划用mega16L做一个PID测试程序,发现一些意想不到的误差,不知各位同仁是否有遇到与我的类似的现象:我定义了一个PID结构体,在初始化的时候无法把每个元素的初始化值设置为0(见下面的仿真图),而且,PID结构体中的部分参数是应该不变的,在整个PID运算中,但是不应该变化的参数却在PID运算发生了变化,不知道是什么原因,到现在也无法查出原因。有兴趣的朋友可以一起参与讨论或有经验的朋友 给与相关帮助,谢谢! 详细的代码和仿真情况如下:(我的硬件系统是本站的min Mega16/32 + JTAG ICE) #include config.h
[单片机]
基于AVR <font color='red'>ATMega16</font> 的PID 控制算法程序
51单片机控制+MAX7219+DS1302 电子钟
/************************************************** *程序名称: MAX7219 C语言控制程序 *程序功能: 3线串行控制8位共阴数码管 *3线定义:DIN 串行数据输入 * LOAD 数据锁存 * CLK 时钟输入 ***************************************************/ #in
[单片机]
ATMEGA16定时器0
T/C0 是一个八位定时器,主要有定时、外部事件计数、产生PWM 波形这几个功能,我们在使用这些功能之前,首先要设置T/C0 工作在合适的工作模式下。T/C0 有四种工作模式,分别是普通模式、CTC 模式、快速PWM、相位可调的PWM 模式四种。模式设置通过T/C0 的控制寄存器TCCR0 来完成。 1.普通模式 在此模式下,T/C0 的计数寄存器TCNT0 在时钟的驱动下不停累加。当计满后(计数值达到最大,8 位寄存器最大计数值为0xff),由于数值的溢出寄存器清零重新开始累加。当计数器溢出后,TIFR 中的溢出标志位TOV0 会置位,也可触发中断。所以我们可以通过查询或中断的方式得知定时器的溢出从而进行相关处理。此模式适合
[单片机]
AD转换的数码管显示
*本例程采用AD0804芯片,硬件电路:cs片选端接P2.3,WR写数据端写P3.6,RD读数据端接P3.7,锁存端接P2.6脚,数码管位选端分别接P3.2 ,P3.3,P3.4,段选端接P1口*/ #include reg52.h //头文件 #define uint unsigned int//宏文件 #define uchar unsigned char//宏文件 uchar num;//变量 void delay3(uint z);//延时定义 void dissy();//延时函数定义 sbit ge=P3^2;//个位定义 sbit shi=P3^3;//十位定义 sbit bai=P3^4;//百位定义 sbit ad
[单片机]
电子钟(DS1302+AT89C2051的红外遥控钟)
;遥控器各按键数据码,可根据不同的遥控器修改对应的键码 muteM EQU 10h ;静音键 闹铃开/关 timerT EQU 0Ch ;菜单键 进入/退出设置状态 leftL EQU 46h ;左移键 rightR EQU 47h ;右移键 upU EQU 19h ;增加键 downD EQU 1dh ;减少键 d_off EQU 16H ;显示键 LED数码管显示/关闭 recall EQU 44H ;日历键 DS1302初始化操作 K_on BIT P3.0 ;闹铃输出 LED1 BIT P3.3 LED2 BIT P3.4 LED3CLK BIT P3.5 ;DS1302 LED4IO BIT P3.7 RST BIT
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved