博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【单片机】时钟及温度的显示
阅读量:5873 次
发布时间:2019-06-19

本文共 10526 字,大约阅读时间需要 35 分钟。

回头看我所写的文章,基本都是软件方面的,是个典型的“欺软怕硬”的人。然而,在最开始的时候,我学习的是硬件。在前面文章《》一文中写道,我在大一暑假的时候开始了单片机的学习,在大二、大三期间做过些小东西。刚进入程序员的领域的时候,显然是单片机带我入了门。下面我将写写用单片机做过的一些东西,权当纪念。


本文介绍我大一暑假学完单片机后,在大二上学期为参加学校星火杯而完成的作品(最终没有参加比赛)。这个电子制作是关于用单片机显示时间的作品,其功能就用单片机控制LCD、LED来显示时间和温度。


功能描述

  • 显示精确度为0.1摄氏度的温度(低于0摄氏度和高于100摄氏度响铃)
  • 液晶时钟,断电后仍然继续走动,每月误差不到一分钟,无电源可工作10年左右,区分平年和闰年;
  • 指针式时钟(黄灯为时针,红色为分针,最小误差5分钟,整点报时)与考试计时器(计时2两小时)

电子元器件

  • 2个单片机最小系统 (单片机型号为STC89C52)
  • 双色发光二级管
  • 液晶显示屏
  • 按键
  • DS12C887时钟芯片
  • DS18b20温度传感器
  • 蜂鸣器(整点报时)
  • LED数码管(显示温度)

作品展示图

  • 由于所有电路都是由杜邦线连接,所以存在接触不良,导致有时不能正常显示,于是就没有参赛,下图为双色二极管的显示。
    这里写图片描述
    这里写图片描述
  • 下图为用1602液晶显示日期和时间
    这里写图片描述
    这里写图片描述
  • 下图为用数码管来显示温度
    这里写图片描述
  • 下图为作品的布线,简直是乱成一团,要是用PCB就好了。
    这里写图片描述

原文:

作者:nineheadedbird

附录:代码实现

对于硬件来说,给代码不给管脚图没啥意义,不过由于年代久远,我已经找不到当初设计的电路图了。但仍然给出代码图,希望能起到一点点的参考作用。

//--------------------------------温度显示程序 第一个芯片------------------------------------------------------------------//#include
#include
#include
#define uchar unsigned char #define uint unsigned intsbit ds=P2^2;unsigned int te;unsigned char code tabledu[]={ 0x3f0x060x5b0x4f0x660x6d0x7d0x07 0x7f0x6f0x770x7c0x390x5e0x790x71};unsigned char code tabledu1[]={ 0xbf0x860xdb0xcf0xe60xed0xfd0x87 0xff0xef0xf70xfc0x390x5e0x790x71};unsigned char code tablewe[]={0xfe0xfd0xfb0xf70xef0xdf};void delayxms(unsigned int x){unsigned int ij; for(i=x;i>0;i--)for(j=110;j>0;j--);}void delayx2us(unsigned char t){ while(--t);}void dsreset() // 复位{ds=1;_nop_();ds=0;delayx2us(200);//注意时间ds=1;delayx2us(20);}void writetemp(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){ds = 0;ds = dat&0x01;delayx2us(25);ds = 1;dat>>=1;}delayx2us(25);}unsigned char readtemp(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ds = 0; // 给脉冲信号dat>>=1;ds = 1; // 给脉冲信号if(ds)dat|=0x80;delayx2us(25);}return(dat);}uint temp(){uint ab;dsreset();delayxms(1);writetemp(0xcc);writetemp(0x44);delayxms(1);dsreset();delayxms(1);writetemp(0xcc);writetemp(0xbe);delayx2us(50);a=readtemp();b=readtemp();a=a*10;te=b*160+a/16;return te;}void disp(long int num){uchar cde;c=num/100;d=num%100/10;e=num%10;P0=tabledu[c];P1=0xfe;delayxms(6);P0=tabledu1[d];P1=0xfd;delayxms(6);P0=tabledu[e];P1=0xfb;delayxms(6);P0=0xcc;P1=0xf7;delayxms(2);}void main(){while(1){disp(temp());if((temp()>=1000)||(temp()<=0))beep=0;elsebeep=1;}//--------------------------------时钟显示程序 第二个芯片------------------------------------------------------------------//#include
#define uchar unsigned char #define uint unsigned int//流水灯锁存器sbit wela1=P2^0;//1sbit wela2=P2^1;//2sbit wela3=P2^2;//1sbit wela4=P2^3;//2//蜂鸣器sbit beep=P2^4;//按键sbit key1=P2^5;//功能选择键sbit key2=P2^6;//+(时间、日期加)sbit key3=P2^7;//-(时间、日期减)sbit key4=P3^7;//模式键(平时或考试)//液晶接口sbit lcden=P3^4;sbit lcdrs=P3^5;sbit lcdwr=P3^6;//ds12c887接口sbit dscs=P1^6;sbit dsas=P1^7;sbit dsrw=P3^0;sbit dsds=P3^1;sbit dsirq=P3^3;//定义变量uchar hour minseccountriweekyuenianj;//uchar counthcountmcountycountkloop1;uchar code table1[]=" - - ";uchar code table2[]=" : : ";uchar code table3[]="SUNMONTUEWEDTHUFRISAT";//延迟函数void delayxms(unsigned int x) {unsigned int ij; for(i=x;i>0;i--)for(j=110;j>0;j--);}//--------------------1602液晶函数----------------------------------//液晶写命令void write_com(unsigned char com) {lcdrs=0;P0=com;delayxms(5);lcden=1;delayxms(5); lcden=0;}//液晶写数据void write_data(unsigned char date){lcdrs=1;P0=date;delayxms(5); lcden=1;delayxms(5);lcden=0;}//液晶初始化void lcdinit(){lcdwr=0;write_com(0x38);write_com(0x0c);write_com(0x06); write_com(0x01);}// 液晶显示void disp() {uchar i;write_com(0x80);for(i=0;i<15;i++){write_data(table1[i]);delayxms(5);}write_com(0x80+0x40);for(i=0;i<12;i++){write_data(table2[i]);delayxms(5);}}//写时间void write_sfm(uchar addressuchar shu) {uchar shige;shi=shu/10;ge=shu%10;write_com(0x80+0x40+address);write_data(0x30+shi);write_data(0x30+ge);}//写日历void write_calendar(uchar addressuchar shu) {uchar shige;shi=shu/10;ge=shu%10;write_com(0x80+address);write_data(0x30+shi);write_data(0x30+ge);}//-------------------------DS12C887程序----------------------------//写时钟void write_ds(uchar adduchar date){dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}//读时钟uchar read_ds(uchar add){uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}//写星期void write_week(uchar date){write_com(0x80+12);write_data(table3[3*date]);write_data(table3[3*date+1]);write_data(table3[3*date+2]);}//键盘检测void keyscan() //键盘检测 key1 为功能键 key2为加 key3为减 :时间与日期的改变{if(key1==0){delayxms(10);if(key1==0){while(!key1);count++;if(count==1){write_com(0x80+0x40+11);write_com(0x0f);}if(count==2){write_com(0x80+0x40+8);write_com(0x0f);}if(count==3){write_com(0x80+0x40+5);write_com(0x0f);}if(count==4){write_com(0x80+13);write_com(0x0f);}if(count==7){write_com(0x80+10);write_com(0x0f);}if(count==6){write_com(0x80+7);write_com(0x0f);}if(count==5){write_com(0x80+4);write_com(0x0f);}if(count==8){count=0;write_com(0x0c);write_ds(0sec);write_ds(2min);write_ds(4hour);}}}if(key2==0){delayxms(10);if(key2==0){while(!key2);if(count==1){sec++;if(sec==60)sec=0;write_ds(0sec);write_sfm(10sec);write_com(0x80+0x40+11);}if(count==2){min++;if(min==60)min=0;write_ds(2min);write_sfm(7min);write_com(0x80+0x40+8);}if(count==3){hour++;if(hour==24)hour=0;write_ds(4hour);write_sfm(4hour);write_com(0x80+0x40+5);}if(count==4){week++;if(week==7)week=0;write_week(week);write_ds(6week);}if(count==5){nian++;if(nian==100)nian=0;write_ds(9nian);write_calendar(3nian);write_com(0x80+4);}if(count==6){yue++;if(yue==13)yue=1;write_ds(8yue);write_calendar(6yue);write_com(0x80+7);}if(count==7) // 判断闰年{ri++;week++;if(nian%4==0){if((yue==4)||(yue==6)||(yue==9)||(yue==11)){if(ri==31)ri=1;}else if(yue==2){if(ri==30)ri=1;}else{if(ri==32)ri=1;}}if(nian%4!=0){if((yue==4)||(yue==6)||(yue==9)||(yue==11)){if(ri==31)ri=1;}else if(yue==2){if(ri>=29)ri=1;}else{if(ri==32)ri=1;}}write_ds(7ri);write_calendar(9ri);write_com(0x80+10);delayxms(2);if(week==7) week=0;write_week(week);write_ds(6week);}}}if(key3==0){delayxms(10);if(key3==0){while(!key3);if(count==1){if(sec==0)sec=59;elsesec--;write_ds(0sec);write_sfm(10sec);write_com(0x80+0x40+11);}if(count==2){if(min==0)min=59;elsemin--;write_ds(2min);write_sfm(7min);write_com(0x80+0x40+8);}if(count==3){if(hour==0)hour=23;elsehour--;write_ds(4hour);write_sfm(4hour);write_com(0x80+0x40+5);}if(count==5){if(nian==0)nian=99;elsenian--;write_ds(9nian);write_calendar(3nian);write_com(0x80+4);}if(count==6){if(yue==1)yue=12;elseyue--;write_ds(8yue);write_calendar(6yue);write_com(0x80+7);}if(count==7) // 判断闰年{ri--;week--;if(nian%4==0){if((yue==4)||(yue==6)||(yue==9)||(yue==11)){if(ri==0)ri=30;}else if(yue==2){if(ri==0)ri=29;}else{if(ri==0)ri=31;}}if(nian%4!=0){if((yue==4)||(yue==6)||(yue==9)||(yue==11)){if(ri==0)ri=30;}else if(yue==2){if(ri==0)ri=28;}else{if(ri==0)ri=31;}}write_ds(7ri);write_calendar(9ri);write_com(0x80+10);delayxms(2);if(week==-1) week=7;write_week(week);write_ds(6week);}}}}//----------------初始化---------------------------------//void init(){lcdinit();disp();week=0;nian=11;yue=9;ri=1;}//---------------------------流水灯-----------------------------------//void lampinit(){P1=0xff;wela1=1;wela2=1;wela3=1;wela3=1;wela1=0;wela2=0;wela3=0;wela4=0;}//----------------时钟用黄灯显示程序-------------------------------//void clock(){if((hour==1)&&(hour==13)){P1=0xfd;wela3=1;wela3=0;}if((hour==2)&&(hour==14)){P1=0xfb;wela3=1;wela3=0;}if((hour==3)&&(hour==15)){P1=0xf7;wela3=1;wela3=0;}if((hour==4)&&(hour==16)){P1=0xef;wela3=1;wela3=0;}if((hour==5)&&(hour==17)){P1=0xdf;wela3=1;wela3=0;}if((hour==6)&&(hour==18)){P1=0xfe;wela4=1;wela4=0;}if((hour==7)&&(hour==19)){P1=0xfd;wela4=1;wela4=0;}if((hour==8)&&(hour==20)){P1=0xfb;wela4=1;wela4=0;}if((hour==9)&&(hour=21)){P1=0xf7;wela4=1;wela4=0;}if((hour==10)&&(hour==22)){P1=0xef;wela4=1;wela4=0;}if((hour==11)&&(hour==23)){P1=0xdf;wela4=1;wela4=0;}if((hour==12)&&(hour==0)){P1=0xfe;wela3=1;wela3=0;}if(min<5){if((hour!=12)&&(hour!=24)){P1=0xfe;wela1=1;wela1=0;}}//----------------分钟用红灯显示------------------------//if((min>=5)&&(min<10)){if((hour!=13)&&(hour!=1)){P1=0xfd;wela1=1;wela1=0;}}if((min>=10)&&(min<15)){if((hour!=14)&&(hour!=2)){P1=0xfb;wela1=1;wela1=0;}}if((min>=15)&&(min<20)){if((hour!=15)&&(hour!=3)){P1=0xf7;wela1=1;wela1=0;}}if((min>=20)&&(min<25)){if((hour!=16)&&(hour!=4)){P1=0xef;wela1=1;wela1=0;}}if((min>=25)&&(min<30)){if((hour!=17)&&(hour!=5)){P1=0xdf;wela1=1;wela1=0;}}if((min>=30)&&(min<35)){if((hour!=18)&&(hour!=6)){P1=0xfe;wela2=1;wela2=0;}}if((min>=35)&&(min<40)){if((hour!=19)&&(hour!=7)){P1=0xfd;wela2=1;wela2=0;}}if((min>=40)&&(min<45)){if((hour!=20)&&(hour!=8)){P1=0xfb;wela2=1;wela2=0;}}if((min>=45)&&(min<50)){if((hour!=21)&&(hour!=9)){P1=0xf7;wela2=1;wela2=0;}}if((min>=50)&&(min<55)){if((hour!=22)&&(hour!=10)){P1=0xef;wela2=1;wela2=0;}}if(min>=55){if((hour!=23)&&(hour!=11)){P1=0xdf;wela2=1;wela2=0;}}}//---------------考试倒计时模式-----------------------//void test(){uchar hour1min1min2shi;hour1=hour+2;if(hour==24)hour1=0;if(hour==25)hour1=1;min1=min+20;if(min1>=60){min1=min1-60;hour1=hour1+1;if(hour1==24)hour1=0;}shi=min1/10;min1=shi*10;if((min==min1)&&(sec==0)){min2=min+5;if(min2==60)min2=0;P1=0xfe;wela3=1;wela3=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xfc;wela1=1;wela1=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xf8;wela1=1;wela1=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xf0;wela1=1;wela1=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xe0;wela1=1;wela1=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xc0;wela1=1;wela1=0;}//-------------------------------------------------//if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xfe;wela2=1;wela2=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xfc;wela2=1;wela2=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xf8;wela2=1;wela2=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xf0;wela2=1;wela2=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xe0;wela2=1;wela2=0;}if(min==min2){min2=min+5;if(min2==60)min2=0;P1=0xc0;wela2=1;wela2=0;}//----------------------时间到后开始响铃------------------------------------------//if(min==min2){P1=0;wela1=1;wela1=0;beep=0;delayxms(1000);beep=1;delayxms(1000);beep=0;delayxms(1000);beep=1;beep=0;delayxms(1000);beep=1;delayxms(1000);beep=0;delayxms(6000);delayxms(6000);beep=1;lampinit();}}//-----------------主函数--------------------------------------//void main(){init();while(1){keyscan();if(count==0){sec=read_ds(0);min=read_ds(2);hour=read_ds(4);week=read_ds(6);nian=read_ds(9);yue=read_ds(8);ri=read_ds(7);write_sfm(10sec);write_sfm(7min);write_sfm(4hour);write_week(week);write_calendar(3nian);write_calendar(6yue);write_calendar(9ri);write_calendar(120);}}}
你可能感兴趣的文章
Scrum实施日记 - 一切从零开始
查看>>
关于存储过程实例
查看>>
配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
查看>>
AIX 7.1 install python
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
福利丨所有AI安全的讲座里,这可能是最实用的一场
查看>>
开发完第一版前端性能监控系统后的总结(无代码)
查看>>
Python多版本情况下四种快速进入交互式命令行的操作技巧
查看>>
MySQL查询优化
查看>>
【Redis源码分析】如何在Redis中查找大key
查看>>
关于链接文件的探讨
查看>>
android app启动过程(转)
查看>>
Linux—源码包安装
查看>>
JDK8中ArrayList的工作原理剖析
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Applet
查看>>
高并发环境下,Redisson实现redis分布式锁
查看>>