标题:
哪位大神可以教教我该如何接线
[打印本页]
作者:
技术小白123
时间:
2017-12-16 13:42
标题:
哪位大神可以教教我该如何接线
#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 ();
}
}
复制代码
作者:
xjkszc
时间:
2017-12-16 22:09
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数据/命令选择引脚 定义了引脚呀
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1