|
用LPC2103处理器 设计显示当前温度和时间,用ds18b20 显示时间用ds1302 显示用16x64点阵
如何用C语言编写全部程序我有基于51的但是不会改 求助!!江湖告急!!有重谢
- //#include<AT89x51.H>
- #include"NEW_8051.H"
- #define uchar unsigned char
- #define uint unsigned int
- #define light 3 //定义亮度
- uchar code hanzi[]; //汉字字模
- uchar code shengri[]; //生日字模
- uchar code timer[13][16]; //0~9数字
- uchar code sw[]; //138驱动数据
- void Show_word(); //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
- void Show_pass(); //不显示一个字
- void Send_data(unsigned char *d); /*发送一个字节红色数据*/
- void Send_data1(unsigned char *d); /*发送一个字节绿色数据*/
- void Send_data2(unsigned char *d);/*发送一个字节黄色色数据*/
- uchar Mode_count=0;
- /******************************************/
- #define DataOut P0 //定义扫描口 占用 P0.0~P0.3
- /*按键定义*/
- sbit resget=P3^4; //时钟复位
- sbit key_moda=P2^1; //模式转换
- sbit key_up=P2^2; //时钟加
- sbit key_Down=P2^3; //时钟减
- /*DS1302 数据IO定义*/
- sbit T_CLK=P1^2;//DS1302引脚连接
- sbit T_IO =P1^3;
- sbit T_RST=P1^4;
- sbit ACC0=ACC^0;//1bit数据存储位
- sbit ACC7=ACC^7;
- /*点阵数据IO定义*/
- sbit STR=P1^7; //锁存
- sbit SCK=P1^6; //时钟
- sbit SERr= P0^4; //红色数据线
- sbit SERg= P0^4; //绿色数据线
- sbit E=P0^4;
- sbit IA =P0^0; //行控制线A
- sbit IB =P0^1; //行控制线B
- sbit IC =P0^2; //行控制线C
- sbit ID =P0^3; //行控制线D
- /*定义DS18B20 IO接口*/
- sbit DQ= P3^1;//ds1820data(单总线) 请根据实际 定义接口
- #define scan0 {IA=0;IB=0;IC=0;ID=0;}
- #define scan1 {IA=1;IB=0;IC=0;ID=0;}
- #define scan2 {IA=0;IB=1;IC=0;ID=0;}
- #define scan3 {IA=1;IB=1;IC=0;ID=0;}
- #define scan4 {IA=0;IB=0;IC=1;ID=0;}
- #define scan5 {IA=1;IB=0;IC=1;ID=0;}
- #define scan6 {IA=0;IB=1;IC=1;ID=0;}
- #define scan7 {IA=1;IB=1;IC=1;ID=0;}
- #define scan8 {IA=0;IB=0;IC=0;ID=1;}
- #define scan9 {IA=1;IB=0;IC=0;ID=1;}
- #define scan10 {IA=0;IB=1;IC=0;ID=1;}
- #define scan11 {IA=1;IB=1;IC=0;ID=1;}
- #define scan12 {IA=0;IB=0;IC=1;ID=1;}
- #define scan13 {IA=1;IB=0;IC=1;ID=1;}
- #define scan14 {IA=0;IB=1;IC=1;ID=1;}
- #define scan15 {IA=1;IB=1;IC=1;ID=1;}
- bit new_code;
- /*结构体*/ /* 保存一次解码后接收到的四字节数据*/
- static struct IR_data //红外接收的数据结构
- {
- unsigned char addr1; // 地址1(客户码1)
- unsigned char addr2; // 地址2(客户码2)
- unsigned char data1; // 数据1(数据码)
- unsigned char data2; // 数据2(数据码反码)
- } IR_DATA;
- #define GTime 53
- #define CTime 114
- #define D0MinTime 4
- #define D0MaxTime 9
- #define D1MinTime 11
- #define D1MaxTime 16
- #define TimeOut_cnt 250
- /*全局公共变量*/
- unsigned char T0_CNT; // 定时器计数值
- unsigned char T0_CNT_bk; // 计数备份
- bit TimeOut; // 超时标志
- bit Guide; // 引导码有效
- bit Continuous; // 连_发码
- unsigned char idata IR_Time[33]; // 保存每两个下降沿之间的时间间隔
- uchar key_code;
- //秒 分 时 日 月 星期 年 所以初始化时间是 12年-7月24日-星期2-22点10分0秒
- uchar starts_time[7]={0x00,0x10,0x22,0x24,0x07,0x02,0x12}; //初始化后设置
- uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week; //时间温度变量
- uchar a,b=1,f=3,h,msec,id,x; //标志计数器 a为自动转换显示时间,b为手动与自动标志
- uint zimuo,tvalue; //字模计数器
- uchar BUFF[10]; //缓存
- void RTInputByte(uchar); //* 输入 1Byte */
- uchar RTOutputByte(void); //* 输出 1Byte */
- void W1302(uchar, uchar); // 向DS1302写入一个字节
- uchar R1302(uchar); // 从DS1302读出一个字节
- void Set1302(uchar *); // 写DS1302时间
- void du1302(); // 读时间
- void DelayMs(void); // 延时
- void Set(uchar,uchar ); // 变量调整
- void in_data(); // 调整移动数据
- void rxd_data(); // 串口发送移动数据
- read_temp(); //*读取温度值并转换*/
- /**********************************/
- //void Send_RX(unsigned char d) /*从串口发送数据*/
- //{
- // // ES=0;
- // SBUF=d;
- // while(TI==0); //等待发送完毕
- // TI=0;
- // // ES=1;
- //}
- /*****不影响其他端口的扫描*************************/
- void scan(unsigned char Value)
- {switch(Value)
- {case 0: scan0;break;
- case 1: scan1;break;
- case 2: scan2;break;
- case 3: scan3;break;
- case 4: scan4;break;
- case 5: scan5;break;
- case 6: scan6;break;
- case 7: scan7;break;
- case 8: scan8;break;
- case 9: scan9;break;
- case 10:scan10;break;
- case 11:scan11;break;
- case 12:scan12;break;
- case 13:scan13;break;
- case 14:scan14;break;
- case 15:scan15;break;
- default:break;
- }
- }
- /*主函数*/
- void main()
- {
- Move=0;
- zimuo=0;
- TMOD|=0x01; //16位定时
- TH0=0xC5; //15ms晶振为12M
- TL0=0x68;
- IT0 = 1; //外部中断1为边沿触发
- EX0 = 1; //允许外部1中断
- EA=1; //开总中断
- TR0=1; //开定时器计数
- ET0=1; //开定时器中断0
- TMOD|=0X20;//8位自动重载模式
- ET1=1; //定时器0开中断
- TH1=0x00;//定时160us 晶振18.432M
- TL1=0x00;
- // SCON = 0x50;
- //TMOD|= 0x20;
- //BRT = 0xfb; //0xfb: 18.432MHz,12T,SMOD=0,9600bps
- //AUXR |= 0x11; // 使用独立波特率发生器
- //Send_RX(0x55);
- while(zimuo<512) //上电显示一段汉字
- {
- while(Move<16) //数据移位。
- {
- for(Speed=0;Speed<3;Speed++) //移动速度
- {
- for(line=0;line<16;line++)
- {
- in_data(); //调整移动数据
- rxd_data();
- scan(line);
- STR=1;//锁存
- STR=0;
- STR=1;
- DelayMs(); //延时,等待
- }
- }
- Move++; //移动一步
- }
- Move=0;
- zimuo=zimuo+32;
- }
- zimuo=0;
- //}
- while(1) //重复(无限)循环显示
- {
- if(f==5)
- {
- while(zimuo<512) //上电显示一段广告
- {
- while(Move<16) //数据移位。
- {
- if(f!=5)break;
- if (key_up==0) //增加
- {
- DelayMs();
- if(key_up==0)
- {
- while(key_up==0)
- {Show_word();} //调用显示
- h=0;msec=0; //清闪烁标志
- // if(b!=0) //手动调整显示的内容
- // {
- Mode_count++;
- if(Mode_count>3)
- Mode_count=0;
- switch (Mode_count)
- {
- case 0:
- f=0; b=0;
- break;
- case 1:
- f=3;b=1;
- break;
- case 2:
- f=4;b=1;
- break;
- case 3:
- f=5;b=1;
- break;
- default:
- break;
- }
- }
- }
- for(Speed=0;Speed<3;Speed++) //移动速度
- {
- for(line=0;line<16;line++)
- {
- in_data(); //调整移动数据
- rxd_data();
- scan(line);
- STR=1;//锁存
- STR=0;
- STR=1;
- DelayMs(); //延时,等待一问奔洌?谜饬邢允镜哪谌菰谌搜勰诓??笆泳踉萘簟毕窒蟆?/
- }
- }
- Move++; //移动一步
- }
- Move=0;
- zimuo=zimuo+32;
- }
- zimuo=0;
- }
- if((resget==0)&&(key_moda==0))
- { DelayMs();
- if((resget==0)&&(key_moda==0))
- Set1302(starts_time); //初始化
- W1302(0x8e,0x00); //控制命令,WP=0,写操作
- W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
- }
- du1302(); //读取 秒 分 时 日 月 星期 年
- zimuo=0;
- if (key_moda==0) //设置和选择项目键
- { DelayMs();
- if(key_moda==0)
- {
- if(id++==7) {id=0;}
- h=0;msec=0; //清闪烁标志
- while(key_moda==0){ Show_word();}
- }
- }
- if(id!=0)
- {
- if (key_up==0) //增加
- {
- DelayMs();
- if(key_up==0)
- {
- while(key_up==0)
- {Show_word();} //调用显示
- h=0;msec=0; //清闪烁标志
- Set(id,0); //调用时间调调整
- }
- }
- if (key_Down==0) //减少
- {
- DelayMs();
- if(key_Down==0)
- {
- while(key_Down==0)
- {Show_word();} //调用显示
- h=0;msec=0; //清闪烁标志
- Set(id,1); //调用时间调调整
- }
- }
- }
- else
- {
- if (key_up==0) //增加
- {
- DelayMs();
- if(key_up==0)
- {
- while(key_up==0)
- {Show_word();} //调用显示
- h=0;msec=0; //清闪烁标志
- // if(b!=0) //手动调整显示的内容
- // {
- Mode_count++;
- if(Mode_count>3)
- Mode_count=0;
- switch (Mode_count)
- {
- case 0:
- f=0; b=0;
- break;
- case 1:
- f=3;b=1;
- break;
- case 2:
- f=4;b=1;
- break;
- case 3:
- f=5;b=1;
- break;
- default:
- break;
- }
- }
- }
- }
- if(f==4)
- {
- read_temp();//读取温度
- }
- Show_word(); //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
- }
- }
- /************************************************/
- void Show_word() //串行输出显示
- { uchar h;
- for(h=0;h<16;h++)
- {
- if((id==0)&(f==0)|(id==1)) //f为三秒转换显示
- {
- Send_data(&timer[0][0]); //不显示
- if((Flicker==1)&(id==1)) //闪烁标志为1时不亮,为零时亮
- { Show_pass(); //不显示一个字
- Show_pass();
- }
- else
- {
- Send_data(&timer[2][h]); //20年
- Send_data(&timer[0][h]);
- Send_data(&timer[Year/16][h]); //年值
- Send_data(&timer[Year%16][h]);
- }
- Send_data(&hanzi[h*2+641]); //年字符
- Send_data(&hanzi[h*2+640]);
- Send_data(&timer[0]); //不显示
- }
- if((id==0)&(f==1)|(id==2)|(id==3))
- {
- if((Flicker==1)&(id==2)) //闪烁标志为1时不亮,为零时亮
- { Show_pass(); //不显示一个字
- }
- else
- {
- if(Month/16<1)
- Send_data1(&timer[0]); //月十位为零时不显示
- else
- Send_data1(&timer[Month/16][h]); //月值
- Send_data1(&timer[Month%16][h]);
- }
- Send_data1(&hanzi[h*2+673]); //月字符
- Send_data1(&hanzi[h*2+672]);
- if((Flicker==1)&(id==3)) //闪烁标志为1时不亮,为零时亮
- { Show_pass(); //不显示一个字
- }
- else
- {
- Send_data1(&timer[Day/16][h]); //日值
- Send_data1(&timer[Day%16][h]);
- }
- Send_data1(&hanzi[h*2+961]); //日字符
- Send_data1(&hanzi[h*2+960]);
- }
- if((id==0)&(f==2)|(id==4)) //f为三秒转换显示
- {
- Send_data2(&timer[0]); //不显示
- Send_data2(&hanzi[h*2+705]); //星字符
- Send_data2(&hanzi[h*2+704]);
- Send_data2(&hanzi[h*2+737]); //期字符
- Send_data2(&hanzi[h*2+736]);
- if((Flicker==1)&(id==4)) //闪烁标志为1时不亮,为零时亮
- { Show_pass(); //不显示一个字
- }
- else
- {
- Send_data2(&hanzi[Week%16*32+h*2+737]); //星期值
- Send_data2(&hanzi[Week%16*32+h*2+736]);
- }
- Send_data(&timer[0][0]); //不显示
- }
- if((id==0)&(f==3)|(id>4)) //f为三秒转换显示
- {
- if((Flicker==1)&(id==5)) //闪烁标志为1时不亮,为零时亮
- {
- Show_pass(); //不显示一个字
- }
- else
- {
- if(Hour/16<1)
- Send_data(&timer[0][0]); //时十位小于1时不显示
- else
- Send_data(&timer[Hour/16][h]); //时值
- Send_data(&timer[Hour%16][h]);
- }
- Send_data(&timer[10][h]); //两个点
- if((Flicker==1)&(id==6)) //闪烁标志为1时不亮,为零时亮
- {
- Show_pass(); //不显示一个字
- }
- else
- {
- Send_data(&timer[Cent/16][h]);
- Send_data(&timer[Cent%16][h]); //分值
- }
- Send_data(&timer[10][h]); //两个点
- if((Flicker==1)&(id==7)) //闪烁标志为1时不亮,为零时亮
- {
- Show_pass(); //不显示一个字
- }
- else
- {
- Send_data(&timer[Sec/16][h]); //秒
- Send_data(&timer[Sec%16][h]);
- }
- }
- if((id==0)&(f==4)) //f为三秒转换显示
- {
- Send_data1(&hanzi[h*2+1185]); //温字符
- Send_data1(&hanzi[h*2+1184]);
- Send_data1(&hanzi[h*2+1217]); //度字符
- Send_data1(&hanzi[h*2+1216]);
- Send_data1(&timer[10][h]); //两个点
- if (tvalue/10==0x00)
- Send_data(&timer[0][0]);
- else
- Send_data1(&timer[tvalue/10][h]); //温度值的十位值
- Send_data1(&timer[tvalue%10][h]);//温度值的个位
- Send_data1(timer[U8T_data_H*10%10][h]);//温度值的十分位
- Send_data1(timer[U8T_data_(H+0.005)*100%10][h]);//温度值的百分位
- Send_data1(&timer[11][h]); //温度值的符号
- }
- scan(h); //输出行信号
- STR=1;STR=0;
- STR=1; //锁存为高,595锁存信号
- DelayMs(); //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/
- }
- }
- /************************************************/
- //temp=255-temp;
- //return temp;
- void timer_1(void) interrupt 1 //中断入口,闪烁
- {
- TH0=0xC5; //15ms定时 晶振12M
- TL0=0x68;
- if(msec++==45) //1000ms
- { msec=0;
- x++;
- if(x>=4)
- { x=0;
- if(b==0) //自动模式
- {
- if(f++==2)
- f=0; //f显示转换计数器 ,d为用户设置的自动转换时间的值。
- }
- }
- if(h++==6) //5秒后进入正常走时。
- {id=0;h=0;}
- }
- if(msec<23)
- Flicker=0; //闪烁标志反转
- else
- Flicker=1;
- }
- /***********************输出一个字的不显示数据。*****************/
- void Show_pass()
- {
- Send_data(&timer[0][0]); //不显示
- Send_data(&timer[0][0]); //不显示
- }
- /**********************************************************/
- void in_data(void) //调整数据
- {
- char s;
- for(s=4;s>=0;s--) //i为向后先择字节计数器,zimuoo为向后先字计数器
- {
- BUFF[2*s+1]=hanzi[zimuo+32*s+2*line]; //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
- BUFF[2*s]=hanzi[zimuo+1+32*s+2*line]; //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
- }
- }
- /***********************发送移动的数据****************************/
- void rxd_data(void) //串行发送数据
- {
- uchar s;
- uchar inc,tempyid,temp,k;
- if(Move<8)
- inc=0;
- else
- inc=1;
- for(s=0+inc;s<8+inc;s++) //发送8字节数据
- {
- if(Move<8)
- tempyid=Move;
- else
- tempyid=Move-8;
- temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。
- temp=255-temp;
- SERg=1;
- for(k=0;k<8;k++)//一个字节8位 发送给595
- {
- SCK=0; //上升沿移位595
- SERr=(bit)(temp&0x01);//通过IO口送一个位给 595 发送最低位
- temp=temp>>1; //字节移位 准备送下一位
- SCK=1;
- }
- }
- }
- /*******************************************************/
- void Send_data(unsigned char *d) /*发送红色数据*/
- {
- uchar temp,k;
- temp=*d;
- SERg=1;
- for(k=0;k<8;k++)//一个字节8位 发送给595
- {
- SCK=0; //上升沿移位595
- SERr=(bit)(temp&0x01);//通过IO口送一个位给 595 发送最低位
- temp=temp>>1; //字节移位 准备送下一位
- SCK=1;
- }
- }
- /************************************************************/
- void Send_data1(unsigned char *d)/*发送绿色数据*/
- {
- uchar temp,k;
- temp=*d;
- SERr=1;
- for(k=0;k<8;k++)//一个字节8位 发送给595
- {
- SCK=0; //上升沿移位595
- SERg=(bit)(temp&0x01);//通过IO口送一个位给 595 发送最低位
- temp=temp>>1; //字节移位 准备送下一位
- SCK=1;
- }
- }
- /***************************************************************/
- void Send_data2(unsigned char *d)/*发送黄色数据*/
- {
- uchar temp,k;
- temp=*d;
- for(k=0;k<8;k++)//一个字节8位 发送给595
- {
- SCK=0; //上升沿移位595
- SERr=SERg=(bit)(temp&0x01);//通过IO口送一个位给 595 发送最低位
- temp=temp>>1; //字节移位 准备送下一位
- SCK=1;
- }
- }
- /***************************************************************/
- //根据选择调整相应项目
- void Set(uchar sel,uchar sel_1)
- {
- uchar address,time;
- uchar max,min;
- //if(sel==9) {address=0xc2; max=20;min=1;} //自动转换时间时最大为20秒。
- //if(sel==8) {address=0xc0; max=1;min=0; } //显示自动转换或手动转换。为零自动,为1手动。
- if(sel==7) {address=0x80; max=59;min=0;} //秒
- if(sel==6) {address=0x82; max=59;min=0;} //分钟
- if(sel==5) {address=0x84; max=23;min=0;} //小时
- if(sel==4) {address=0x8a; max=7; min=1;} //星期
- if(sel==3) {address=0x86; max=31;min=1;} //日
- if(sel==2) {address=0x88; max=12;min=1;} //月
- if(sel==1) {address=0x8c; max=99;min=0;} //年
- time=R1302(address+1)/16*10+R1302(address+1)%16;
- if (sel_1==0) time++; else time--;
- if(time>max) time=min;
- if(time<min) time=max;
- W1302(0x8e,0x00);
- W1302(address,time/10*16+time%10);
- W1302(0x8e,0x80);
- }
- /**************************延时***********************/
- void DelayMs(void)
- {
- uchar TempCyc;
- for(TempCyc=10;TempCyc>1;TempCyc--)
- {;}
- }
- //********DS1302读写程序***************//
- /********************************************************************
- 函 数 名:RTInputByte()
- 功 能:实时时钟写入一字节
- 说 明:往DS1302写入1Byte数据 (内部函数)
- 入口参数:d 写入的数据
- 返 回 值:无
- ***********************************************************************/
- void RTInputByte(uchar d)
- {
- uchar h;
- ACC = d;
- for(h=8; h>0; h--)
- {
- T_IO = ACC0; /*相当于汇编中的 RRC */
- T_CLK = 1;
- T_CLK = 0;
- ACC = ACC >> 1;
- }
- }
- /********************************************************************
- 函 数 名:RTOutputByte()
- 功 能:实时时钟读取一字节
- 说 明:从DS1302读取1Byte数据 (内部函数)
- 入口参数:无
- 返 回 值:ACC
- 设 计:zhaojunjie 日 期:2002-03-19
- 修 改: 日 期:
- ***********************************************************************/
- uchar RTOutputByte(void)
- {
- uchar h;
- for(h=8; h>0; h--)
- {
- ACC = ACC >>1; /*相当于汇编中的 RRC */
- ACC7 = T_IO;
- T_CLK = 1;
- T_CLK = 0;
- }
- return(ACC);
- }
- /********************************************************************
- 函 数 名:W1302()
- 功 能:往DS1302写入数据
- 说 明:先写地址,后写命令/数据 (内部函数)
- 调 用:RTInputByte() , RTOutputByte()
- 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
- 返 回 值:无
- ***********************************************************************/
- void W1302(uchar ucAddr, uchar ucDa)
- {
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- RTInputByte(ucAddr); /* 地址,命令 */
- RTInputByte(ucDa); /* 写1Byte数据*/
- T_CLK = 1;
- T_RST = 0;
- }
- /********************************************************************
- 函 数 名:R1302()
- 功 能:读取DS1302某地址的数据
- 说 明:先写地址,后读命令/数据 (内部函数)
- 调 用:RTInputByte() , RTOutputByte()
- 入口参数:ucAddr: DS1302地址
- 返 回 值:ucData :读取的数据
- ***********************************************************************/
- uchar R1302(uchar ucAddr)
- {
- uchar ucData;
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- RTInputByte(ucAddr); /* 地址,命令 */
- ucData = RTOutputByte(); /* 读1Byte数据 */
- T_CLK = 1;
- T_RST = 0;
- return(ucData);
- }
- /********************************************************************
- 函 数 名:Set1302()
- 功 能:设置初始时间
- 说 明:先写地址,后读命令/数据(寄存器多字节方式)
- 调 用:W1302()
- 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
- 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
- 返 回 值:无
- ***********************************************************************/
- void Set1302(uchar *pClock)
- {
- uchar h;
- uchar ucAddr = 0x80;
- W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
- for(h =7; h>0; h--)
- {
- W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
- pClock++;
- ucAddr +=2;
- }
- W1302(0xc0,0x01);
- W1302(0XC2,0X03); //初始自动转换显示时间为3秒。
- W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
- }
- /******************读取DS1302中的时间****************/
- void du1302()
- {
- Sec=R1302(0x81); //对取 秒 分 时 日 月 星期 年
- Cent=R1302(0x83);
- Hour=R1302(0x85);
- Day=R1302(0x87);
- Month=R1302(0x89);
- Week=R1302(0x8b);
- Year=R1302(0x8d);
- // b=R1302(0xc1);
- // a=R1302(0xc3);
- // a=a/16*10+a%16;
- }
- /******************************ds1820程序***************************************/
- void delay_18B20(unsigned int i)//延时1微秒
- {
- //i=i; //由于我用的是1T 51单片机 如果用普通51请 把这句话屏蔽
- while(i--);
- }
- void ds1820rst()/*ds1820复位*/
- { unsigned char x=0;
- DQ = 1; //DQ复位
- delay_18B20(4); //延时
- DQ = 0; //DQ拉低
- delay_18B20(100); //精确延时大于480us
- DQ = 1; //拉高
- delay_18B20(40);
- }
- uchar ds1820rd()/*读数据*/
- { unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--)
- { DQ = 0; //给脉冲信号
- dat>>=1;
- DQ = 1; //给脉冲信号
- if(DQ)
- dat|=0x80;
- delay_18B20(10);
- }
- return(dat);
- }
- void ds1820wr(uchar wdata)/*写数据*/
- {unsigned char i=0;
- for (i=8; i>0; i--)
- { DQ = 0;
- DQ = wdata&0x01;
- delay_18B20(10);
- DQ = 1;
- wdata>>=1;
- }
- }
- read_temp()/*读取温度值并转换*/
- {
- uchar a,b;
- ds1820rst();
- ds1820wr(0xcc);//*跳过读序列号*/
- ds1820wr(0x44);//*启动温度转换*/
- ds1820rst();
- ds1820wr(0xcc);//*跳过读序列号*/
- ds1820wr(0xbe);//*读取温度*/
- a=ds1820rd();
- b=ds1820rd();
- tvalue=b*16+a/16;
- return(tvalue);
- }
- /*********************************************************************************************
- /*Timer1中断子程序*/
- void TR1_Service(void) interrupt 3 using 2
- {
- //static unsigned char T;
- // T++;
- // if(T>1)
- // {
- // T=0;
- T0_CNT ++;
- // }
- if(T0_CNT > TimeOut_cnt)
- {
- TimeOut = 1; // 超时标志
- }
- }
- /***********************************************************************/
- /*解码核心程序*/
- void Decode(void)
- {
- unsigned char i=0x00,j,k;
- static unsigned char *p; // 指向结构体IR_DATA.XX的指针
- EX0 = 0; // 关外部中断1
- /*/////////////////////////进行解码处理////////////////////////*/
- p = &IR_DATA.addr1;
- for(k=0; k<4; k++)
- {
- for(j=0; j<8; j++)
- {
- if((IR_Time[i]>D0MinTime) & (IR_Time[i]<D0MaxTime))
- {
- *p >>= 1; // 右移1位,
- *p &= 0x7f; // 与0111 1111置0. 数据“0” 0.56ms低电平+0.56ms高电平
- }
- else if((IR_Time[i]>D1MinTime) & (IR_Time[i]<D1MaxTime))
- {
- *p >>= 1; // 右移1位,
- *p |= 0x80; // 或1000 0000置1. 数据“1” 0.56ms低电平+1.69ms高电平
- }
- i ++;
- }
- p ++;
- }
- if(IR_DATA.data2+IR_DATA.data1==0XFF)
- {
- key_code=IR_DATA.data1;
- //new_code=1;
- }
- else
- {
- key_code=0XFF; /**非本机遥控器或数据错误**/
- };
- /*/////////////////////////解码处理完毕////////////////////////*/
- EX0 = 1; // 重新开放外部中断0
- }
- void serviceINT0(void) interrupt 0 using 1 //{////外部中断1的中断函数。用于红外线读数。
- {
- static unsigned char m=0;
- TR1=1;
- T0_CNT_bk = T0_CNT; // 备份时间计数值,即前一个下降沿到本下降沿的时间间隔
- T0_CNT = 0x00; // 清空时间计数值
- if(TimeOut) // 如果超时
- {
- // TL0 = TIMER0_COUNT; // 初始化定时器0 -0x1f(31)
- TimeOut = 0; // 清除超时标志
- m = 0; // 复位数据位
- T0_CNT = 0x00; // 清空时间计数值
- Guide = 0; // 清除引导标志
- Continuous = 0; // 清除连_发标志
- }
- else // 正常按键时长58.5ms~76.5ms
- {
- if(Guide | Continuous) // 如果引导码有效
- {
- IR_Time[m++] = T0_CNT_bk; // 保存时间间隔
- if(m == 32) // 接收够32数据后
- {
- m = 0;
- Guide = 0; // 清除引导标志
- //new_code=1;
- TR1=0;
- /*进行解码操作*/
- Decode(); // 解码
- //Send_RX(key_code); //如果用你自己的遥控器 请根据串口发送出来的 按键值修改下面的 动作
- switch (key_code)
- {
- case 0X0C: //遥控器按键值
- f=0; b=0;
- break;
- case 0X18://遥控器按键值
- f=3;b=1;
- break;
- case 0X5E://遥控器按键值
- f=4;b=1;
- break;
- case 0X08: //遥控器按键值
- f=5;b=1;
- break;
- default:
- break;
- }
- }
- }
- if(T0_CNT_bk > GTime) // 如果时间间隔>引导码时长
- {
- Guide = 1; // 使能引导标志
- m = 0;
- };
- if(T0_CNT_bk > CTime) // 如果时间间隔>连_发码时长
- {
- Continuous = 1; // 使能连_发标志
- m = 0;
- }
- }//end of 超时
- }
- /*******************************************************************/
- // uchar code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};/*16行段码*/
- //如果用自己的单片机实验板连接A B C D 一一对应,则用这个扫描数据
- //uchar code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,};/*16行段码*///138驱动数据
- //下面的A B C D行扫描数据是反向的 配套我们的控制卡用
- //uchar code sw[16]={0X00,0X08,0x04,0x0C,0X02,0X0A,0X06,0X0E,0X01,0X09,0X05,0X0D,0X03,0X0B,0X07,0X0F};/*16行段码*///138驱动数据
- const uchar code timer[13][16]={ /*0~9字符*/
- /*-- 文字: 0 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xC7,0xBB,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0xBB,0xC7,0xFF,0xFF,0xFF,/*"0",0*/
- /*-- 文字: 1 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF1,0xF3,0xF7,0xFF,0xFF,0xFF,/*"1",0*/
- /*-- 文字: 2 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0x81,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,0xFF,/*"2",0*/
- /*-- 文字: 3 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xC3,0xBD,0xBD,0xBF,0xBF,0xCF,0xBF,0xBF,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF,/*"3",0*/
- /*-- 文字: 4 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xBF,0xBF,0xBF,0x01,0xBD,0xBB,0xB7,0xB7,0xAF,0x9F,0xBF,0xFF,0xFF,0xFF,/*"4",0*/
- /*-- 文字: 5 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xC3,0xBD,0xBD,0xBF,0xBF,0xBF,0xBD,0xC1,0xFD,0xFD,0x81,0xFF,0xFF,0xFF,/*"5",0*/
- /*-- 文字: 6 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xC7,0xBB,0xBD,0xBD,0xBD,0xB9,0xC5,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,0xFF,/*"6",0*/
- /*-- 文字: 7 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xF7,0xF7,0xEF,0xEF,0xEF,0xDF,0xDF,0xDF,0xBF,0xBF,0x81,0xFF,0xFF,0xFF,/*"7",0*/
- /*-- 文字: 8 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xC7,0xBB,0x7D,0x7D,0xBB,0xC7,0xBB,0x7D,0x7D,0xBB,0xC7,0xFF,0xFF,0xFF,/*"8",0*/
- /*-- 文字: 9 --*/
- /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
- 0xFF,0xFF,0xE3,0xDD,0xBD,0xBF,0xA3,0x9D,0xBD,0xBD,0xBD,0xDD,0xE3,0xFF,0xFF,0xFF,/*"9",0*/
- /*-- 文字: : --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,
- /*-- 文字: C温度符号 --*/
- 0xFF,0xFC,0xFC,0x83,0xBD,0xBD,0xFE,0xFE,0xFE,0xFE,0xFE,0xBD,0xDD,0xE3,0xFF,0xFF,
- /*-- - -- ** 宋体, 12 **
- /*--黑屏字符--*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- };
- /*-- 文字: 年 --*/
- /*-- 黑体; 此字体下对应的点阵为:宽x高=16x17 --*/
- 0xFF,0xFF,0xFC,0xFF,0xFC,0xFF,0xFC,0xFF,0x80,0x00,0x80,0x00,0xFC,0xE7,0xFC,0xE7,0xE0,0x07,0xE0,0x07,0xFC,0xF9,0xFC,0xF3,0xC0,0x07,0xC0,0x07,0xFF,0xCF,0xFF,0xCF,/*"年",0*/
- 0xFF,0xFF,0xF3,0xF9,0xE1,0xF3,0xE7,0xF3,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE0,0x07,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE0,0x07,0xFF,0xFF,/*"月",1*/
- 0xFF,0xFF,0x80,0x01,0x80,0x01,0xFE,0x7F,0xE0,0x07,0xFE,0x79,0xE0,0x01,0xE0,0x03,0xFE,0x67,0xE0,0x03,0xE7,0xF3,0xE0,0x03,0xE7,0xF3,0xE0,0x03,0xE0,0x03,0xFF,0xFF,/*"星",2*/
- 0xFF,0xFF,0xE7,0x3F,0xC6,0x7C,0xCC,0x99,0xCC,0xDB,0xCC,0x00,0xC0,0x00,0xC0,0x93,0xCC,0x83,0xC0,0x93,0xC0,0x83,0xCC,0x93,0xCC,0x01,0xC0,0x01,0xC0,0x93,0xFF,0x93,/*"期",3*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"一",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x80,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x03,0xE0,0x03,0xFF,0xFF,0xFF,0xFF,/*"二",1*/
- 0xFF,0xFF,0xFF,0xFF,0xC0,0x01,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x07,0xF0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x03,0xE0,0x03,0xFF,0xFF,0xFF,0xFF,/*"三",2*/
- 0xFF,0xFF,0xCF,0xF9,0xC0,0x01,0xC0,0x01,0xCF,0xF9,0xCF,0xE1,0xC1,0xC1,0xC0,0x89,0xCC,0x99,0xCC,0x99,0xCC,0x99,0xCC,0x99,0xCC,0x99,0xC0,0x01,0xC0,0x01,0xFF,0xFF,/*"四",3*/
- 0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x80,0x00,0xF3,0x9F,0xF3,0x9F,0xF3,0x9F,0xF3,0x9F,0xF0,0x03,0xF0,0x03,0xFF,0x3F,0xFF,0x3F,0xFF,0x3F,0xC0,0x01,0xC0,0x01,0xFF,0xFF,/*"五",0*/
- 0xFF,0xFF,0xFF,0xFF,0xCF,0xF9,0xCF,0xF3,0xE7,0xE7,0xF7,0xE7,0xF3,0xCF,0xF9,0xDF,0xFF,0xFF,0x80,0x01,0x80,0x01,0xFF,0xFF,0xFE,0x7F,0xFE,0x7F,0xFF,0x3F,0xFF,0xFF,/*"六",1*/
- 0xFF,0xFF,0xE7,0xE7,0xE0,0x07,0xE0,0x07,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE0,0x07,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE0,0x07,/*"日",2*/
- /*-- 文字: 自 31--*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0xFF,0x7F,0xFF,0x7F,0xFF,0xBF,0xE0,0x07,0xEF,0xF7,0xEF,0xF7,0xE0,0x07,0xEF,0xF7,
- 0xEF,0xF7,0xEF,0xF7,0xE0,0x07,0xEF,0xF7,0xEF,0xF7,0xEF,0xF7,0xE0,0x07,0xFF,0xFF,
- /*-- 文字: 手 32--*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0xFF,0xFF,0xE0,0x7F,0xFF,0x01,0xFF,0x7F,0xFF,0x7F,0xC0,0x01,0xFF,0x7F,0xFF,0x7F,
- 0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x5F,0xFF,0x3F,0xFF,0xFF,
- /*-- 文字: 动 33--*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0xFB,0xFF,0xFB,0xFF,0xFB,0x81,0xFB,0xFF,0xC0,0xFF,0xDB,0x00,0xDB,0xF7,0xDB,0xF7,
- 0xDB,0xDB,0xDB,0xBB,0xDD,0x0D,0xDD,0xA0,0xDE,0xFD,0xD7,0x7F,0xEF,0xBF,0xFF,0xFF,
- /*-- 文字: 模 34--*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0xF6,0xFB,0xF6,0xFB,0xC0,0x1B,0xF6,0xFB,0xE0,0x20,0xEF,0xBB,0xE0,0x31,0xEF,0xA9,
- 0xE0,0x3A,0xFD,0xFA,0x80,0x1B,0xFD,0xFB,0xFA,0xFB,0xE6,0xFB,0x8F,0x1B,0xFF,0xFF,
- /*-- 文字: 式 35--*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0xFE,0xFF,0xFA,0xFF,0xF6,0xFF,0xC0,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0x83,
- 0xFD,0xEF,0xFD,0xEF,0xFD,0xEF,0xFB,0x2F,0x7B,0xC7,0x77,0xF1,0x8F,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFE,0x67,0xFC,0x27,0xF9,0xE5,0xF3,0xE4,0xE7,0x81,0xCF,0xC3,0xC3,0x23,0xF3,0x27,0x92,0x41,0x92,0x41,0xC2,0x67,0xC3,0xE1,0xF3,0xC1,0xF3,0xCF,0xF3,0xFF,/*"秒",2*/
- 0xFF,0xFF,0x80,0x07,0x80,0x04,0xCB,0x4C,0xCB,0x49,0xCB,0x49,0xC0,0x0B,0xC0,0x0B,0xFF,0xFF,0xE0,0x1B,0xE7,0x99,0xE0,0x1C,0xE7,0x97,0xE0,0x13,0xE0,0x19,0xFF,0xFF,/*"温",0*/。
- 0xFF,0xFF,0xC3,0x84,0xF0,0x1C,0xF8,0x79,0xF3,0x39,0xE0,0x09,0xE0,0x09,0xFF,0xF9,0xF0,0x39,0xF3,0x39,0xC0,0x09,0xC0,0x09,0xF3,0x39,0xC0,0x01,0xC0,0x01,0xFE,0x7F,/*"度",1*/
- };
复制代码
|
|