历史上的今天
返回首页

历史上的今天

今天是:2024年08月31日(星期六)

2020年08月31日 | 单片机数字电子钟电路仿真图和程序

2020-08-31 来源:51hei

单片机源程序如下:

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit rs=P1^0;//寄存器选择

sbit rw=P1^1;//读写信号线

sbit lcden=P1^2;//led使能端


sbit scl=P1^3;//时钟线

sbit rst=P1^5;//复位线

sbit io=P1^4;//数据口


sbit key_set_time=P3^4;//设置时间键

sbit key_add=P3^5;//加键

sbit key_minus=P3^6;//减键

sbit key_set_alarm=P3^7;//设置闹钟键

sbit bee=P1^6;//蜂鸣器接口

sbit dq=P1^7;//ds18b20测温


uchar getTimebuf[7];//存放时间数据

uchar time[]={"  :  :  "};//时间格式字符串

uchar date[]={"20  -  -  "};//日期格式字符串

uchar weeklist[]={"SunMonTueWedThuFriSat"};//星期字符列表

uchar week[]={"   "};//星期格式字符串


int count;//设定秒分时日月星期年的时候count的值分别为1235647

int alarm;//是否进入闹钟设置界面 123分别代表开关 分 小时的设置

int isOpen;//闹钟是否开启  默认不开启

int fen,shi;//闹钟的分钟小时

int isRing;//闹钟是否在响


uchar isInit_1302;//是否初始化时钟完毕


int num;

int temperature;//温度

int temp_flag;//温度正负标志


void delay(uint x){

        int y;

        while(x--){

                for(y=100;y>0;y--);

        }

}

void write_1602com(uchar com){

        //1602写指令

        rs=0;

        lcden=0;

        P2=com;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void write_1602data(uchar dat){

        //1602写数据

        rs=1;

        lcden=0;

        P2=dat;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void init_1602(){

        //初始化1602液晶

        rw=0;

        lcden=0;

        write_1602com(0x38);//设置显示模式

        write_1602com(0x0c);//显示开关及光标是否显示和闪动

        write_1602com(0x06);//光标移动方向

        write_1602com(0x01);//清屏

}

void write_ds1302_byte(uchar temp){

        //ds1302写一个字节数据

        uchar i;

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

                io=temp&0x01;//将数据放到IO口上

                scl=0;//scl为低时准备数据

                scl=1;//上升沿写入

                temp>>=1;

        }

}

void write_ds1302(uchar add,uchar dat){

        //向地址add写入数据dat

        rst=0;

        scl=0;

        rst=1;

        write_ds1302_byte(add);

        write_ds1302_byte(dat);

        scl=1;

        rst=0;

}

uchar read_ds1302(uchar add){

        //ds1302读数据

        uchar i,dat;

        rst=0;

        scl=0;

        rst=1;

        write_ds1302_byte(add);//首先写入要读的数据处的地址

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

                if(io==1){

                        dat|=0x80;

                }

                scl=1;

                scl=0;//下降沿读取数据

                dat>>=1;

        }

        scl=1;

        rst=0;

        return dat;

}

void read_time(uchar curr_time[]){

          uchar i;

          uchar ucAddr = 0x81;

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

                curr_time[i] = read_ds1302(ucAddr);//格式为: 秒 分 时 日 月 星期 年

                ucAddr += 2;

          }

}

void set_time(uchar *pSecDa){

        //设定时间

        uchar i;

        uchar ucAddr = 0x80;

        write_ds1302(0x8e,0x00);        

        for(i =7;i>0;i--){

                write_ds1302(ucAddr,*pSecDa); //秒 分 时 日 月 星期 年

                pSecDa++;

                ucAddr+=2;

        }

        write_ds1302(0x8e,0x80);

}

void init_ds1302(){

        //ds1302初始化

        isInit_1302=read_ds1302(0x81);//读出时钟状态

        if(isInit_1302&0x80){//说明没有初始化

                write_ds1302(0x8e,0x00);//关闭写保护  以后一直开着

                write_ds1302(0x90,0xa5); //辅助电源充电命令 一个二极管  一个2K电阻

                write_ds1302(0x80,0x00);//秒 CH置0 开启时钟

                write_ds1302(0x82,0x59);//分

                write_ds1302(0x84,0x10);//时

                write_ds1302(0x86,0x07);//日

                write_ds1302(0x88,0x05);//月

                write_ds1302(0x8a,0x04);//星期

                write_ds1302(0x8c,0x14);//年

                write_ds1302(0x8e,0x80);

        }

}

char int_to_char(int temp){

        //把0到9对应的数字转为字符

        char x='0';

        switch(temp){

                case 0:x='0';break;

                case 1:x='1';break;

                case 2:x='2';break;

                case 3:x='3';break;

                case 4:x='4';break;

                case 5:x='5';break;

                case 6:x='6';break;

                case 7:x='7';break;

                case 8:x='8';break;

                case 9:x='9';break;

        }

        return x;

}

int ds18b20_read_temp();

void display(){

        uchar bai,shi,ge,point,fuhao;

        read_time(getTimebuf);//时时读取时间

    time[6]=(getTimebuf[0])/16+48;//格式化时间秒

    time[7]=(getTimebuf[0])%16+48;


    time[3]=(getTimebuf[1])/16+48;//格式化时间分

    time[4]=(getTimebuf[1])%16+48;


    time[0]=(getTimebuf[2])/16+48;//格式化时间小时

    time[1]=(getTimebuf[2])%16+48;


    date[8]=getTimebuf[3]/16+48;//格式化日期日

    date[9]=getTimebuf[3]%16+48;


    date[5]=getTimebuf[4]/16+48;//格式化日期月

    date[6]=getTimebuf[4]%16+48;


    date[2]=getTimebuf[6]/16+48;//格式化日期年

    date[3]=getTimebuf[6]%16+48;


    week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期

    week[1]=weeklist[(getTimebuf[5]%10)*3+1];

    week[2]=weeklist[(getTimebuf[5]%10)*3+2];

        

        write_1602com(0x80+1);

        for(num=0;num<10;num++){

                write_1602data(date[num]);

        }


        write_1602data(' ');

        for(num=0;num<3;num++){

                write_1602data(week[num]);

        }


        write_1602com(0x80+0x40);

        for(num=0;num<8;num++){

                write_1602data(time[num]);

        }

        

        //显示温度值

        write_1602com(0x80+0x40+8);//设置数据指针

        temperature=ds18b20_read_temp();

        bai=temperature/1000+0x30;

        shi=temperature%1000/100+0x30;

        ge=temperature%100/10+0x30;

        point=temperature%100%10+0x30;

        if(temp_flag==1){//说明为正数  不显示符号位 125.6 25.7两种

                fuhao=0x20;//显示空白

                if(bai==0x30){

                        bai=0x20;//如果百位为0  不显示

                        if(shi==0x30){

                                shi=0x20;//如果百位为0  十位也为0  都不显示

                        }

                }

                write_1602data(fuhao);

                write_1602data(bai);

                write_1602data(shi);

        }else{

                fuhao=0x2d;//显示负号  -2.5  -25.8两种

推荐阅读

史海拾趣

东晶(ECEC)公司的发展小趣事

近年来,随着电子信息技术的快速发展和智能化趋势的加剧,东晶电子也面临着新的机遇和挑战。为了适应市场变化和满足客户需求,公司开始实施战略转型和升级。公司加大了对新型电子元器件的研发力度,推动产品向微型化、功能化、高精度方向发展。同时,公司还积极开拓新领域和新市场,拓展业务范围和市场份额。这些举措为公司未来的发展奠定了坚实的基础。

请注意,这些故事是基于已知信息的概括性描述,并非具体的历史事件。在实际情况中,东晶电子的发展历程可能更加复杂和多样化。

Hirschmann公司的发展小趣事
当外部触发信号作用于TC4013时,定时器开始工作。同时,TC4066根据预设的数字信号状态来调整电路参数(如电阻、电容值),从而改变定时电路的延时时间或输出特性。最终,定时电路根据这些设置输出具有特定脉冲宽度或时间间隔的信号。
AZ Displays公司的发展小趣事

AZ Displays公司最初是一家专注于研发和生产TFT面板与LCD模块的初创企业。在电子行业激烈的竞争中,AZ Displays凭借其专业的技术团队和对市场的敏锐洞察,成功开发出一系列具有竞争力的产品。公司不断追求技术创新,持续优化生产工艺,逐渐在行业中树立起良好的口碑。

Advanced Technology Corp公司的发展小趣事

ATC公司的初创时期充满了挑战与艰辛。公司由几位电子工程领域的专家创立,他们凭借对技术的深刻理解和敏锐的市场洞察,决定投身于电子产品的研发与生产。在资金匮乏、市场竞争激烈的环境下,他们夜以继日地工作,不断试验、改进,最终成功研发出了一款具有竞争力的电子产品,为公司的发展奠定了坚实基础。

Bel Power Solutions公司的发展小趣事

随着全球环保意识的日益增强,Bel Power Solutions积极响应号召,将环保理念融入产品设计和生产中。公司推出了多款环保型电源产品,如高效能、低能耗的DC-DC转换器和电源供应器,帮助客户降低能耗、减少碳排放。同时,公司还致力于研发和推广可再生能源应用技术,为可持续发展做出贡献。

Custom Connector Corporation公司的发展小趣事

Custom Connector Corporation成立于1969年,当时电子连接器行业正处于快速发展阶段。创始人看到这一市场潜力,决定投身于这一领域。在创业初期,CCC面临着资金紧张、技术瓶颈和市场认可度低等问题。然而,创始人凭借对技术的执着追求和对市场的敏锐洞察,带领团队不断研发新产品,改进生产工艺,逐渐在市场中树立了自己的品牌形象。

问答坊 | AI 解惑

我的学习arm路程

今天07年12月29日,买来了我的开发板三星芯片44b0,虽然有人说这个片子都不生产了,但是我觉得能够我学习就可以了,要是能够把这个片子发挥他的功能,我的目的也就达到了。 这个是我买的开发板的图片 因为是初学,原来都是在用51,偶然的机会看他 ...…

查看全部问答>

PIC单片机应用专题

PIC单片机应用专题一:键盘操作 键盘是人机对话的桥梁,通过它可以实现应用系统的参数查询、修改。单片机应用系统的键盘一般用按钮或薄膜开关,本公司开发板利用RB口组成4*4=16个矩阵键盘(图1),PIC单片机的RB口一般具有有高、低电平中断功能, ...…

查看全部问答>

ZwSetInformationFile删除文件的FileInformationClass值

我想监视文件的删除操作,Hook了ZwSetInformationFile,却发现,使用Shift+Delete删除文件的时候FileInformationClass值是FileDispositionInformation,但是使用Delete删除的时候,得不到FileInformationClass的值。不知道是什么原因,是不是Delete ...…

查看全部问答>

一个自己写的AP,一个是EXE程序(只有EXE文件,对它没有任何通信接口),在自己写的AP里面怎么管理他们做到前后台来回切换?

一个自己写的AP,一个是EXE程序(只有EXE文件,对它没有任何通信接口),在自己写的AP里面怎么管理他们做到前后台来回切换?…

查看全部问答>

从PC拷贝文件到PDA和从PDA拷贝文件到PC,在PC端运行的程序和在PDA端运行的程序,如何实现?

PDA操作系统是WINCE或PPC 我用的开发环境是VS2005 如题,我一直用的文件同步功能,但是不好控制 给用户使用效果不好。 而且我想主动从电脑上拷贝一些文件到PDA没法直接做。觉得很不方便。 …

查看全部问答>

关于AD采样信号中含直流的问题

最近在电路调试中遇到这样的问题。   系统描述:   采用FPGA中的DDS核产生频率为几百赫兹的正弦波信号 ,通过DA转换成模拟信号,最后由DSP控制AD采样。   出现的问题:   AD采样得到的信号总是带有一个直流分量,波形 ...…

查看全部问答>

【晒心得】STM32F0Discovery 收到并安装驱动

收到货啦上照片: 下面谈下我的开发环安装: 首先下载MDK V5,我是在百度云网盘上下的。大家自己找找。 然后安装一个安装包,见下图:这个安装包要用什么就装什么,我比较很把F0-F4全装 然后可以找破解文件也可不破。反正32K限制。 下面这个 ...…

查看全部问答>

《运算放大器噪声优化手册》读书笔记之跳跃噪声

本帖最后由 dontium 于 2015-1-23 11:46 编辑 跳跃噪声的判定: 从时域上分析,跳跃噪声的时域型号是不符合高斯分布的,满足双模或多模分布,因此寻找非高斯分布是一种可以用来判定型号中是否有跳跃噪声的防范。 对时域噪声信号进行求导,可以看 ...…

查看全部问答>

2串3串4串锂电池充电ic及参考电路

开关型2/3/4节锂离子/锂聚合物充电管理芯片                    联系方式:qq:2602475926 (ic 小chen)电话:13580490479 (chen (s)) 1、 HB6295功能简述1.1、特 ...…

查看全部问答>