|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
移植了一个数码管时钟程序,但写入后单片机没有反映,数码管黑屏请坛友给指导指导。
- /*****************************************************************************************************
- *******************************************头文件与宏定义*********************************************
- *****************************************************************************************************/
- #include <STC15.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*****************************************************************************************************
- ***********************************************ADC定义************************************************
- *****************************************************************************************************/
- sfr ADC_LOW2 = 0xBE; //ADC低2位结果
- #define ADC_POWER 0x80 //ADC电源控制位
- #define ADC_FLAG 0x10 //ADC完成标志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540个时钟
- #define ADC_SPEEDL 0x20 //360个时钟
- #define ADC_SPEEDH 0x40 //180个时钟
- #define ADC_SPEEDHH 0x60 //90个时钟
- /*****************************************************************************************************
- ********************************************红外遥控定义**********************************************
- *****************************************************************************************************/
- #define Imax 14000
- #define Imin 8000
- #define Inum1 1450
- #define Inum3 3000
- #define Inum2 700
- uchar f;
- uchar IrOK;
- unsigned long m,Tc;
- uchar Im[4]={0x00,0x00,0x00,0x00};
- /*****************************************************************************************************
- **********************************************DS3231定义**********************************************
- *****************************************************************************************************/
- uchar RTC_Data[7];
- uchar RTC_Data1[7];
- uchar RTC_Set_ID;
- code uchar rtc_address[7]={0x00,0x01,0x02,0x04,0x05,0x03,0x06};
- /*****************************************************************************************************
- **********************************************DS18B20定义**********************************************
- *****************************************************************************************************/
- #define DS1820_TIMEOUT (750/T0_RUNOUT) // 12-bit resolution, 750ms MAX
- #define DS_RESOLUTION 11//9,10,11,12
- #if defined(USE_18B20)
- unsigned char DS18B20_GetTemp( void );
- unsigned char DelayXus(unsigned short n);
- unsigned char DS18B20_Reset( void );
- unsigned char DS18B20_ReadByte( void );
- unsigned char DS18B20_WriteByte( unsigned char dat );
- unsigned char DS18B20_InitSet( void );
- #endif
- #define TEMPH dstemperature.byte[0] //存放温度值的高字节
- #define TEMPL dstemperature.byte[1] //存放温度值的低字节
- #define DS_DELAY480US 8
- #define DS_DELAY240US 4
- #define DS_DELAY60US 1
- #define DS_WAIT_PLUSE 100
- #define DS_TH_REG 37
- #define DS_TL_REG 0
-
- #if(DS_RESOLUTION==9)
- #define DS_CONFIG_REG 0x1F
- #elif(DS_RESOLUTION==10)
- #define DS_CONFIG_REG 0x3F
- #elif(DS_RESOLUTION==11)
- #define DS_CONFIG_REG 0x5F
- #elif(DS_RESOLUTION==12)
- #define DS_CONFIG_REG 0x7F
- #else
- #error DS_RESOLUTION: 9 , 10 , 11 , 12
- #endif
- /*****************************************************************************************************
- **********************************************标志位定义**********************************************
- *****************************************************************************************************/
- bit T0_Flag; //定时器0标志位
- bit laba_flag; //蜂鸣器标志位
- bit set_flag; //设置显示标志位
- bit RTC_Save_Flag; //设置时间标志位
- bit gk; //光控标志位
- /*****************************************************************************************************
- **********************************************管脚定义************************************************
- *****************************************************************************************************/
- sbit IIC_SCL=P3^4; //DS3231_SCL
- sbit IIC_SDA=P3^3; //DS3231_SDA
- sbit hongwai=P3^1; //红外接收数据输入端
- sbit DQ=P3^5; //DS18B20的数据口位
- sbit key1=P3^2; //设置键
- sbit key2=P5^4; //加键
- sbit key3=P5^5; //减键
- sbit laba=P2^7; //喇叭输出端
- sbit D4=P1^1; //数码管位码
- sbit D3=P1^2; //数码管位码
- sbit D2=P2^6; //数码管位码
- sbit D1=P1^0; //数码管位码
- int ld; //光控ADC用
- uint temp[3]; //光控ADC用
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xbf,}; //共阳数码管
-
- uchar code table1[]={0xC0,0xCF,0xA4,0x86,0x8B,0x92,0x90,0xC7,0x80,0x82,0x81,0x98,0xF0,0x8C,0xB0,0xB1}; //共阳数码管倒装
-
- /*****************************************************************************************************
- ******************************************定时器中断函数**********************************************
- *****************************************************************************************************/
- void Time1() interrupt 3
- {
- static uchar timecount;
- TF1=0;
- TH1=0xff;
- TL1=256-110;
-
- timecount++;
- if(timecount>=5)
- {
- timecount=0;
- T0_Flag=1;
- }
- if(laba_flag)
- {
- laba=~laba;
- }
- else
- laba=1;
- }
- /*****************************************************************************************************
- *******************************************ADC初始化函数**********************************************
- *****************************************************************************************************/
- void InitADC()
- {
- P1ASF = 0x08; //Open channels ADC function 0000 1000 p1.3使用AD功能
- ADC_RES = 0;
- ADC_LOW2 = 0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
- }
- /*****************************************************************************************************
- *********************************************ADC处理函数**********************************************
- *****************************************************************************************************/
- void GetADCResult(unsigned char ch,unsigned int *value)
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
- _nop_(); //Must wait before inquiry
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //Must wait before inquiry
- _nop_();
- while(!(ADC_CONTR & ADC_FLAG));//Wait complete flag
- ADC_CONTR &= ~ADC_FLAG; //Close ADC
- *value = 0;
- *value = ADC_RES;
- *value = ((*value)*4 + ADC_LOW2);
- }
- /*****************************************************************************************************
- **********************************************延时函数************************************************
- *****************************************************************************************************/
- void Delayms(uint t)//@11.0592MHz
- {
- uchar i;
- i=t;
- while(--i);
- }
- void Delay_xms(uint x)
- {
- uchar i,j;
- uint t;
- for(t=x;t>0;t--)
- {
- i = 15;
- j = 90;
- do
- {
- while(--j);
- } while(--i);
- }
- }
- /*****************************************************************************************************
- **********************************************显示函数************************************************
- *****************************************************************************************************/
- void display()
- {
- D1=0;
- P0=table[RTC_Data[2]/10];
- Delayms(4);
- P0=0xff;
- D1=1;
- D2=0;
- if(RTC_Data[0]/1%2==0) P0=table[RTC_Data[2]%10];
- else P0=table1[RTC_Data[2]%10];
- Delayms(4);
- P0=0xff;
- D2=1;
- D3=0;
- if(RTC_Data[0]/1%2==0) P0=table1[RTC_Data[1]/10];
- else P2=table1[RTC_Data[1]/10];
- Delayms(4);
- P0=0xff;
- D3=1;
- D4=0;
- P0=table1[RTC_Data[1]%10];
- Delayms(4);
- P0=0xff;
- D4=1;
- }
- /*****************************************************************************************************
- **************************************显示小时函数*****设置用*****************************************
- *****************************************************************************************************/
- void display_set_shi()
- {
- D1=0;
- P0=0x91;
- Delayms(2);
- P0=0xff;
- D1=1;
- D2=0;
- P0=0xff;
- Delayms(2);
- P0=0xff;
- D2=1;
- D3=0;
- P0=table1[RTC_Data[2]/10];
- Delayms(2);
- P0=0xff;
- D3=1;
- D4=0;
- P0=table1[RTC_Data[2]%10];
- Delayms(2);
- P0=0xff;
- D4=1;
- }
- /*****************************************************************************************************
- **************************************显示分钟函数*****设置用*****************************************
- *****************************************************************************************************/
- void display_set_fen()
- {
- D1=0;
- P0=table[15];
- Delayms(2);
- P0=0xff;
- D1=1;
- D2=0;
- P0=0xff;
- Delayms(2);
- P0=0xff;
- D2=1;
- D3=0;
- P0=table1[RTC_Data[1]/10];
- Delayms(2);
- P0=0xff;
- D3=1;
- D4=0;
- P0=table1[RTC_Data[1]%10];
- Delayms(2);
- P0=0xff;
- D4=1;
- }
- /*****************************************************************************************************
- ***************************************显示秒函数*****设置用******************************************
- *****************************************************************************************************/
- void display_set_miao()
- {
- D1=0;
- P0=0x49;
- Delayms(2);
- P0=0xff;
- D1=1;
- D2=0;
- P0=0xff;
- Delayms(2);
- P0=0xff;
- D2=1;
- D3=0;
- P0=table1[RTC_Data[0]/10];
- Delayms(2);
- P0=0xff;
- D3=1;
- D4=0;
- P0=table1[RTC_Data[0]%10];
- Delayms(2);
- P0=0xff;
- D4=1;
- }
- /*****************************************************************************************************
- ********************************************键值处理函数**********************************************
- *****************************************************************************************************/
- void KeyDataProcess()
- {
- if(key1==0)// 设置
- {
- if(key1==0)
- {
- Delay_xms(20);
- while(!key1);
- laba_flag=1; //蜂鸣器响一声
- set_flag=0;
- RTC_Set_ID++;
- if(RTC_Set_ID>=4)
- RTC_Set_ID=1;
- }
- }
- if(key2==0)//+
- {
- if(key2==0)
- {
- Delay_xms(20);
- while(!key2);
- laba_flag=1; //蜂鸣器响一声
- set_flag=0;
- if(RTC_Set_ID==1)
- {
- RTC_Data[2]++;
- if(RTC_Data[2]>23)
- RTC_Data[2]=0;
- display_set_shi();
- }
- else if(RTC_Set_ID==2)
- {
- RTC_Data[1]++;
- if(RTC_Data[1]>59)
- RTC_Data[1]=0;
- display_set_fen();
- }
- else if(RTC_Set_ID==3)
- {
- RTC_Data[0]++;
- if(RTC_Data[0]>59)
- RTC_Data[0]=0;
- display_set_miao();
- }
- }
- }
- if(key3==0)//-
- {
- if(key3==0)
- {
- Delay_xms(20);
- while(!key3);
- laba_flag=1; //蜂鸣器响一声
- set_flag=0;
- if(RTC_Set_ID==1)
- {
- RTC_Data[2]--;
- if(RTC_Data[2]==-1)
- RTC_Data[2]=23;
- display_set_shi();
- }
- else if(RTC_Set_ID==2)
- {
- RTC_Data[1]--;
- if(RTC_Data[1]==-1)
- RTC_Data[1]=59;
- display_set_fen();
- }
- else if(RTC_Set_ID==3)
- {
- RTC_Data[0]--;
- if(RTC_Data[0]==-1)
- RTC_Data[0]=59;
- display_set_miao();
- }
- }
- }
-
- //以下为红外遥控部分
- if(IrOK==1) //设置键
- {
- if(Im[2]==0x0d)
- {
- laba_flag=1; //蜂鸣器响一声
- set_flag=0;
- RTC_Set_ID++;
- if(RTC_Set_ID>=4)
- RTC_Set_ID=1;
- }
- else if(Im[2]==0x40)//遥控器+键
- {
- laba_flag=1; //蜂鸣器响一声
- set_flag=0;
- if(RTC_Set_ID==1)
- {
- RTC_Data[2]++;
- if(RTC_Data[2]>23)
- RTC_Data[2]=0;
- display_set_shi();
- }
- else if(RTC_Set_ID==2)
- {
- RTC_Data[1]++;
- if(RTC_Data[1]>59)
- RTC_Data[1]=0;
- display_set_fen();
- }
- else if(RTC_Set_ID==3)
- {
- RTC_Data[0]++;
- if(RTC_Data[0]>59)
- RTC_Data[0]=0;
- display_set_miao();
- }
- }
- else if(Im[2]==0x19)//遥控器-键
- {
- laba_flag=1; //蜂鸣器响一声
- set_flag=0;
- if(RTC_Set_ID==1)
- {
- RTC_Data[2]--;
- if(RTC_Data[2]==-1)
- RTC_Data[2]=23;
- display_set_shi();
- }
- else if(RTC_Set_ID==2)
- {
- RTC_Data[1]--;
- if(RTC_Data[1]==-1)
- RTC_Data[1]=59;
- display_set_fen();
- }
- else if(RTC_Set_ID==3)
- {
- RTC_Data[0]--;
- if(RTC_Data[0]==-1)
- RTC_Data[0]=59;
- display_set_miao();
- }
- }
- else if(Im[2]==0x15)//遥控器播放键
- {
- laba_flag=1; //蜂鸣器响一声
- set_flag=1;
- RTC_Save_Flag=1;
- }
- else if(Im[2]==0x47)//遥控器MENU键
- {
- laba_flag=1; //蜂鸣器响一声
- set_flag=1;
- gk=!gk;
- }
- IrOK=0;
- }
- }
- /*****************************************************************************************************
- *****************************************DS3231时钟函数***********************************************
- *****************************************************************************************************/
- void delay_IIC()
- {
- _nop_();_nop_();_nop_();_nop_();//IIC总线限速延时函数。该函数是空函数,延时4个机器周期。
- }
- void IIC_Init() //IIC总线初始化函数
- {
- IIC_SDA=1;//释放IIC总线的数据线。
- IIC_SCL=1;//释放IIC总线的时钟线。
- }
- void IIC_start() //IIC总线产生起始信号函数
- {
- IIC_SDA=1;//拉高数据线
- IIC_SCL=1;//拉高时钟线
- delay_IIC();
- IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。
- delay_IIC();
- IIC_SCL=0;//拉低时钟线
- }
- void IIC_stop()//IIC总线产生停止信号函数
- {
- IIC_SDA=0;//拉低数据线
- delay_IIC();
- IIC_SCL=1;//拉高时钟线。
- delay_IIC();
- IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。
- delay_IIC();
- }
- bit IIC_Tack() //接收应答信号函数
- {
- bit ack;//定义一个位变量,来暂存应答状态。
- IIC_SDA=1;//释放数据总线,准备接收应答信号。
- delay_IIC();
- IIC_SCL=1;//拉高时钟线。
- delay_IIC();
- ack=IIC_SDA;//读取应答信号的状态。
- delay_IIC();
- IIC_SCL=0;//拉低时钟线。
- delay_IIC();
- return ack;//返回应答信号的状态,0表示应答,1表示非应答。
- }
- void IIC_write_byte(uchar Data)//向IIC总线写入一个字节的数据函数
- {
- uchar i;
- for(i=0;i<8;i++)//有8位数据
- {
- if(Data&0x80)
- IIC_SDA=1;//写最高位的数据
- else
- IIC_SDA = 0;
- delay_IIC();
- IIC_SCL=1; //拉高时钟线,将数写入到设备中。
- delay_IIC();
- IIC_SCL=0;//拉低时钟线,允许改变数据线的状态
- delay_IIC();
- Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备
- }
- }
- uchar IIC_read_byte()//从IIC总线读取一个字节的数据函数
- {
- uchar i;
- uchar Data; //定义一个缓冲寄存器。
- for(i=0;i<8;i++)//有8位数据
- {
- IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。
- delay_IIC();
- Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。
- delay_IIC();
-
- if(IIC_SDA)//如果数据线为高平电平。
- Data=Data|0x01;//则给缓冲字节的最低位写1。
- IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。
- delay_IIC();
- }
- return Data;//返回读取的一个字节数据。
- }
- void IIC_single_byte_write(uchar Waddr,uchar Data) //向任意地址写入一个字节数据函数
- {
- IIC_start();//产生起始信号
- IIC_write_byte(0xd0);//写入设备地址(写)
- IIC_Tack();//等待设备的应答
- IIC_write_byte(Waddr);//写入要操作的单元地址。
- IIC_Tack();//等待设备的应答。
- IIC_write_byte(Data);//写入数据。
- IIC_Tack();//等待设备的应答。
- IIC_stop();//产生停止符号。
- }
- uchar IIC_single_byte_read(uchar Waddr) //从任意地址读取一个字节数据函数
- {
- uchar Data;//定义一个缓冲寄存器。
- IIC_start();//产生起始信号
- IIC_write_byte(0xd0);//写入设备地址(写)
- IIC_Tack();//等待设备的应答
- IIC_write_byte(Waddr);//写入要操作的单元地址。
- IIC_Tack();//等待设备的应答。
- IIC_stop();//产生停止符号。
- IIC_start();//产生起始信号
- IIC_write_byte(0xd1);//写入设备地址(写)
- IIC_Tack();//等待设备的应答
- Data=IIC_read_byte();//写入数据。
- delay_IIC();
- IIC_stop();//产生停止符号。
- return Data;//返回读取的一个字节数据。
- }
- /*****************************************************************************************************
- *******************************************时钟初始化函数*********************************************
- *****************************************************************************************************/
- void DS3231_Init()
- {
- IIC_SDA=1;
- IIC_SCL=1;
- IIC_single_byte_write(0x0e,0x0c);
- }
- /*****************************************************************************************************
- ********************************************时钟写入函数**********************************************
- *****************************************************************************************************/
- void Set_RTC()
- {
- uchar i,tmp;
- for(i=0;i<7;i++)
- {
- tmp=RTC_Data[i]/10;
- RTC_Data1[i]=RTC_Data[i]%10;
- RTC_Data1[i]=RTC_Data1[i]+tmp*16;
- }
- for(i=0;i<7;i++)
- {
- IIC_single_byte_write(rtc_address[i],RTC_Data1[i]);
- }
- IIC_single_byte_write(0x0e,0x0c);
- }
- /*****************************************************************************************************
- ********************************************时钟读取函数**********************************************
- *****************************************************************************************************/
- void Read_RTC()
- {
- uchar i,tmp,tmp1,tmp2;
- for(i=0;i<7;i++)
- {
- tmp = IIC_single_byte_read(rtc_address[i]);
- tmp1 = tmp/16;
- tmp2 = tmp%16;
- RTC_Data[i]=tmp1*10+tmp2;
- }
- }
- void Ram_init()
- {
- Read_RTC(); //读取 秒分时日月周年
- if((!RTC_Data[6])&&(!RTC_Data[4])&&(!RTC_Data[3])&&(!RTC_Data[2])&&(!RTC_Data[1])&&(!RTC_Data[0]))
- {
- RTC_Data[0]=0; //秒 //秒分时日月周年 最低位读写位
- RTC_Data[1]=0; //分
- RTC_Data[2]=12; //时
- RTC_Data[3]=3; //日
- RTC_Data[4]=11; //月
- RTC_Data[5]=2; //周
- RTC_Data[6]=15; //年
- Set_RTC(); //写入 秒分时日月周年
- }
- RTC_Set_ID=0;
- }
- /*****************************************************************************************************
- **********************************************走时函数************************************************
- *****************************************************************************************************/
- void Time_Fun()
- {
- static uchar T10Ms_Cnt=0,T200Ms_Cnt=0;
- static uchar Buzz_On_Cnt=0,RTC_Save_Cnt=0;
-
- T10Ms_Cnt++;
- if(T10Ms_Cnt>=5)
- {
- T10Ms_Cnt=0;
- KeyDataProcess();
- if(laba_flag)
- {
- Buzz_On_Cnt++;
- if(Buzz_On_Cnt>=10)
- {
- laba_flag=0;
- Buzz_On_Cnt=0;
- }
- }
- if(RTC_Save_Flag) //按确定键RTC_Save_Flag=1,保存数据
- {
- RTC_Save_Cnt++;
- if(RTC_Save_Cnt>=50)
- {
- RTC_Save_Cnt=0;
- RTC_Save_Flag=0;
- RTC_Set_ID=0;
- Set_RTC();
- }
- }
- }
- T200Ms_Cnt++;
- if(T200Ms_Cnt>=5)
- {
- T200Ms_Cnt=0;
- if(!RTC_Set_ID)
- Read_RTC();
- GetADCResult(7,&temp[2]);
- if(gk==1) //开光控
- {
- if( temp[2]<100)ld=5;
- if( temp[2]>100 && temp[2]<300)ld=10;
- if( temp[2]>300 && temp[2]<500)ld=50;
- if( temp[2]>500 && temp[2]<600)ld=80;
- if( temp[2]>600 && temp[2]<700)ld=100;
- if( temp[2]>700 && temp[2]<800)ld=120;
- if( temp[2]>900 && temp[2]<1000)ld=130;
- if( temp[2]>1000)ld=150;
- }
- else ld=5;
- if(set_flag==1)
- {
- display();
- }
- if(RTC_Set_ID==1)
- {
- display_set_shi();
- }
- else if(RTC_Set_ID==2)
- {
- display_set_fen();
- }
- else if(RTC_Set_ID==3)
- {
- display_set_miao();
- }
- Delayms(ld);
- }
- }
- /*****************************************************************************************************
- ****************************************DS18B20函数******************************************
- *****************************************************************************************************/
- #if defined(USE_18B20)
- unsigned char DS18B20_GetTemp( void )
- {
- switch ( ds1820state )
- {
- case 0://设备复位
- if ( 0==DS18B20_Reset( ) )
- {
- ds1820state = 1;
- ds1820substate =0;
- }
- break;
- case 1:
- if ( 0==DS18B20_WriteByte( 0xCC ) )
- { //跳过ROM命令
- ds1820state = 2;
- ds1820substate =0;
- }
- break;
- case 2:
- if ( 0==DS18B20_WriteByte( 0x44 ) )
- { //开始转换命令
- ds1820state = 3;
- ds1820substate =0;
- uscnt = 0;
- }
- break;
- case 3://等待转换完成
- if ( flag_ms_ds )
- {
- flag_ms_ds = 0;
- uscnt++;
- }
- if ( uscnt>DS1820_TIMEOUT )
- {
- ds1820state = 0;
- }
- if ( DQ )
- {
- ds1820state = 4;
- ds1820substate =0;
- }
- break;
- case 4:
- if ( 0==DS18B20_Reset( ) )
- {
- ds1820state = 5;
- ds1820substate =0;
- }
- break;
- case 5:
- if ( 0==DS18B20_WriteByte( 0xCC ) )
- { //跳过ROM命令
- ds1820state = 6;
- ds1820substate =0;
- }
- break;
- case 6:
- if ( 0==DS18B20_WriteByte( 0xBE ) )
- { //读暂存存储器命令
- ds1820state = 7;
- ds1820substate =0;
- }
- break;
- case 7:
- if ( 0==DS18B20_ReadByte( ) )
- { //读温度低字节
- TEMPL = ds1820data;
- ds1820state = 8;
- ds1820substate =0;
- }
- break;
- case 8:
- if ( 0==DS18B20_ReadByte( ) )
- { //读温度高字节
- TEMPH = ds1820data;
- ds1820state = 0;
- ds1820substate =0;
- return 0;
- }
- break;
- default:ds1820state=0;break;
- }
- return 1;
- }
- unsigned char DelayXus(unsigned short n)
- {
- if ( uscnt < n )
- {
- uscnt++;
- return 1;
- }
- else
- {
- uscnt = 0;
- return 0;
- }
- }
- unsigned char DS18B20_Reset( void)
- {
- switch ( ds1820substate )
- {
- case 0:
- DQ = 0; //送出低电平复位信号
- ds1820substate = 1;
- uscnt = 0;
- break;
- case 1: //延时至少480us
- if ( 0==DelayXus(DS_DELAY480US) )
- {
- DQ = 1; //释放数据线
- ds1820substate = 2;
- uscnt = 0;
- }
- break;
- case 2: //检测存在脉冲
- if ( 0==DQ )
- {
- ds1820substate = 3;
- uscnt = 0;
- }
- else if ( uscnt++ > DS_WAIT_PLUSE )
- {
- ds1820substate = 0;
- }
- break;
- case 3: //等待设备释放数据线
- if ( 0==DelayXus(DS_DELAY240US) )
- {
- ds1820substate = 0;
- return 0;
- }
- break;
- default:ds1820substate=0;break;
- }
- return 1;
- }
- /**************************************
- 从DS18B20读1字节数据
- **************************************/
- unsigned char DS18B20_ReadByte( void )
- {
- switch ( ds1820substate )
- {
- case 0:
- loopcnt =0;
- case 1:
- ds1820data >>= 1;
- DQ = 0; //开始时间片
- _nop_();_nop_();_nop_(); //延时等待
- DQ = 1; //准备接收
- _nop_();_nop_();_nop_(); //接收延时
- if ( DQ ) ds1820data |= 0x80; //读取数据
- uscnt = 0;
- ds1820substate = 2;
- break;
- case 2:
- if ( 0==DelayXus(DS_DELAY60US) )
- {
- loopcnt++;
- ds1820substate = 1;
- }
- if ( loopcnt>7 )
- {
- ds1820substate = 0;
- return 0;
- }
- break;
- default: ds1820substate=0;break;
- }
- return 1;
- }
- /**************************************
- 向DS18B20写1字节数据
- **************************************/
- unsigned char DS18B20_WriteByte( unsigned char dat)
- {
- switch ( ds1820substate )
- {
- case 0:
- loopcnt = 0;
- ds1820data = dat;
- case 1:
- DQ = 0; //开始时间片
- _nop_();_nop_();_nop_(); //延时等待
- if ( ds1820data&0x01 )DQ=1;
- else DQ = 0;
- ds1820data >>= 1; //送出数据
- uscnt = 0;
- ds1820substate = 2;
- break;
- case 2:
- if ( 0==DelayXus(DS_DELAY60US) )
- {
- loopcnt++;
- DQ = 1; //恢复数据线
- //_nop_(); //恢复延时
- ds1820substate = 1;
- }
- if ( loopcnt>7 )
- {
- ds1820substate = 0;
- return 0;
- }
- break;
- default: ds1820substate=0;break;
- }
- return 1;
- }
- unsigned char DS18B20_InitSet( void )
- {
- switch ( ds1820state )
- {
- case 0://设备复位
- if ( 0==DS18B20_Reset( ) )
- {
- ds1820state = 1;
- ds1820substate =0;
- }
- break;
- case 1:
- if ( 0==DS18B20_WriteByte( 0xCC ) )
- { //跳过ROM命令
- ds1820state = 2;
- ds1820substate =0;
- }
- break;
- case 2:
- if ( 0==DS18B20_WriteByte( 0x4E ) )
- { //写粘贴板
- ds1820state = 3;
- ds1820substate =0;
- }
- break;
- case 3://
- if ( 0==DS18B20_WriteByte( DS_TH_REG ) )
- { //写TH
- ds1820state = 4;
- ds1820substate =0;
- }
- break;
- case 4://
- if ( 0==DS18B20_WriteByte( DS_TL_REG ) )
- { //写TL
- ds1820state = 5;
- ds1820substate =0;
- }
- break;
- case 5://
- if ( 0==DS18B20_WriteByte( DS_CONFIG_REG ) )
- { //写设置
- ds1820state = 0;
- ds1820substate =0;
- return 0;
- }
- break;
- default:ds1820state=0;break;
- }
- return 1;
- }
- #endif
- /*****************************************************************************************************
- ***********************************************主函数*************************************************
- *****************************************************************************************************/
- void main()
- {
- EA=1; //开总中断
- IT1=1; //下降沿有效
- EX1=1; //外部中断1开
- ET1=1; //打开允许开关
- hongwai=1;
- TMOD=0x11;
- TH1=0xff;
- TL1=256-110;
- TR1=1; //启动定时/计数器1 中断
- TH0=0; //T0赋初值
- TL0=0;
- TR0=1;
- InitADC(); //ADC初始化
- Ram_init();
- IIC_Init();
- DS3231_Init();
- laba=1;
- set_flag=1;
- gk=1; //光控默认开
- laba_flag=0;
- while(1)
- {
- if(T0_Flag)
- {
- T0_Flag=0;
- Time_Fun();
- }
- }
- }
- /*****************************************************************************************************
- ****************************************外部中断红外解码函数******************************************
- *****************************************************************************************************/
- void intersvr1(void) interrupt 2 using 1 //外部中断解码程序_外部中断1 P3.1口
- {
- Tc=TH0*256+TL0;//提取中断时间间隔时长
- TH0=0;
- TL0=0; //定时中断重新置零
- if((Tc>Imin)&&(Tc<Imax))
- {
- m=0;
- f=1;
- return;
- } //找到启始码
- if(f==1)
- {
- if(Tc>Inum1&&Tc<Inum3)
- {
- Im[m/8]=Im[m/8]>>1|0x80; m++;
- }
- if(Tc>Inum2&&Tc<Inum1)
- {
- Im[m/8]=Im[m/8]>>1; m++; //取码
- }
- if(m==32)
- {
- m=0;
- f=0;
- if(Im[2]==~Im[3])
- {
- IrOK=1;
- }
- else IrOK=0; //取码完成后判断读码是否正确
- }
- }
- }
复制代码
|
|