- #include < reg52.h >
- #include < intrins.h >
- #define uchar unsigned char
- #define uint unsigned int
- sbit LEDB=P1^0; //---LED蓝灯
- sbit LEDR=P1^1; //LED红灯
- sbit LEDG=P1^2; //LED绿色
- sbit LEDC=P1^3;//白的灯泡
- bit ledjc=0;//led检测 ,
- sbit k1=P1^4; //---按键1
- sbit k2=P1^5; //---按键2
- sbit k3=P1^6; //---按键3
- sbit stop=P1^7; //---按键4
- sbit DQ1 = P2^0; //温度显示
- sbit E=P2^7; //1602使能引脚
- sbit RW=P2^6; //1602读写引脚
- sbit RS=P2^5; //1602数据/命令选择引脚
- ucharrcount,bCount,yCount,rZKB,bZKB,yZKB,temp;
- uchar TempBuffer[5],temp_value,play,wendu;
- uchar ge,shi,bai,num,wendu,play,mode;
- uint PWM_LOW=0;//定义周期并赋值
- uint bCYCLE=900,rCYCLE=700,gCYCLE=600;
- void inti();
- void keyscan();
- void display();
- void display1();
- void display2();
- void fuction();
- void delayms(uint z);
- void Delay(unsigned int t); //函数声明
- void show_temperture();
- uchar key();
- void Delay(uint t);
- /********************************************************************
- * 名称 :delay()
- * 功能 : 延时,延时时间大概为5US。
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void delay()
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- void delayms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /********************************************************************
- * 名称 : bitBusy(void)
- * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- bit Busy(void)
- {
- bitbusy_flag = 0;
- RS= 0;
- RW= 1;
- E= 1;
- delay();
- busy_flag= (bit)(P0 & 0x80);
- E= 0;
- returnbusy_flag;
- }
- /********************************************************************
- * 名称 :wcmd(uchar del)
- * 功能 : 1602命令函数
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- void wcmd(uchar del)
- {
- while(Busy());
- RS= 0;
- RW= 0;
- E= 0;
- delay();
- P0= del;
- delay();
- E= 1;
- delay();
- E= 0;
- }
- /********************************************************************
- * 名称 :wdata(uchar del)
- * 功能 : 1602写数据函数
- * 输入 : 需要写入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void wdata(uchar del)
- { while(Busy());
- RS= 1;
- RW= 0;
- E= 0;
- delay();
- P0= del;
- delay();
- E= 1;
- delay();
- E= 0;
- }
- /********************************************************************
- * 名称 :L1602_init()
- * 功能 : 1602初始化,请参考1602的资料
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void L1602_init(void)
- {
- wcmd(0x38);
- delay();
- wcmd(0x38);
- delay();
- wcmd(0x38);
- delay();
- wcmd(0x38);
- delay();
- wcmd(0x0c);
- wcmd(0x06);
- delay();
- wcmd(0x01);
- }
- /********************************************************************
- * 名称 :L1602_char(uchar hang,uchar lie,char sign)
- * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
- L1602_char(1,5,'b')
- * 输入 : 行,列,需要输入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void L1602_char(uchar hang,ucharlie,uchar sign)
- {
- uchar a;
- if(hang== 1) a = 0x80;
- if(hang== 2) a = 0xc0;
- a= a + lie - 1;
- wcmd(a);
- wdata(0x30+sign);
- }
- /********************************************************************
- * 名称 :L1602_string(uchar hang,uchar lie,uchar *p)
- * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
- L1602_string(1,5,"ab cd ef;")
- * 输入 : 行,列,需要输入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void L1602_string(uchar hang,ucharlie,uchar *p)
- {
- uchara,b=0;
- if(hang== 1) a = 0x80;
- if(hang== 2) a = 0xc0;
- a= a + lie - 1;
- while(1)
- {
- wcmd(a++);
- b++;
- if((*p == '\0')||(b==16)) break;
- wdata(*p);
- p++;
- }
- }
- /**********************************************************/
- // 定时器 0中断服务程序.
- /*********************************************************/
- void timer0() interrupt 1
- {
- TH0=(65536-10)/256;//装入初值,定时50ms;
- TL0=(65536-10)%256;
- rcount++;
- bCount++;
- yCount++;
- if(rcount>599) rcount=0;
- if(bCount>599)bCount=0;
- if(yCount>599)yCount=0;
- if (rcount>=rZKB)
- {LEDG=1;}
- else
- {LEDG=0;}
- if (yCount>=yZKB)
- {LEDR=1;}
- else
- {LEDR=0;}
- if (bCount>=bZKB)
- {LEDB=1;}
- else
- {LEDB=0;}
- }
- void w1()
- { rZKB++;
- if(rZKB>=600&&rZKB<600)
- rZKB=599;
- if(rZKB>=600)
- rZKB = 0;
- //num=0;
- }
- void w2()
- {
- bZKB ++;
- if(bZKB>=600&&bZKB<600)
- bZKB=599;
- if(bZKB>=600)
- bZKB = 0;
- //num=0;
- }
- void w3()
- { delay();
- yZKB ++;
- if(yZKB>=600&&yZKB<600)
- yZKB=599;
- if(yZKB>=600)
- yZKB = 0;
- //num=0;
- }
- //启动输出
- void w4()
- {
- if((rZKB<=600)&&(0==ledjc))
- {
- rZKB+=8;
- if(rZKB>600)
- {
- ledjc=1;
- rZKB=600;
- }
- }
- if((rZKB>=0)&&(1==ledjc))
- {
- rZKB-=8;
- if(rZKB<0)
- {
- ledjc=0;
- rZKB=0;
- }
- num=0;
- }
- }
- void w5()
- {
- bZKB +=8;
- if(bZKB>=600&&bZKB<600)
- bZKB=599;
- if(bZKB>=600)
- bZKB = 0;
- num=0;
- }
- void w6()
- {
- //delay();
- yZKB +=8;
- if(yZKB>=600&&yZKB<600)
- yZKB=599;
- if(yZKB>=600)
- yZKB = 0;
- num=0;
- }
- /*********************************************************/
- // 定时器初始化
- /*********************************************************/
- void inti()
- {
- TMOD=0x1;//T0方式1工作
- IE=0x82;//EA=1;允许所有中断,ET0==1;允许T0中断
- TH0=(65536-8)/256;//装入初值,定时50ms;
- TL0=(65536-8)%256;
- TR0=1;//启动定时器
- }
- /*******************************************************
- //LCD1602占空比显示程序
- *******************************************************/
- void display()
- {
- L1602_string(1,1,"B");
- bai=(uchar)rZKB/100;
- shi=(uchar)rZKB%100/10;
- ge=(uchar)rZKB%10;
- delay();
- L1602_char(1,2,bai);
- L1602_char(1,3,shi);
- L1602_string(1,4,".");
- L1602_char(1,5,ge);
- L1602_string(1,6,"%");
- }
- void display1()
- {
- L1602_string(1,8,"R");
- bai=(uchar)bZKB/100;
- shi=(uchar)bZKB%100/10;
- ge=(uchar)bZKB%10;
- delay();
- L1602_char(1,9,bai);
- L1602_char(1,10,shi);
- L1602_string(1,11,".");
- L1602_char(1,12,ge);
- L1602_string(1,13,"%");
- }
- void display2()
- {
-
- L1602_string(2,1,"G");
- bai=(uchar)yZKB/100;
- shi=(uchar)yZKB%100/10;
- ge=(uchar)yZKB%10;
- delay();
- L1602_char(2,2,bai);
- L1602_char(2,3,shi);
- L1602_string(2,4,".");
- L1602_char(2,5,ge);
- L1602_string(2,6,"%");
- }
- /*------------------------------------------------
- 延时函数,含有输入参数 unsigned int t,无返回值
- unsigned int 是定义无符号整形变量,其值的范围是
- 0~65535
- ------------------------------------------------*/
- void Delay(uint t)
- {
- while(--t);
- }
- /*------------------------------------------------
- 自动播放
- ------------------------------------------------*/
- void display3 ()
- {
- while (1) //主循环
- {
- show_temperture();
- LEDB=1;
- Delay(60000); //特意加延时,可以看到熄灭的过程
- for(PWM_LOW=1;PWM_LOW<bCYCLE;PWM_LOW++)
- {//PWM_LOW表示低
- //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
- LEDB=0; //点亮LED
- Delay(PWM_LOW);//延时长度,600次循环中从1加至599
- LEDB=1; //熄灭LED
- Delay(bCYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
- }
- LEDB=0;
- for(PWM_LOW=bCYCLE-1;PWM_LOW>0;PWM_LOW--)
- {//与逐渐变亮相反的过程
- LEDB=0;
- Delay(PWM_LOW);
- LEDB=1;
- Delay(bCYCLE-PWM_LOW);
- }
- /********************************************
- //红灯
- *****************************************/
- LEDR=1;
- Delay(60000); //特意加延时,可以看到熄灭的过程
- for(PWM_LOW=1;PWM_LOW<rCYCLE;PWM_LOW++)
- {//PWM_LOW表示低
- //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
- LEDR=0; //点亮LED
- Delay(PWM_LOW);//延时长度,600次循环中从1加至599
- LEDR=1; //熄灭LED
- Delay(rCYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
- }
- LEDR=0;
- for(PWM_LOW=rCYCLE-1;PWM_LOW>0;PWM_LOW--)
- {//与逐渐变亮相反的过程
- LEDR=0;
- Delay(PWM_LOW);
- LEDR=1;
- Delay(rCYCLE-PWM_LOW);
- }
- /********************************************
- //绿灯灯
- *****************************************/
- LEDG=1;
- Delay(60000); //特意加延时,可以看到熄灭的过程
- for(PWM_LOW=1;PWM_LOW<bCYCLE;PWM_LOW++)
- {//PWM_LOW表示低
- //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
- LEDG=0; //点亮LED
- Delay(PWM_LOW);//延时长度,600次循环中从1加至599
- LEDG=1; //熄灭LED
- Delay(bCYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
- }
- LEDB=0;
- for(PWM_LOW=bCYCLE-1;PWM_LOW>0;PWM_LOW--)
- {//与逐渐变亮相反的过程
- LEDG=0;
- Delay(PWM_LOW);
- LEDG=1;
- Delay(bCYCLE-PWM_LOW);
- }
- if(stop==1);
- break; //主循环中添加其他需要一直工作的程序
- }
- }
-
- /*********************************************************/
- // 键盘扫描
- /*********************************************************/
- void keyscan()
- {
- inti();
- if(k1==0)
- w1();
- if(k2==0)
- w2();
- if(k3==0)
- w3();
- }
- /****************************************************
- //矩阵键盘调用
- *****************************************************/
- uchar key()
- {
- P3=0xfe;
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delayms(5);
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- { temp=P3;
- switch(temp)
- {
- case 0xee:num=1;
- break;
- case 0xde:num=2;
- break;
- case 0xbe:num=3;
- break;
- case 0x7e:num=4;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- P3=0xfd;
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delayms(5);
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- { temp=P3;
- switch(temp)
- {
- case 0xed:num=5;
- break;
- case 0xdd:num=6;
- break;
- case 0xbd:num=7;
- break;
- case 0x7d:num=8;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- P3=0xfb;
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delayms(5);
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- { temp=P3;
- switch(temp)
- {
- case 0xeb:num=9;
- break;
- case 0xdb:num=10;
- break;
- case 0xbb:num=11;
- break;
- case 0x7b:num=12;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- P3=0xf7;
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delayms(5);
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- { temp=P3;
- switch(temp)
- {
- case 0xe7:num=13;
- break;
- case 0xd7:num=14;
- break;
- case 0xb7:num=15;
- break;
- case 0x77:num=16;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- return num;
- }
- /***********ds18b20子程序*************************/
- /***********ds18b20延迟子函数(晶振12MHz )*******/
- void delay_18B20(unsigned int i)
- {
- while(i--);
- }
- /**********ds18b20初始化函数**********************/
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ1 = 1; //DQ复位
- delay_18B20(8); //稍做延时
- DQ1 = 0; //单片机将DQ拉低
- delay_18B20(80); //精确延时 大于 480us
- DQ1 = 1; //拉高总线
- delay_18B20(14);
- x=DQ1; //稍做延时后 如果x=0则初始化成功 x=1则初始
- delay_18B20(20);
- }
- /***********ds18b20读一个字节**************/
- unsigned char ReadOneChar(void)
- {
- uchari=0;
- uchardat = 0;
- for(i=8;i>0;i--)
- {
- DQ1= 0; // 给脉冲信号
- dat>>=1;
- DQ1= 1; // 给脉冲信号
- if(DQ1)
- dat|=0x80;
- delay_18B20(4);
- }
- return(dat);
- }
- /*************ds18b20写一个字节****************/
- void WriteOneChar(uchar dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ1 =0;
- DQ1= dat&0x01;
- delay_18B20(5);
- DQ1= 1;
- dat>>=1;
- }
- }
- /**************读取ds18b20当前温度************/
- void ReadTemp(void)
- { unsignedchar a=0;
- unsignedchar b=0;
- unsignedchar t=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- delay_18B20(100); // this message is Very important
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)
- delay_18B20(100);
- a=ReadOneChar(); //读取温度值低位
- b=ReadOneChar(); //读取温度值高位
- temp_value=b<<4;
- temp_value+=(a&0xf0)>>4;
- }
- void temp_to_str() //温度数据转换成液晶字符显示
- {
- TempBuffer[0]=temp_value/10+'0'; //十位
- TempBuffer[1]=temp_value%10+'0'; //个位
- TempBuffer[2]=0xdf; //温度符号
- TempBuffer[3]='C';
- TempBuffer[4]='\0';
- }
- void show_temperture() //液晶显示程序
- {
- ReadTemp(); //开启温度采集程序
- temp_to_str(); //温度数据转换成液晶字符
- L1602_string(2,7,"temp1:");
- L1602_string(2,13,TempBuffer); //显示温度
- }
- voidTEM_INIT()
- {
- Init_DS18B20( ); //DS18B20初始化
- }
- void fuction()
- { if(key()==1)
- w4();
- if(key()==2)
- w5();
- if(key()==3)
- w6();
- }
- /*************************************************
- //主函数
- ***************************************************/
- voidmain()
- {
- //inti();
- LEDC=0;
- L1602_string(1,1,"Instructor ZHF");
- L1602_string(2,1,"Produced by MZM");
- delayms(500);
- L1602_init();
- TEM_INIT();
- display3 ();
- while(1)
- { //display3 ();
- //keyscan ();
- keyscan ();
- fuction ();
- display ();
- display1 ();
- display2 ();
- //display3 ();
- }
- }
-
-
复制代码
|