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

📄 3208_v4.01.00.c

📁 《爱上单片机》_单片机学习必备
💻 C
📖 第 1 页 / 共 4 页
字号:
	WriteOneChar(0xCC); // 跳过读序号列号的操作
	WriteOneChar(0x44); // 启动温度转换
	Init_DS18B20();
	WriteOneChar(0xCC); //跳过读序号列号的操作
	WriteOneChar(0xBE); //读取温度寄存器
	a=ReadOneChar();  //读低8位
	b=ReadOneChar(); //读高8位
	t=b;
	t<<=8;
	t=t|a;
	tt=t*0.0625;
	t= tt*10+0.5; //放大10倍输出并四舍五入
	return(t);
}
/******************************************************************************/
uchar printTemperature(void){//写一个字节(DS18B20驱动)
	unsigned int i=0;
	unsigned char a=0,b=0,c=0;
	i=ReadTemperature();//读温度并送显
	a=i/100;
	b=i/10-a*10;
	i = a*10 + b;
	return i;		
}
/**********************************************************************************************/	
void Beeplll(void){//BELL 闹钟声音(蜂鸣器驱动) 
	uint a;//定义变量用于发声的长度设置
	Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
	for(a=2500;a>0;a--){//第一个声音的长度
		Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
		Delay(10);//音调设置延时
	}
	for(a=100;a>0;a--){//同上
		Bell_Out = ~Bell_Out;  //
		Delay(6);//音调设置延时
	}
	Bell_Out = 1;
}
/**********************************************************************************************/	
void Beep(void){//BELL-扬声器--整点报时(蜂鸣器驱动) 
	uchar a;//定义变量用于发声的长度设置
	Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
	for(a=60;a>0;a--){//第一个声音的长度
		Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
		Delay(100);//音调设置延时
	}
	for(a=100;a>0;a--){//同上
		Bell_Out = ~Bell_Out;
		Delay(80);//
	}
	for(a=100;a>0;a--){//同上
		Bell_Out = ~Bell_Out;
		Delay(30);//
	}
}
/**********************************************************************************************/	
void Beep_set(void){//BELL -扬声器--确定设置(蜂鸣器驱动)
	uchar a;//定义变量用于发声的长度设置
	Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
	for(a=250;a>0;a--){//第一个声音的长度
		Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
		Delay(20);//音调设置延时
	}
	for(a=100;a>0;a--){//同上
		Bell_Out = ~Bell_Out;
		Delay(80);//
	}
}	
/**********************************************************************************************/	
void Beep_key(void){//-扬声器--按键音(蜂鸣器驱动)
	uchar a;//定义变量用于发声的长度设置
	Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
	for(a=100;a>0;a--){//声音的长度
		Bell_Out = ~Bell_Out;
		Delay(50);//音调设置延时
	}
}
/**********************************************************************************************/	
void clock_out(unsigned char dd){ //-1302驱动程序(DS1302驱动)
	ACC=dd;
	clock_dat=a0; clock_clk=1; clock_clk=0;
	clock_dat=a1; clock_clk=1; clock_clk=0;
	clock_dat=a2; clock_clk=1; clock_clk=0;
	clock_dat=a3; clock_clk=1; clock_clk=0;
	clock_dat=a4; clock_clk=1; clock_clk=0;
	clock_dat=a5; clock_clk=1; clock_clk=0;
	clock_dat=a6; clock_clk=1; clock_clk=0;
	clock_dat=a7; clock_clk=1; clock_clk=0;
}
/**********************************************************************************************/	
unsigned char clock_in(void){ //-DS1302写入字节(DS1302驱动)
	clock_dat=1;
	a0=clock_dat;
	clock_clk=1; clock_clk=0; a1=clock_dat;
	clock_clk=1; clock_clk=0; a2=clock_dat;
	clock_clk=1; clock_clk=0; a3=clock_dat;
	clock_clk=1; clock_clk=0; a4=clock_dat;
	clock_clk=1; clock_clk=0; a5=clock_dat;
	clock_clk=1; clock_clk=0; a6=clock_dat;
	clock_clk=1; clock_clk=0; a7=clock_dat;
	return(ACC);
}
/**********************************************************************************************/	
uchar read_clock(uchar ord){ //-DS1302读数据(DS1302驱动)
	uchar dd=0;
	clock_clk=0;
	clock_Rst=0;
	clock_Rst=1;
	clock_out(ord);
	dd=clock_in();
	clock_Rst=0;
	clock_clk=1;
	return(dd);
}
/**********************************************************************************************/	
void write_clock(uchar ord, uchar dd){ //-DS1302写数据(DS1302驱动)
	clock_clk=0;
	clock_Rst=0;
	clock_Rst=1;
	clock_out(ord);
	clock_out(dd);
	clock_Rst=0;
	clock_clk=1;
}
/**********************************************************************************************/	
void Set_time(unsigned char sel,unsigned char a){ //根据选择调整的相应项目加1并写入DS1302-调时用加1程序
  signed char address,item;
  signed char max,mini;
  //if(sel==7)  {address=0x80; max=0;mini=0;}     //秒7
  if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟6
  if(sel==5)  {address=0x84; max=23;mini=0;}    //小时5
  if(sel==3)  {address=0x86; max=31;mini=1;}    //日3
  if(sel==2)  {address=0x88; max=12;mini=1;}    //月2
  if(sel==1)  {address=0x8c; max=99; mini=0;}    //年1
  if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期4 
  if(sel==200)  {address=0xc2+a*6; max=6;mini=0;}    //MODE 
  if(sel==201)  {address=0xc2+a*6+2; max=23;mini=0;}    //星期4 
  if(sel==202)  {address=0xc2+a*6+4; max=59;mini=0;}    //星期4 
   
  //读取1302某地址上的数值转换成10进制赋给item 
  item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  if(Add_Key == 0){	 key_off ();//等待键放开
  	item++;//数值加1
	Beep_key();//调时提示音
  }
  if(Add2_Key == 0){ key_off ();//等待键放开
  	item--;//数值减1
	Beep_key();//调时提示音
  }  
  if(item>max) item=mini;//查看数值有效范围   
  if(item<mini) item=max;           
  write_clock(0x8e,0x00);//允许写操作
  write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  if(sel == 6 && (Add_Key == 0 || Add2_Key == 0)){
  	write_clock(0x80,0x00);//秒值=0
  }
  write_clock(0x8e,0x80);//写保护,禁止写操作  
}
/**********************************************************************************************/	
void Init_1302(void){//-设置1302的初始时间(2008年11月3日00时00分00秒星期一)
	uchar f;
	if(read_clock(0xc1) != 0xaa){
		write_clock(0x8e,0x00);//允许写操作
		write_clock(0x8c,0x08);//年
		write_clock(0x8a,0x01);//星期
		write_clock(0x88,0x11);//月
		write_clock(0x86,0x03);//日
		write_clock(0x84,0x00);//小时
		write_clock(0x82,0x00);//分钟
		write_clock(0x80,0x00);//秒
		write_clock(0x90,0xa5);//充电	
		write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
		for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
			write_clock(0xc2+f,0x00);
		}
		write_clock(0xc2+7*6+4,2);//设置显示方式为流动显示(2)
		write_clock(0xc2+7*6,1);//设置流动速度为1
		write_clock(0x8e,0x80);//禁止写操作
	}
}
/**********************************************************************************************/
//---V4.0
//说明:每个闹钟占用DS1302的三个RAM,从第5个RAM开始使用。
//每三个RAM中的第一个为当前闹钟的开关,第二个为设置的小时值,第三个为设置的分钟值。
//其它三个RAM,0xc6用于闹钟总开关。0xc4报时的结束时间点。0xc2报时的开始时间点。
void search_time(void){//验证闹钟时间到
	uchar i;
	write_clock(0x8e,0x00);//允许写操作
	for(i=1;i<7;i++){//闹钟改为6组,减少2组留出6个字节RAM
		if(		read_clock(0xc3+i*6) != 0 && 					//不为0则表示这项已经设置
				read_clock(0xc3+i*6+2) == read_clock(0x85) && //小时对比
				read_clock(0xc3+i*6+4) == read_clock(0x83)&& //分值对比
				read_clock(0x81) < 0x09 && //这里保证秒值小于8秒动作,防止再操作
				v != read_clock(0x83))//按键停止防再响
		{
			switch (read_clock(0xc3+i*6)){//显示设置项的说明		
				case 1://只响一次,之后自动关闭[---V4.0即闹一次后把当前闹钟开关给关闭,下次不再闹]			
					BEEP_bit = 1;
					write_clock(0xc2+i*6,0);		
					break;//		
				case 2://常开			
					BEEP_bit = 1;
					break;//		
				case 3://周六、日除外			
					if(read_clock(0x8b) < 6){
						BEEP_bit = 1;
					}	
					break;//		
				case 4://周日除外			
					if(read_clock(0x8b) < 7){
						BEEP_bit = 1;
					}	
					break;//		
				case 5://周六、日响			
					if(read_clock(0x8b) > 5){
						BEEP_bit = 1;
					}	
					break;//		
				case 6://周日响			
					if(read_clock(0x8b) == 7){
						BEEP_bit = 1;
					}	
					break;//		
			}
		v = read_clock(0x83);		
		}	
	}
write_clock(0x8e,0x80);//禁止写操作
}
/**********************************************************************************************/
void Time_adj(void){//---V4.0功能,时间校准程序
	unsigned char temp;
	temp=read_clock(0xc3+7*6+2);
	if((read_clock(0x85)==3)&&(read_clock(0x83)==0)&&(read_clock(0x81)==30)){//凌晨3点0分30秒时校正
		if((temp>0)&&(temp<26)){	//减调整
			write_clock(0x8e,0x00);//允许写操作
			write_clock(0x80,30-(26-temp));//对秒进行调整。26-temp:让本来+2.+1.+0.-25.-24...变成+2.+1.+0.-1.-2...
			write_clock(0x8e,0x80);//禁止写操作	
		}
		if((temp>=26)&&(temp<52)){ //加调整
			write_clock(0x8e,0x00);//允许写操作
			write_clock(0x80,30+(temp-26));//对秒进行调整
			write_clock(0x8e,0x80);//禁止写操作
		}
	}
}
/**********************************************************************************************/	
void clearRAM (void){//寄存器清空函数-32个寄存器清空(0x00)
	uchar a;//定义变量用于清空数据指针
	for(a=0;a<32;a++){//指向32个寄存器
		Ledplay[a] = 0;//将指向的寄存器清空
	}
}
/**********************************************************************************************/	
void clearBuf (void){//寄存器清空函数-80个寄存器清空(0x00)--V4.0
	uchar a;//定义变量用于清空数据指针
	for(a=0;a<80;a++){//指向80个寄存器
		Ledplay_buf[a] = 0;//将指向的寄存器清空
	}
}
/**********************************************************************************************/	
void putin_buf (uchar u){//字符载入函数-将字符装入显示寄存器
	uchar a = 0;//定义变量用于数据提取指针
	do{		
		Ledplay_buf[bn+40] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
		a++;//换下一个提取字节	
		bn++;//换下一个显示缓冲字节			
	}
	while(no[u][a] != 0);//当显示数据为0时结束循环
	bn++;//换下一个显示缓冲字节
	Ledplay_buf[bn+40] = 0;//显示一列的空位,便于字符区分	
}
/**********************************************************************************************/	
void putin (uchar u){//字符载入函数-将字符装入显示寄存器
	uchar a = 0;//定义变量用于数据提取指针
	do{		
		Ledplay[bn] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
		a++;//换下一个提取字节	
		bn++;//换下一个显示缓冲字节			
	}
	while(no[u][a] != 0);//当显示数据为0时结束循环
	bn++;//换下一个显示缓冲字节
	Ledplay[bn] = 0;//显示一列的空位,便于字符区分	
}
/**********************************************************************************************/
//将待显缓冲区的前32字节转移到显示缓冲区中--V4.0
void disBuf_2_disRam(void){
	uchar i;	
	for(i=0;i<32;i++){
		Ledplay[i]=Ledplay_buf[i];
	}
}
//***********************************************************************************************************
//此处是显示显示缓冲区内容的函数,只有这里才有权力涉及到显示缓冲区的读取!!!
//暂时设置部分的显示不改。
//***********************************************************************************************************
void display (void){//点阵屏驱动函数-32*8点阵显示驱动
	uchar ac,aa;//定义两个数据变量
	aa = 7;//指定前16个数据的提取	
	for(ac=0x28;ac<0x30;ac++){//扫描前两块LED屏		
		Led_E  = ac;//用ac值驱动使能列信号

		Led_24 = DL(Ledplay[aa+8]);//DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏
		Led_13 = Ledplay[aa];//将显示寄存器数据写入1、3屏
		
		Delay(60);//延时1.2微秒[60]
		Led_E  = 0xff;

		Led_13 = 0;//数据总线清空
		Led_24 = 0;
		aa--;//aa减1,换下一列显示
	}
	aa = 23;//指定后16个数据的提取
	for(ac=0x20;ac<0x28;ac++){//扫描后两块LED屏(由于P1.5接扬声器所以高4位为2,旨在关声音)		
		Led_E  = ac;//用ac值驱动使能列信号	

		Led_24 = DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏
		Led_13 = Ledplay[aa];//将显示寄存器数据写入1、3屏

		Delay(60);//延时1.2微秒	[60]
		Led_E  = 0xff;

		Led_13 = 0;//数据总线清空
		Led_24 = 0;
		aa--;//aa减1,换下一列显示
	}
	Led_E  = 0xff;
}
/**********************************************************************************************/
void display_delay(uchar i){//循环显示i次以达到延时功能
	while(i){
		display();
		i--;
	}
}
/**********************************************************************************************/
void Load_date(void){ //日期组合与显示
	bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
	if(read_clock(0x89)/16 != 0){//为0时消隐
	putin_buf(read_clock(0x89)/16);//显示月值(十位,为0时消隐)/*将数据存入待显区后四十字节。*/
	}
	putin_buf(read_clock(0x89)%16);//显示月值(个位)
	putin_buf(21);//显示"月"
	if(read_clock(0x87)/16 != 0){//为0时消隐
	putin_buf(read_clock(0x87)/16);//显示日值(十位,为0时消隐)
	}
	putin_buf(read_clock(0x87)%16);//显示日值(个位)
	putin_buf(22);//显示"日" 
}

⌨️ 快捷键说明

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