⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ninbo.c

📁 这是一个电子钟和温度计的程序
💻 C
字号:
/*本程序由陈永飞同志开发,信箱:baiyni888@163.com  QQ:49204743
地址:江苏省仪征市新集镇凌东村	电话:13584016200
晶振用12MHz,数码管用共阳的*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include"DS1302.h"
#include"DS18B20.h"
#define sec 0x80
#define min 0x82
#define hou 0x84
#define read 0x01
unsigned char hour,minute,second,id=0,timecount,re_disp=0,p,n0,n1;
bit flag;
#define leddata P0	//定义数码管的段选
sbit ssw=P2^7;		//小时十位
sbit sw=P2^6;		//小时个位
sbit sfw=P2^5;		//分十位
sbit fw=P2^4;		//分个位
sbit wdsw=P2^3;		//温度十位
sbit wdgw=P2^2;		//温度个位
sbit DOWN=P2^1;		//加按键
sbit UP=P2^0;		//减按键
//sbit DQ=P3^0;		//DS18B20信号端
//sbit T_CLK=P3^1;	//DS1302的时钟端
//sbit T_IO=P3^2;	//DS1302的数据端
//sbit T_RES=P3^3;	//DS1302的复位端
sbit SET=P3^4;		//时间设定键

unsigned int ok;
unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60};
unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04};
//                          秒  分钟 小时  日   月   年  星期

void Set_id(unsigned char sel,unsigned char sel_1);

void delays(unsigned char k)
{
	unsigned char i,j;
	for(i=0;i<k;i++)
		for(j=0;j<50;j++);
}

void display(void)
{
	if(flag&hour)		//为真时是设定时间
		{
			ssw=0;leddata=0xff;delays(10);ssw=1;
			sw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sw=1;
		}
	else			//为假时为正常走时
		{
			leddata=tab[Read1302(hou+1)/16];ssw=0;delays(10);ssw=1;
			leddata=tab[Read1302(hou+1)%16]&~((unsigned char)~flag<<6);sw=0;delays(10);sw=1;
		}
	if(flag&minute)
		{
			sfw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sfw=1;
			fw=0;leddata=0xff;delays(10);fw=1;
		}
	else
		{
			leddata=tab[Read1302(min+1)/16]&~((unsigned char)~flag<<6);sfw=0;delays(10);sfw=1;
			leddata=tab[Read1302(min+1)%16];fw=0;delays(10);fw=1;
		}
 TR0=0;		//关定时器
 ok=Read_Temperature();		//调用读温度函数
 TR0=1;		//开定时器
 p=(unsigned char)(ok>>4);	//温度数据转换
 wdsw=0;leddata=tab[p%100/10];delays(10);wdsw=1;	//温度显示十位
 wdgw=0;leddata=tab[p%10];delays(10);wdgw=1;		//温度显示个位
}

void id_case1_key(void)		//按键加减子程序
{
	display();
  	if (!DOWN) //减少
      	{
       		while(!DOWN)display();
			re_disp=0;
	   		Set_id(id,0);    
      	}
   	if (!UP)  //增加
      	{
       		while(!UP)display();
			re_disp=0;
	   		Set_id(id,1);    
      	}
}

void Scan_Key(void)		//按键扫描程序
{
	display();
	if(!SET)
		{
			while(!SET)display();
			re_disp=0;
			id++;if(id>2)id=0;
		}
	if(id==0){hour=0;minute=0;second=0;}
	if(id==1){hour=1;id_case1_key();}
	if(id==2){hour=0;minute=1;id_case1_key();}
//	if(id==3){minute=0;second=1;id_case1_key();}
}



//根据选择调整相应项目并写入DS1302
void Set_id(unsigned char sel,unsigned char sel_1) 
{
  	signed char max,mini,address,item;
	if(sel==1)  {address=hou; max=23;mini=0;}    //小时
	if(sel==2)  {address=min; max=59;mini=0;}    //分钟
  //	if(sel==3)  {address=sec; max=0;mini=0;}     //秒
  	item=Read1302(address+1)/16*10+Read1302(address+1)%16;
  	if (sel_1==0) item--;  else item++;
 	if(item>max) item=mini;   
  	if(item<mini) item=max;
	Write1302(0x8e,0x00);//允许写操作
  	Write1302(address,item/10*16+item%10);
  	Write1302(0x8e,0x80);//写保护,禁止写操作  
}

void main()
{		TMOD=0x01;
  		TH0=(65535-50000)/256;
  		TL0=(65535-50000)%256;
  		EA=1;
  		ET0=1;
		TR0=1; 
		Write1302(0x90,0xa5);//打开充电二级管  一个二级管串联一个2K电阻 
 		Write1302(0x8e,0x80);//写保护,禁止写操作 
		if(!UP&!DOWN)Set1302(inittime);
		adjust_res(0x7f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125; 0x7f:0.0625
	while(1)
	{
		Scan_Key();		//调用按键扫描程序
		display();		//调用数码管显示程序
	  	

	}
}

void t0(void) interrupt 1 using 0
{
  	TH0=(65535-50000)/256; //50ms定时
  	TL0=(65535-50000)%256;  
  	timecount++;re_disp++;
  	if(timecount>9)
   		{
			timecount=0;
    		flag=~flag;
   		}
	if(re_disp>200){re_disp=0;if(id)id=0;}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -