数字时钟55221.doc_第1页
数字时钟55221.doc_第2页
数字时钟55221.doc_第3页
数字时钟55221.doc_第4页
数字时钟55221.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机软件实现数码时钟,可以用proteus7.12仿真,也可以,做成实物后18B20会读取出错,或者给我发邮件给你一份实物能用的(proteus7.12仿真18B20会读取出错),电路图不清晰处理方法,将电路图另存为图片格式,或者直接放大即可。/liuxiaowei2mcuemail:#include #include#define uint unsigned int#define uchar unsigned charuchar hour,min,sec,sec1=0;/时钟函数uint time_ms=0;uchar time_sec=0,time_min=34,time_hour=9;uchar move=1;/调整位位移bit f0=0,f1=0,f2=0; /f1 键set按下uchar d7,d6,d5,d4,d3,d2,d1,d0;uchar key_press;uint temp;uchar tempreadbyte(void);/uint get_temp();float f_temp;bit tempreadbit(void);sbit DataPortDS1820=P35; /温度传感器信号线void tempwritebyte(uchar dat);void tempchange(void);void get_temp();void conv();void delay(uint z);void itnt();void itnttime();void key_input();void key_account();void set();/调整子程序void adj();/调整子程序void disp_temperature();void time_count(); /软件实现时间计算void Delay15us(void);void Delay10us(void);bit RstDS1820(void);void WriteDS1820(unsigned char ch);void Delay1us(unsigned char us);unsigned char ReadDS1820(void);void SkipROMCode(void);void StartADC(void) ;unsigned int GetTempValue(void);void itnt_18B20(void);void main() itnt(); while(1) key_account(); void itnt()/寄存器初始化 TMOD = 0x11; TH0 = (65536-2700)/256; TL0 = (65536-2700)%256; TH1 = (65536-54000)/256; TL1 = (65536-54000)%256; TR1 = 1; ET1 = 1; ET0 = 1; TR0 = 1; EA = 1;void delay (uint z) uint x,y; for (x=z;x0;x-) for(y=110;y0;y-) ; void key_account() key_input(); if (key_press=0x0e) delay(100); key_input(); if(key_press=0x0e) f1=1; while(key_press=0x0e) key_input(); set(); move=1; if (key_press=0x07) delay(200); key_input(); if(key_press=0x07) while(key_press=0x07) key_input(); f0=1; while(f0) key_input(); disp_temperature(); if (key_press=0x07) delay(200); key_input(); if(key_press=0x07) while(key_press=0x07) key_input(); f0=0; void key_input() key_press=P1; key_press=key_press&0x0f; if(key_press!=0x0f) sec1=0; void set()/调整子程序 while(f1) / conv(); key_input(); switch(key_press) case 0x0e: /S1 if(key_press=0x0e) delay(100); key_input(); if(key_press=0x0e) while(key_press=0x0e) key_input(); f1=0; if (hour=24) hour=0; time_hour=0; break; case 0x0d:/s2 if(key_press=0x0d) delay(100); key_input(); while(key_press=0x0d) key_input(); move+; if(move4) move=1; break; case 0x0b:/s3 if(key_press=0x0b) delay(100); key_input(); while(key_press=0x0b) key_input(); move-; if(move=10) ge = 0; min = shi*10+ge; break; case 2: ge = min%10; shi = min/10%10+1; if (shi=6) shi = 0; min = shi*10+ge; break; case 3: ge = hour%10+1; shi = hour/10%10; if (shi=2) if (ge=4) ge=0; if (ge=10) ge = 0; hour = shi*10+ge; break; case 4: ge = hour%10; shi = hour/10%10+1; if (shi=3) shi = 0; hour = shi*10+ge; break; /*/* 中断显示 */unsigned char code table = /段选 0x3F,0x06,0x5B,0x4F,/0,1,2,3 0x66,0x6D,0x7D,0x07,/4,5,6,7 0x7F,0x6F,0x77,0x7C,/8,9,a,b 0x39,0x5E,0x40,0x00;/c,d,-,关unsigned char code table1 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/位选(从低到高)unsigned int coruscate,wei,dot;unsigned char d07,d06,d05,d04,d03,d02,d01,d00;void conv() uint t;TR0 =0; if(f0=0) d0 =tablesec%10; d1 =tablesec/10%10; d2 =table14; d3 =tablemin%10; d4 =tablemin/10%10; d5 =table14; d6 =tablehour%10; d7 =tablehour/10%10; else t = temp; d0 =0x39; d1 =0x63; d2 =tablet%10; d3 =tablet/10%10|0x80; if (f2=0) if (t100) d4 = 0; else d4 =tablet/100%10; if (t1000) d5 = 0; else d5 =tablet/1000%10; else if (t=100) coruscate=0; if(coruscate8) wei=1; switch(wei) case 1: P0=0; P2=table10; P0=d00; break; case 2: P0=0; P2=table11; P0=d01; break; case 3: P0=0; P2=table12; P0=d02; break; case 4: P0=0; P2=table13; P0=d03; break; case 5: P0=0; P2=table14; P0=d04; break; case 6: P0=0; P2=table15; P0=d05; break; case 7: P0=0; P2=table16; P0=d06; break; case 8: P0=0; P2=table17; P0=d07; break; /*/*软件实现时间计算*/*/void t1(void) interrupt 3 TH1 = (65536-54000)/256; TL1 = (65536-54000)%256; time_ms+; if(time_ms=20) time_ms=0; if(f1=0) time_sec+; if(time_sec=60) time_sec=0; time_min+; if(time_min%10=0|time_min%10=5) f0=1;sec1=0; if(time_min=60) time_min=0; time_hour+; if(time_hour=24) time_hour=0; sec=time_sec; min=time_min; hour=time_hour; if(f1=1) time_sec=0; sec=0; time_min=min; time_hour=hour; if(f1=1) sec1+; if(sec1=10) /按键无响应退出设置时间调整 f1=0; if(f0=1) sec1+; if(sec1=5) /按键无响应退出设置时间调整 f0=0; /*/*18B20相关程序*/*/void disp_temperature() uint i; delay(100); while(i0)i-; temp=GetTempValue(); /读取温度值 void Delay15us(void) Delay1us(15);void Delay10us(void) Delay1us(10);bit RstDS1820(void) /返回0-有设备连接1-无设备连接unsigned char i;bit RstFlag; RstFlag=1; DataPortDS1820=0; for (i=0;i100/*40*/;i+) /480us Delay15us(); DataPortDS1820=1; for (i=0;i4;i+) /15us-60us Delay15us(); for (i=0;i16;i+) /60us-240us Delay15us(); if (DataPortDS1820=0) RstFlag=0; for (i=0;i16;i+) /240us Delay15us(); return RstFlag; void WriteDS1820(unsigned char ch)unsigned char i; DataPortDS1820=1; Delay1us(1); for (i=0;i1; Delay1us(1); void Delay1us(unsigned char us) while (us) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); -us; unsigned char ReadDS1820(void)unsigned char i,ch; ch=0; DataPortDS1820=1; Delay1us(1); for (i=0;i1; if (DataPortDS1820=1) ch=ch+0x80; EA=1; Delay15us();Delay15us();Delay15us(); return ch;void SkipROMCode(void) RstDS1820(); WriteDS1820(0xcc); void StartADC(void) RstDS1820(); /复位 Write

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论