C51单片机模块化编程万年历设计

发布者:TranquilGaze最新更新时间:2015-12-24 来源: eefocus关键字:C51  单片机  模块化编程  万年历 手机看文章 扫描二维码
随时随地手机看文章

[转载]C51单片机模块化编程万年历设计


程序如下:
main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define DQ P3_7
#endif

ds18b20.h

#include "main.h"
uint sec;
uint min=41;
uint hour=18;
uint day=20;
uint month=4;
uint yearl=11;
uint yearh=20;
uint tcnt;
uint cursor=0;
uchar a=0xff;
uchar code Seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(uint t)
{
    uint i;
    while(t--)
    {for (i=0;i<125;i++);}
}
void Tdelay(unsigned int i)
{
 while(i--);
}
void Kdelay(unsigned int z)
{
    uchar i,j;
    for(i=0;i     for(j=248;j>0;j--);
}
Init_DS18B20(void)
{
 unsigned char x = 0;
 DQ = 1;   
 Tdelay(200); 
 DQ=0;   
 Tdelay(80);
 DQ=1;   
 Tdelay(200);
 Tdelay(200);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0;
  dat>>=1;
  DQ = 1;
  if(DQ)
   dat|=0x80;
  Tdelay(4);
 }
 return(dat);
}

//写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  Tdelay(5);
  DQ = 1;
  dat>>=1;
 }
}

//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;       
t= tt*10+0.5;     
return(t);
}

void display(uchar L1,uchar L2,uchar L3,uchar L4,uchar L5,uchar L6,uchar L7,uchar L8,uchar L9,uchar L10,uchar L11,uchar L12,uchar L13,uchar L14,uchar L15,uchar L16)
{
    P2=0x7F;P0=L1;delay(1);  //yearh
    P2=0xBF;P0=L2;delay(1);  //yearh
    if(cursor==6){P2=0xDF;P0=L3;delay(1);}else{P2=0xDF;P0=L3;delay(1);}   //yearl
    if(cursor==6){P2=0xEF;P0=L4;delay(1);}else{P2=0xEF;P0=L4;delay(1);}   //yearl
    if(cursor==5){P2=0xF7;P0=L5;delay(1);}else{P2=0xF7;P0=L5;delay(1);}   //month
    if(cursor==5){P2=0xFB;P0=L6;delay(1);}else{P2=0xFB;P0=L6;delay(1);}   //month
    if(cursor==4){P2=0xFD;P0=L7;delay(1);}else{P2=0xFD;P0=L7;delay(1);}   //day
    if(cursor==4){P2=0xFE;P0=L8;delay(1);}else{P2=0xFE;P0=L8;delay(1);}   //day
    P2=0xFF;
    if(cursor==3){P1=0x7F;P0=L9;delay(1);}else{P1=0x7F;P0=L9;delay(1);}   //hour
    if(cursor==3){P1=0xBF;P0=L10;delay(1);}else{P1=0xBF;P0=L10;delay(1);}  //hour
    if(cursor==2){P1=0xDF;P0=L11;delay(1);}else{P1=0xDF;P0=L11;delay(1);} //min
    if(cursor==2){P1=0xEF;P0=L12;delay(1);}else{P1=0xEF;P0=L12;delay(1);} //min
    if(cursor==1){P1=0xF7;P0=L13;delay(1);}else{P1=0xF7;P0=L13;delay(1);} //sec
    if(cursor==1){P1=0xFB;P0=L14;delay(1);}else{P1=0xFB;P0=L14;delay(1);} //sec
    P1=0xFD;P0=L15;delay(1); //temp
    P1=0xFE;P0=L16;delay(1); //temp
    P1=0xFF;
}

main.c

#include "main.h"
#include "ds18B20.h"
void delay(uint t);
void Tdelay(unsigned int i);
void Kdelay(unsigned int z);
Init_DS18B20(void);
ReadOneChar(void);
WriteOneChar(unsigned char dat);
ReadTemperature(void);
void display(uchar L1,uchar L2,uchar L3,uchar L4,uchar L5,uchar L6,uchar L7,uchar L8,uchar L9,uchar L10,uchar L11,uchar L12,uchar L13,uchar L14,uchar L15,uchar L16);
main()
 
    uint i;   
    TMOD=0x02;            //设置模式为定时器T0的模式2 (8位自动重装计数初值的计数值)       
    TH0=0x06;             //设置计数器初值,靠TH0存储重装的计数值X0=256-250=6
    TL0=0x06;
    TR0=1;                //启动T0
    ET0=1;                //开启定时器T0中断允许
    EA=1;                 //开启中断总控制
    while(1)
    {
        if(P3_0==0)
        {
            Kdelay(200);
            if(P3_0==0)
            {
                cursor++;
                if(cursor>=7){cursor=0;}
            }
        }
        if(P3_1==0)
        {
            Kdelay(200);
            if(P3_1==0)
            {
                if(cursor==1){sec++;if(sec==60)sec=0;}
                if(cursor==2){min++;if(min==60)min=0;}
                if(cursor==3){hour++;if(hour==24)hour=0;}
                if(cursor==4){day++;if(day==31)day=0;}
                if(cursor==5){month++;if(month==12)month=0;}
                if(cursor==6){yearl++;if(yearl==100)yearl=0;}
                if(cursor==7){yearh++;if(yearh==30)yearh=20;}
            }
        }
        if(P3_2==0)
        {
            Kdelay(200);
            if(P3_2==0)
            {
                if(cursor==1){sec--;}
                if(cursor==2){min--;}
                if(cursor==3){hour--;}
                if(cursor==4){day--;}
                if(cursor==5){month--;}
                if(cursor==6){yearl--;}
                if(cursor==7){yearh--;}
            }
        }
        i=ReadTemperature();
        display(Seg[yearh/10],Seg[yearh],Seg[yearl/10],Seg[yearl],Seg[month/10],Seg[month],Seg[day/10],Seg[day],Seg[hour/10],Seg[hour],Seg[min/10],Seg[min],Seg[sec/10],Seg[sec],Seg[i/100],Seg[i/10]);    
    }
}

void t0(void)interrupt 1 using 0   //t0的中断程序
{
    tcnt++;
    if(tcnt==4000)//定时器的定时计数,4000次250us为1秒
    {
        tcnt=0;
        P3_3=~P3_3;
        a=~a;
        sec++;
        if(sec==60)
          
            sec=0;
            min++;
            if(min==60)
            {
                min=0;
                hour++;
                if(hour==24)
                {
                    hour=0;
                    day++;
                    if(month==2&&((yearl==0&&yearh%4==0)||(yearl!=0&&yearl%4==0))&&day==30)day=1; 
                    else if(month==2&&day==29)day=1;
                    else if((month==4||month==6||month==9||month==11)&&day==31)day=1;
                    else if(day==32)day=1;
                    if(day==1)
                    {
                    month++;
                    if(month==13)
                    {
                        month=1;
                        yearl++;
                        if(yearl==100)
                        {
                            yearl=0;
                            yearh++;
                            if(yearh==100)
                            {
                                yearh=20;
                            }
                        }
                    }
                }
                }
            }
        }
    }
}

关键字:C51  单片机  模块化编程  万年历 引用地址:C51单片机模块化编程万年历设计

上一篇:步进电机正反转程序
下一篇:1602字符液晶详细资料和实例 (续)

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

基于MSP430单片机的智能温度检测系统设计
1 引言 随着设备的电气化和自动化程度不断提高, 对设备和环境进行实时监控显得尤为重要。传统的测温器件热敏电阻测出的一般是电压, 需要再转化为相应的温度, 这就要有其它外部硬件的支持。因此硬件电路比较复杂, 设计成本也比较高。智能温度检测系统采用的是一种改进型智能温度传感器DS18B20, 数字温度传感器通过单总线与单片机连接, 系统结构简单, 抗干扰能力强, 适合于恶劣环境下进行现场温度测量, 也可应用于仓库测温、高层空调控制和农业生产过程监控等领域。 2 温度检测系统硬件构成 该温度检测系统由主控制器MSP430F149、存储模块CAT24WC64、液晶显示模块HTM1602A、语音报警模块ISD1420、矩阵键盘和单总
[单片机]
单总线单片机多机通讯系统设计
    摘要: 提出了用单总线完成单片机通讯的方法。结合系统既传输数字信号又传输模拟信号的特点,提出用消侧音电路解决模拟信号的方案,并给出了详细的技术解决方案。     关键词: 单总线 单片机 电源隔离 消侧音 传统的多机通讯系统一般需要四条线完成:1.电源线;2.地线;3.发送信号线;4.接收信号线。然而,对于主机和分机距离较远、分机台数较多的系统,采用四线制的经费投入较大,安装起来也颇困难。基于这一问题,本文结合为某医院研制的既有模拟信号(语音)又有数字信号的传输呼叫系统,提出用单总线实现多机通讯,并给出了一个完整的技术方案。 1 单总线制多机通讯系统的总线设计方案 本设计实现的多机呼叫系
[网络通信]
MCS-51单片机主要应用特性
  MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品,各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。我们也以这一代表性的机型进行系统的讲解。   MCS-51系列单片机主要包括8031、8051和8751等通用产品,其主要功能如下:   ·8位CPU   ·4kbytes 程序存储器(ROM)   ·128bytes的数据存储器(RAM)   ·32条I/O口线   
[单片机]
MCS-51<font color='red'>单片机</font>主要应用特性
无线充电市场将迎来价格战,MCU替代SoC或成长尾效应
自iPhone 8/X标配无线充电功能后,无线充电市场开始爆发且持续升温,给国内无线充电厂商带来了巨大的市场红利,其中发射端无线充电器快速起量,增幅超10倍。然而,随着苹果无线充电器AirPower即将上市,小米、华为也将发布带有无线充电功能的新机,整个无线充电市场将会迎来又一轮的爆发。不过,在新一轮的爆发潮中,由MCU和SoC方案引发的价格战也随之而来。 AirPower上市在即,新一轮爆发开启价格战 近日,业界传出最新消息称,苹果原装的无线充电器AirPower会在月底正式上市发售,售价为199美元。不过,苹果无线充电支持WPC的Qi标准,而国内厂商基于Qi标准认证的无线充电器同样也支持iPhone 8/X的无线充电,且价格更
[电源管理]
温度测量处理变送器设计
一、概述   石灰炉烧制石灰时炉内各处的温度可能不一样,生产工艺要求得出炉内四点的平均温度,了解各点的温度值,对平均值及各测量点的温度进行报警处理;若某处的信号不正常(传感器损坏或断线)能及时报警并排除在数据处理之外。本系统可完成以上功能,检测处理石灰炉的温度,并以4-20mA形式变送远传温度平均值或最高一点的温度。该产品的工作示意图如下图1所示,在该石灰炉内有四个点分别放四个热电偶,这四个热电偶就是该系统的四路输入信号来源。利用该系统测出如图1所示的四点的温度(T1,T2,T3,T4)并把每一点的温度值送到面板显示。 注:T1、T2、T3、T4是石灰炉内四个检测点, 即是文中所提到的信号路数。 图一 二、系统硬件设计
[单片机]
#C51中断计数功能(简单频率测量)
前言 T0/T1中断计数功能使用,及简单频率测量 提示:以下是本篇文章正文内容,下面案例可供参考 一、场景 方案1:单位时间计数,如1s计数,即为频率。有误差,频率约高误差逐步减小,适用于精度要求不高的测量 方案2:测周法:外部中断下降沿触发,第1个负跳变时打开定时器开始计数,第2个负跳变时关闭计数,TH0 && TL0取出,即为周期。倒数即为频率。 二、编程实现 设计思路 T1计数,T0定时。 T0中断服务函数中定时1s,关闭T1计数,并计算TH1/TL1 代码设计 void Timer1Init(void) //@11.0592MHz { TMOD &= 0x0F; //设置计数模式 GATE C/T^ M
[单片机]
#<font color='red'>C51</font>中断计数功能(简单频率测量)
基于单片机的超声波测距系统的设计
O 引言 超声波是指频率大于20 kHz的在弹性介质中产生的机械震荡波。由于超声波频率较高,穿透力强,指向性强,传输过程中衰减少,能量消耗缓慢,在介质中传播的距离较远,遇到杂质或分界面时会产生反射波,因此常被用于非接触式测距。并且超声波对光线、色彩和电磁场不敏感,因此超声波测距对环境有较好的适应能力。广泛应用于汽车倒车、机器人避障、工业测井、水库液位测量、管道长度测量等需要自动进行非接触测距的场合。 1 超声波测距原理 Pellarn和Galt于1946年提出了脉冲回波法,其工作原理是:用超声脉冲激励超声探头向外辐射超声波,同时接收从被测物体反射回来的超声波(简称回波),通过检测或估计从发射超声波至接收回波所经历的射程时
[单片机]
基于<font color='red'>单片机</font>的超声波测距系统的设计
D1005P单片机立体声放音机电路的应用
D1005P是一块性能较好的立体声 放音机 专用集成电路.电路内包含有两个通道的前置放大器,音量控制电路和耳机放大器,另外还有一个作为控制音量的电压/电流转换电路和能输出
[单片机]
D1005P<font color='red'>单片机</font>立体声放音机电路的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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