单片机设计_万年历(AT89C51 LCD12864、DS18B20、DS1302)

单片机万年历(LCD12864、DS18B20、DS1302)

想要更多项目私wo!!!

一、简介

此电路由AT89C51最小电路板和LCD12864显示模块、DS18B20温度模块、DS1302时钟模块组成。
主要的功能是:显示实时的时间和当前的温度。

二、运行效果

在这里插入图片描述

三、部分代码

/*想要更多项目私wo!!!*/
#include <reg51.h>
#include <DS18B20.H>
#include <DS1302.H>
#include <LCD12864.H>

unsigned char j[8];
sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit KEY3=P3^4;
sbit LED1=P3^5;
sbit LED2=P3^6;
sbit LED3=P3^7;

uchar time0_count; 	//time0¼ÆÊýÆ÷

void delay10(void)
{
	unsigned char i,j;
	for(i=0;i<255;i++)
	for(j=0;j<200;j++);
}

unsigned char conver(unsigned char a,unsigned char b,unsigned char c)
{	
 
	if((a&0x0f)==0x0a) a=a+6;
  	if(a==b)  a=c;
	return a;
}

main() 
{	
		bit flag_2=1;
		bit flag_3=1;
		bit flag_4=1;
		int i;		 
		char a;	   
		unsigned  char  choose=0x01;

		InitLCD();	  //³õʼ»¯LCD12864

		for(i=0;i<13;i++)
		{
			ShowNumber(6,i*8+16,i+14);
		}

		Show32x32(0,0,0);
		ShowChina(4,0,7);
		ShowChina(4,16,8);
		ShowChina(4,32,9);
		ShowChina(4,48,10);
		ShowNumber(4,64,10);	  //ÏÔʾζȸßλ
		read_serial(j);			  //¶ÁÈ¡DS1302µÄʱ¼ä

	  ShowNumber(2,32,j[2]>>4&0x03);
		ShowNumber(2,40, j[2]&0x0f);
		ShowChina(2,48,3);
		ShowNumber(2,64,j[1]>>4&0x07);
		ShowNumber(2,72, j[1]&0x0f);
		ShowChina(2,80,4);
		ShowNumber(2,96,j[0]>>4&0x07);
		ShowNumber(2,104, j[0]&0x0f);
		ShowChina(2,112,5);


	  ShowNumber(0,32,j[6]>>4&0x0f);
		ShowNumber(0,40, j[6]&0x0f);
		ShowChina(0,48,0);
		ShowNumber(0,64,j[4]>>4&0x01);
		ShowNumber(0,72, j[4]&0x0f);
		ShowChina(0,80,1);
		ShowNumber(0,96,j[3]>>4&0x03);
		ShowNumber(0,104, j[3]&0x0f);
		ShowChina(0,112,2);

		ShowChina(4,104,6); 
		ShowNumber(4,120,j[5]-1&0x07);
	
		while(1)
		{
			
				if(flag_2==1)
				read_serial(j);			  			//¶ÁÈ¡DS1302µÄʱ¼ä
				else 
				write_date_time(j);

				a=Read_Temperature();	  		//¶ÁÈ¡DS18B20µÄζÈ
				if(a<0)					  					//´¦ÀíζÈÕý¸º
				{	
						a = (-1)*a; 						// È¡²¹
						ShowNumber(4,72,11);	  //ÏÔʾζÈÕý¸º
				}
				else 
				{ 
						ShowNumber(4,72,12);	  //ÏÔʾζÈÕý¸º
				}
				ShowNumber(4,80,a/100);	  	//ÏÔʾζȸßλ
				ShowNumber(4,88,a/10%10);  //ÏÔʾζÈÖÐλ
				ShowNumber(4,96,a%10);	   	//ÏÔʾζȵÍλ

				LED3=1;LED2=0;LED1=1;
				if(a>40){LED3=0;LED2=1;LED1=1;}
				if(a<30){LED3=1;LED2=1;LED1=0;}

				if(KEY1==0)				  //°´¼ü1--´¦ÀíÉ趨ʱ¼äºÍ·µ»Ø
				{
					delay10();
					if(KEY1==1)
					{
						delay10();
						flag_2=~flag_2;	
					}
				}

				if(KEY2==0)				  //°´¼ü2--´¦ÀíÑ¡ÔñÉ趨ʱ¼äµÄÏîÄ¿
				{ 
					delay10();
					if(KEY2==1)
					{
						delay10();
						choose++;
						if(choose==8)
						choose=0x01;
					}	
				}

				if(KEY3==0)				  //°´¼ü3--´¦ÀíÉ趨ʱ¼äºÍ·µ»Ø
				{	delay10();
					if(KEY3==1)
					{
						delay10(); 
						switch(choose)
						{
							case 1:	j[6]++; j[6]=conver(j[6],0xa0,0x00);break;//Äê
							case 2:	j[5]++; j[5]=conver(j[5],0x07,0x00);break;//ÖÜ
							case 3:	j[4]++;	j[4]=conver(j[4],0x13,0x01);break;//ÔÂ
							case 4:	j[3]++;	j[3]=conver(j[3],0x32,0x01);break;//ÈÕ
							case 5:	j[2]++;	j[2]=conver(j[2],0x24,0x00);break;//ʱ
							case 6:	j[1]++;	j[1]=conver(j[1],0x60,0x00);break;//·Ö
							case 7:	j[0]++;	j[0]=conver(j[0],0x60,0x00);break;//Ãë
						}
					}	
				}

				if(flag_2==1)
					read_serial(j);			  //¶ÁÈ¡DS1302µÄʱ¼ä
				else 
					write_date_time(j);

		
				//ʱ·ÖÃë
				ShowNumber(2,32,j[2]>>4&0x03);
				ShowNumber(2,40, j[2]&0x0f);
				ShowChina(2,48,3);
				ShowNumber(2,64,j[1]>>4&0x07);
				ShowNumber(2,72, j[1]&0x0f);
				ShowChina(2,80,4);
				ShowNumber(2,96,j[0]>>4&0x07);
				ShowNumber(2,104, j[0]&0x0f);
				ShowChina(2,112,5);

				// ÄêÔÂÈÕ
				ShowNumber(0,32,j[6]>>4&0x0f);
				ShowNumber(0,40, j[6]&0x0f);
				ShowChina(0,48,0);
				ShowNumber(0,64,j[4]>>4&0x01);
				ShowNumber(0,72, j[4]&0x0f);
				ShowChina(0,80,1);
				ShowNumber(0,96,j[3]>>4&0x03);
				ShowNumber(0,104, j[3]&0x0f);
				ShowChina(0,112,2);
				ShowChina(4,104,6); 
				ShowNumber(4,120,j[5]-1&0x07);

		}
}


  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
AT89C51是一种基于MCS-51架构的8位微控制器,DS18B20是一种数字温度传感器。将它们结合起来可以实现温度检测系统。具体实现步骤如下: 1. 硬件连接:将DS18B20的数据线连接到AT89C51的P3.7引脚,VDD连接到5V电源,GND连接到地。 2. 软件编写:使用Keil C编写程序,通过AT89C51的P3.7引脚读取DS18B20的温度数据,并将其显示在数码管上。 3. 程序调试:使用Proteus进行仿真,检查程序是否能够正确读取DS18B20的温度数据并将其显示在数码管上。 以下是AT89C51+DS18B20的示例代码: ```c #include <reg51.h> #include <intrins.h> #define DQ P3_7 typedef unsigned char uchar; typedef unsigned int uint; uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; void delay(uint i) { while (i--); } uchar ds18b20_init() { uchar i; DQ = 1; _nop_(); _nop_(); DQ = 0; delay(600); DQ = 1; delay(60); i = DQ; delay(540); return i; } void ds18b20_write_byte(uchar dat) { uchar i, j; for (i = 0; i < 8; i++) { j = dat >> i; j &= 0x01; DQ = 0; _nop_(); _nop_(); DQ = j; delay(6); DQ = 1; if (i == 7) delay(10); } } uchar ds18b20_read_byte() { uchar i, j, dat = 0; for (i = 0; i < 8; i++) { DQ = 0; _nop_(); _nop_(); DQ = 1; _nop_(); _nop_(); j = DQ; delay(4); dat |= (j << i); } return dat; } void display(uchar dat) { P0 = table[dat / 10]; P2 = 0xfe; delay(5); P2 = 0xff; P0 = table[dat % 10]; P2 = 0xfd; delay(5); P2 = 0xff; } void main() { uchar temp, temp1, temp2; ds18b20_init(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0x44); ds18b20_init(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0xbe); temp1 = ds18b20_read_byte(); temp2 = ds18b20_read_byte(); temp = (temp2 << 4) | (temp1 >> 4); display(temp); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值