历史上的今天
今天是: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两种
史海拾趣
|
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没法直接做。觉得很不方便。 … 查看全部问答> |
|
最近在电路调试中遇到这样的问题。 系统描述: 采用FPGA中的DDS核产生频率为几百赫兹的正弦波信号 ,通过DA转换成模拟信号,最后由DSP控制AD采样。 出现的问题: AD采样得到的信号总是带有一个直流分量,波形 ...… 查看全部问答> |
|
收到货啦上照片: 下面谈下我的开发环安装: 首先下载MDK V5,我是在百度云网盘上下的。大家自己找找。 然后安装一个安装包,见下图:这个安装包要用什么就装什么,我比较很把F0-F4全装 然后可以找破解文件也可不破。反正32K限制。 下面这个 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 11:46 编辑 跳跃噪声的判定: 从时域上分析,跳跃噪声的时域型号是不符合高斯分布的,满足双模或多模分布,因此寻找非高斯分布是一种可以用来判定型号中是否有跳跃噪声的防范。 对时域噪声信号进行求导,可以看 ...… 查看全部问答> |
|
开关型2/3/4节锂离子/锂聚合物充电管理芯片 联系方式:qq:2602475926 (ic 小chen)电话:13580490479 (chen (s)) 1、 HB6295功能简述1.1、特 ...… 查看全部问答> |




