| 查看: 1798 | 回复: 15 | ||
[求助]
求各位大神帮我看下一个小小的程序,只需要你一点儿时间。就会帮我很大的忙
|
||
|
各位大牛们。我来小木虫,有四年了,从大学开始到现在马上毕业。 学习到了很多知识,想过很多路要走。出国,考研,找工作。 在最后时刻,我进了移动。我学的通信,对C语言方面实在是头疼。 恳请各位帮助我一下。、 将一个很简单的电子万年历的程序。画一个流程图、、、、、如果谁愿意。。加我QQ 我在线等、到时候把源程序给你们看看。不多。就500行左右的程序。如果可以,帮我讲解一下。也许会浪费一点时间 ![]() ![]() ![]() 。但是对我的帮助不可估量,谢谢了。。。。。 |
» 猜你喜欢
A期刊撤稿
已经有3人回复
职称评审没过,求安慰
已经有34人回复
垃圾破二本职称评审标准
已经有17人回复
回收溶剂求助
已经有6人回复
投稿Elsevier的Neoplasia杂志,到最后选publishing options时页面空白,不能完成投稿
已经有22人回复
申请26博士
已经有5人回复
EST投稿状态问题
已经有7人回复
毕业后当辅导员了,天天各种学生超烦
已经有4人回复
求助文献
已经有3人回复
投稿返修后收到这样的回复,还有希望吗
已经有8人回复
» 本主题相关商家推荐: (我也要在这里推广)
» 本主题相关价值贴推荐,对您同样有帮助:
求各位大神帮忙分析下!
已经有0人回复
求各位大神帮我看下这个所用的高斯软件的计算任务是什么??急!急!!急!!!
已经有8人回复
---为什么的WB条带是这样?求各位大神指点!!!!!
已经有3人回复
新人一枚想申欧洲博士,求问各位大神应如何准备
已经有19人回复
菜鸟16考研 但对考研0了解 希望给各位帮帮忙啦
已经有6人回复
审稿人的一条意见没看明白,求大家给分析分析!
已经有5人回复
求助各位大神,谁可以帮我找下曹楚南关于SCC的阳极溶解具体解释的文献?
已经有0人回复
求指导一个介孔材料的小角XRD
已经有10人回复
审稿人给的审稿意见没看明白,求大神指点!
已经有0人回复
15考研,精细或药学未定,浙江上海未定,本科化学,求帮忙分析我该考哪所学校!!
已经有8人回复
CV测试时的问题,请各位大神进来看下帮帮我这个新手
已经有15人回复
CV测试时的问题,请各位大神进来看下帮帮我
已经有1人回复
我想问下,,我是一名的动物药学的学生,就要考研了。求有经验的大神指导。。。
已经有6人回复
第一次做液质,帮我看下有没有目标产物
已经有12人回复
求助各位大神,帮我看看有关细胞培养和激光扫描共焦实验~~跪谢,悬赏两金
已经有3人回复
求大神帮忙关于纳米金的修饰
已经有4人回复
过来看过来观,片片大餐接着上~请求各位植物大神大仙们帮我看看这些是什么植物呢~~
已经有20人回复
求各位fluent大神,UDF曳力问题,帮帮忙,感激不尽。。。
已经有4人回复
菜鸟第一次进论坛 看了很多牛人介绍 来个长标题的 希望大家帮帮忙啊 2013环境工程考研
已经有4人回复
6楼2013-06-06 16:24:26
2楼2013-06-06 15:40:34
3楼2013-06-06 15:45:06
4楼2013-06-06 16:08:38
5楼2013-06-06 16:20:20
7楼2013-06-06 16:27:35
|
#include<reg51.h> //调用头文件 #define uchar unsigned char //宏定义用 uchar 来代表 unsigned char #define uint unsigned int //宏定义用 uint 来代表 unsigned int sbit io=P1^3; //定义DS1302数据引脚 sbit rst=P1^4; //定义DS1302复位引脚 sbit sclk=P1^2; //定义DS1302时钟引脚 sbit rs=P1^0; //定义LCD1602数据/命令选择引脚 sbit en=P1^1; //定义LCD1602使能端引脚 sbit moshi=P1^7; //定义模式键 sbit jia =P3^1; //定义按键加 sbit jian =P3^4; //定义按键减 sbit nz =P3^7; //定义闹钟键 sbit beep =P2^6; //定义蜂鸣器输出端 sbit DQ =P2^0; //定义DS18B20数据段 uchar code tab[10]={"0123456789"}; //定义0~9ASCLL码数组 uchar code tab_xingqi[7][3]={{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}}; //定义星期数组 uchar code tab_alarm[2][16]={{"alarm clock: OFF"},{"alarm clock: ON "}}; char second,minute,hour,date,month,year,day,key,shi,fen,num; //定义年月日时分秒数据变量 uint value; //定义数据变量(用于数据转换前暂时存贮) bit alarmclock,xianshiclock; bit s1,s2,s3,s4,s5,s6,s7,kai=1; void delay(uint z) //延时子程序 { uint x; uchar y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void delay1302(uint z) { for(z=z;z>0;z--); } void delay_18B20(unsigned int i) //DS18B20延时子延时 { while(i--); } //初始化函数 void Init_DS18B20(void) //DS18B20初始化 { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); } 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; delay_18B20(4); } return(dat); } void WriteOneChar(unsigned char dat) //写一个字节 { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } } //读取温度 ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay_18B20(100); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); b=ReadOneChar(); //传感器返回值除16得实际温度值 //为了得到2位小数位,先乘100,再除16,考虑整型数据长度, //技巧处理后先乘25,再除4,除4用右移实现 t = (b*256+a)*25; return( t >> 2 ); } void lcdcom (uchar com) //LCD1602写入地址 { rs=0; P0=com; delay(5); en=1; delay(5); en=0; delay(5); } void lcddata (uchar dat)//LCD1602写入数据 { rs=1; P0=dat; delay(5); en=1; delay(5); en=0; delay(5); } void lcddisplay(uchar a,uchar b) //LCD1602显示程序 { lcdcom(a); lcddata(b); } void lcdinit() //LCD1602初始化 { en=0; lcdcom(0x38); lcdcom(0x0c); lcdcom(0x06); lcdcom(0x01); } void write(uchar dat) //写数据 { uchar i; sclk=0; delay1302(1); for(i=0;i<8;i++) { io=dat&0x01; delay1302(1); sclk=1; //sclk上升沿接收数据有效 delay1302(1); sclk=0; delay1302(1); dat>>=1; } } void writeset(uchar cmd,uchar dat) //DS1302写入数据 { rst=0; delay1302(1); sclk=0; delay1302(1); rst=1; delay1302(1); write(cmd); write(dat); sclk=1; delay1302(1); rst=0; } unsigned char read() //读数据 { uchar i,dat; delay1302(1); for(i=0;i<8;i++) { dat>>=1; if(io==1) dat|=0x80; sclk=1; delay1302(1); sclk=0; delay1302(1); } return dat; } unsigned char readset(uchar cmd) //DS1302读出数据 { uchar dat; rst=0; delay1302(1); sclk=0; delay1302(1); rst=1; write(cmd); dat=read(); sclk=1; delay1302(1); rst=0; return dat; } void initDS1302() //DS1302初始化 { writeset(0x8E,0x00); writeset(0x80,((0/10)<<4|(0%10))); writeset(0x82,((0/10)<<4|(0%10))); writeset(0x84,((12/10)<<4|(12%10))); writeset(0x86,((1/10)<<4|(1%10))); writeset(0x88,((1/10)<<4|(1%10))); writeset(0x8c,((10/10)<<4|(10%10))); } void xianshi() //显示子程序 { uchar i; uint tmp; if(xianshiclock==0) { lcddisplay(0x80,'2'); //显示 2 lcddata('0'); //显示 0 value = readset(0x8d); //读取年 year=((value&0x70)>>4)*10 + (value&0x0F); //数据转换 if(s1==0) { lcddata(tab[year/10]); //显示年十位 lcddata(tab[year%10]); //显示年个位 } else { lcddata(' '); //显示空白实现闪烁 lcddata(' '); } lcddata('/'); //显示 / value = readset(0x89); //读取月 month=((value&0x70)>>4)*10 + (value&0x0F);//转换月 if(s2==0) { lcddata(tab[month/10]); //显示 月十位 lcddata(tab[month%10]); //显示 月个位 } else { lcddata(' '); //显示空白实现闪烁 lcddata(' '); } lcddata('/'); //显示 / value = readset(0x87); //读取日 date=((value&0x70)>>4)*10 + (value&0x0F); //转换日 if(s3==0) { lcddata(tab[date/10]); //显示 日十位 lcddata(tab[date%10]); //显示 日个位 } else { lcddata(' '); //显示空白实现闪烁 lcddata(' '); } value = readset(0x8b); //读取星期 day = value; //转换星期 lcdcom(0x8c); //写入要显示的地址 for(i=0;i<3;i++) { lcddata(tab_xingqi[day-1]);//显示星期 } value = readset(0x85); //读小时 hour=((value&0x70)>>4)*10 + (value&0x0F); //转换小时 lcdcom(0xc0); if(s4==0) { lcddata(tab[hour/10]); //显示小时十位 lcddata(tab[hour%10]); //显示小时个位 } else { lcddata(' '); //显示空白实现闪烁 lcddata(' '); } lcddata(':'); //显示 : value = readset(0x83); //读分钟 minute=((value&0x70)>>4)*10 + (value&0x0F);//转换分钟 if(s5==0) { lcddata(tab[minute/10]); //显示分钟十位 lcddata(tab[minute%10]); //显示分钟个位 } else { lcddata(' '); //显示空白实现闪烁 lcddata(' '); } lcddata(':'); //显示 : value = readset(0x81); //读取秒 second=((value&0x70)>>4)*10 + (value&0x0F); //转换秒 lcddata(tab[second/10]); //显示秒十位 lcddata(tab[second%10]); //显示秒个位 tmp=ReadTemperature(); //读取温度 lcdcom(0xca); //写入要现实的地址 lcddata(tab[tmp/1000%10]); lcddata(tab[tmp/100%10]); lcddata('.'); lcddata(tab[tmp/10%10]); lcddata(0xdf); lcddata('C'); //显示℃ } else { lcdcom(0x80); for(i=0;i<16;i++) { lcddata(tab_alarm[alarmclock]); //显示闹钟 } lcdcom(0xc6); if(s6==0) { lcddata(tab[shi/10]); lcddata(tab[shi%10]); } else { lcddata(' '); //显示空白实现闪烁 lcddata(' '); } lcddata(':'); if(s7==0) { lcddata(tab[fen/10]); lcddata(tab[fen%10]); } else { lcddata(' '); //显示空白实现闪烁 lcddata(' '); } } } void anjian() //按键检测程序 { if(moshi==0) //如果模式键按下 { delay(100); //延时消抖 key++; //再次按下加一,切换下一位 if(key>7) { key=0; //按够一圈返回 xianshiclock=0; //显示时钟 lcdcom(0x01); //清屏 s7=0; } switch(key) { case 1: ; break; case 2:s1=0; break; case 3:s2=0; break; case 4:s3=0; break; case 5:s4=0; break; case 6: lcdcom(0x01); xianshiclock=1; s5=0; break; case 7:xianshiclock=1; s6=0; break; } while(moshi==0) xianshi(); delay(100); } if(jia==0) { delay(100); switch(key) { case 1: year++; if(year>99) year=0; writeset(0x8c,((year/10)<<4|(year%10))); break; //年加一 case 2: month++; if(month>12) month=1; writeset(0x88,((month/10)<<4|(month%10))); break; //月加一 case 3: date++; if(date>31) date=1; writeset(0x86,((date/10)<<4|(date%10))); break; //日加一 case 4: hour++; if(hour>23) hour=0; writeset(0x84,((hour/10)<<4|(hour%10))); break; //小时加一 case 5: minute++; if(minute>59)minute=0; writeset(0x82,((minute/10)<<4|(minute%10))); break; //分加一 case 6: shi++; if(shi>23) shi=0; break; //闹钟小时加一 case 7: fen++; if(fen>59) fen=0; break; //闹钟分钟加一 } while(jia==0) xianshi(); delay(100); } if(jian==0) { delay(100); switch(key) { case 1: year--; if(year<0) year=0; writeset(0x8c,((year/10)<<4|(year%10))); break; //年减一 case 2: month--; if(month<1) month=12; writeset(0x88,((month/10)<<4|(month%10))); break; //月减一 case 3: date--; if(date<1) date=31; writeset(0x86,((date/10)<<4|(date%10))); break; //日减一 case 4: hour--; if(hour<0) hour=23; writeset(0x84,((hour/10)<<4|(hour%10))); break; //小时减一 case 5: minute--; if(minute<0)minute=59; writeset(0x82,((minute/10)<<4|(minute%10))); break; //分减一 case 6: shi--; if(shi<0) shi=23; break; //闹钟小时减一 case 7: fen--; if(fen<0) fen=59; break; //闹钟分钟减一 } while(jian==0) xianshi(); delay(100); } if(nz==0) { delay(100); xianshiclock=1; lcdcom(0x01); if((key==6)||(key==7)) { alarmclock=~alarmclock; lcdcom(0x01); } while(nz==0) xianshi(); if((key!=6)&&(key!=7))xianshiclock=0; lcdcom(0x01); delay(100); } } void spert() //蜂鸣器发声程序 { uchar i; for(i=200;i>0;i--) { beep=1; delay(1); beep=0; delay(1); } delay(500); for(i=200;i>0;i--) { beep=1; delay(1); beep=0; delay(1); } for(i=6;i>0;i--) { xianshi(); if(nz==0) kai=1; } } void naozhong() //闹钟程序 { if(fen!=minute) kai=1; if(kai==1) if(alarmclock==1) { if((shi==hour)&&(fen==minute)) //比较现在时间和闹钟时间是否一致 { kai=0; while(kai==0) { spert(); //发声 } delay(100); //延时消抖 while(nz==0) xianshi(); //松手检测 delay(100); //延时消抖 kai=0; //关闭闹钟等待下次触发 } } } void main() { lcdinit(); //LCD1602初始化 TMOD=0X01; //配置定时器模式 ET0=1; //开启定时器1 EA=1; //开启总中断 TR0=1; //开始计时 beep=0; //关闭蜂鸣器 if(jia==0) initDS1302();//DS1302初始化 while(1) { xianshi(); //显示 anjian(); //检测按键 naozhong(); //检测闹钟 } } void timer0() interrupt 1 //定时器0 中断函数 { TH0=0; TL0=0; num++; if(num==8) //闪烁时间 { num=0; switch(key) //根据KEY的值来选择哪一位闪烁(调节时候) { case 1: s1=~s1; break; case 2: s2=~s2; break; case 3: s3=~s3; break; case 4: s4=~s4; break; case 5: s5=~s5; break; case 6: s6=~s6; break; case 7: s7=~s7; break; } } } |
8楼2013-06-06 16:28:59
9楼2013-06-06 16:29:39
10楼2013-06-06 17:06:40














回复此楼