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

📄 main.c

📁 有遥控的温度计,用dS1302做时钟芯片
💻 C
字号:
//ICC-AVR application builder : 2005-11-2 16:28:30
// Target : 8515
// Crystal: 4.0000Mhz
#include <io8515v.h>
#include <macros.h>
#include <162-1302.h>
#include <function.h>
uchar temh_d;
uchar teml_d;
uchar temm_d;
uchar flag=0;
uchar n=0;
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0xFF;
 PORTB = 0xFF;
 DDRB  = 0xFF;
 PORTC = 0xFF;
 DDRC  = 0xFF;
 PORTD = 0x00;
 DDRD  = 0x00; 
}	   	 	   		//call this routine to initialize all peripherals
void init_devices(void)
{
 	 				//stop errant interrupts until set up
 CLI(); 			//disable all interrupts
 port_init();
 MCUCR = 0x00;
 GIMSK = 0x40;
 TIMSK = 0x00;
 SEI();  	   		//re-enable interrupts
 			   		//all peripherals are now initialized
}
void delay_nms(uchar n)
{
	unsigned char a, b;

	for (a = 1; a<n; a++)
		for (b = 1; b<10; b++)
			;
}
void delay_ns(uchar n)
{ unsigned char  b;
  for(b=0;b<n;b++)
  delay_nms(200);
 }
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
 //external interupt on INT0
   uchar i;
   uint user_code=0;
   uint data_code=0,store;
   CLI();     //关闭中断
 //**********************目的是检测在3毫秒内如果出现高电平就退出解码程序  
   for(i=0;i<3;i++)
   {
    delay_nms(90);        //延时1ms
   if(PIND&0X04)
     {
	goto ret;
	 }
    }  
 //**********************等高电平出现,再延时4.7ms,跳过结果码
 	while(!(PIND&004));
    while(PIND&0X04);        
 //**********************开始接收用户码
 	for(i=0;i<16;i++)
    {
	 while(!(PIND&0X04));
	 delay_nms(90);       //延时1.05ms     
	if(PIND&0X04)         
		{
		user_code|=(1<<i);
		
		}
	else
	    {
		user_code&=~(1<<i);
		}
	 }

   //**********************开始接收数据
    for(i=0;i<16;i++)
    {
	 while(!(PIND&0X04));
	delay_nms(90);       //延时1.05ms    
	if(PIND&0X04)
		{
		data_code|=(1<<i);
		
		}
	else
	    {
		data_code&=~(1<<i);
		}
	 }
	store=data_code;      //采集到数据码
	delay_ns(240); 
        //延时50ms,不接收连续码
    //设置开关
	if(store==0x0901)
		{
	      flag^=0X01;
		}   
	//设置时间
  	if(flag)
	  {
	  uchar t;
	  LCD_write_string(8,1,"s"); 
	  switch(store)
 		{
		case 0x0901 :LCD_set_xy(8,1);LCD_write_char('s');n=0;LCD_set_xy(9,1);
	                 LCD_write_char(n+48);goto ret;break;
		case 0x8401 :n++;if(n>10) n=0;  LCD_set_xy(9,1);
	                 LCD_write_char(n+48); goto ret;break;
		case 0x0841 :n=n-1;if(n==0) n=10;  LCD_set_xy(9,1);
	                 LCD_write_char(n+48); goto ret;break;
		case 0x0441 :t=0;break;
 		case 0x4001 :t=1;break;
 		case 0x0041 :t=2;break;
 		case 0x8081 :t=3;break;
 		case 0x0141 :t=4;break;
 		case 0x8101 :t=5;break;
 		case 0x0241 :t=6;break;
 		case 0x0281 :t=7;break;
 		case 0x0541 :t=8;break;
 		case 0x8201 :t=9;break;
		}
	  
	  switch(n)
	  {
		case 0 :write_data(0x88,((read_data(0x89))&0x0f)|(t<<4));;break;//0
		case 1 :write_data(0x88,((read_data(0x89))&0xf0)|t);;break;
		case 2 :write_data(0x86,((read_data(0x87))&0x0f)|(t<<4));;break;
		case 3 :write_data(0x86,((read_data(0x87))&0xf0)|t);;break;
		case 4 :write_data(0x84,((read_data(0x85))&0x0f)|(t<<4));;break;
		case 5 :write_data(0x84,((read_data(0x85))&0xf0)|t);;break;
		case 6 :write_data(0x82,((read_data(0x83))&0x0f)|(t<<4));;break;
		case 7 :write_data(0x82,((read_data(0x83))&0xf0)|t);;break;
		case 8 :write_data(0x80,((read_data(0x81))&0x0f)|(t<<4));;break;
		case 9 :write_data(0x80,((read_data(0x81))&0xf0)|t);;break;
		case 10 :write_data(0x8a,t);;break;
	  }
	LCD_set_xy(9,1);            //这一位抗干拢
	  LCD_write_char(n+48); 
	 }
	else
	  {
     LCD_DATA_PORT=0x01;     		//清屏
     command_enable();
     delay_ms(10);					//等待1.53ms以上
	  }
 ret:SEI();
}
/******************************************************
                         主程序
******************************************************/		               
void main(void)
{

uchar s,i,th,tl;
 uchar temh,teml,a,count,temm; 
init_devices();
init_1302();
init_1302();
init_lcd() ;
init_lcd() ;
init_time(0x00,0x01,0x02,0x03,0x04,0x05);
   while(1)
    {
	 //1302
	  LCD_set_xy(0,0);
	  //month
   	  s=read_data(0x89);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(th+48);
      LCD_write_char(tl+48);
	  LCD_write_char(':');
	  //day
   	  s=read_data(0x87);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(th+48);
      LCD_write_char(tl+48);
	  LCD_write_char(' ');
	  LCD_write_char(' ');
	  //hour
   	  s=read_data(0x85);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(th+48);
      LCD_write_char(tl+48);
	  LCD_write_char(':');
	  //min
   	  s=read_data(0x83);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(th+48);
      LCD_write_char(tl+48);
	  LCD_write_char(':');
	  //sec
   	  s=read_data(0x81);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(th+48);
      LCD_write_char(tl+48);
     //date
	 s=read_data(0x8b);
	 tl=s&0x0f;
	  switch(tl)
	  		{
			case 1:LCD_write_string(0,1,"monday");break;
			case 2:LCD_write_string(0,1,"tuesday");break;
			case 3:LCD_write_string(0,1,"wednesday");break;
			case 4:LCD_write_string(0,1,"thursday");break;
			case 5:LCD_write_string(0,1,"friday");break;
			case 6:LCD_write_string(0,1,"saturday");break;
			case 7:LCD_write_string(0,1,"sunday");break;
			}
    //18b20 
     a=init_1820();               //复位18b20   
      write_1820(0xCC);              // SKIP THE ROM
      write_1820(0x44);              //启动温度转换
	  for(i=0;i<200;i++)           //每次转换需要延时200ms以上 
        delay(200);   
      a=init_1820();               //复位18b20 
      write_1820(0xCC);               //SKIP THE ROM
      write_1820(0xBE);               //读寄存器命令
      teml=read_1820();              //读低字节数据 
      temh=read_1820();              //读高字节数据 
	  temm=teml;
	  temm&=0x0F;
	  teml>>=4;
	  temh<<=4;
	  count=teml|temh;
	  temh_d=count/10;
	  temm_d=(temm*6)/10;
	  teml_d=count%10;
      delay(200);  
	  LCD_set_xy(10,1);
	  LCD_write_char(temh_d+48);       
	  LCD_set_xy(11,1);
	  LCD_write_char(teml_d+48);  
	  LCD_set_xy(12,1);
	  LCD_write_char('.');     
	  LCD_set_xy(13,1);
	  LCD_write_char(temm_d+48); 
	  LCD_write_string(14,1,"`C");     
     }
}

⌨️ 快捷键说明

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