|
为什么在stc89c52上可以执行的程序在at89s52上无法执行???
[复制链接]
/*********************定义单片机头文件*********************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
/************************变量声明************************/
uchar lcd_x,lcd_y,data_byte=0,count;
uint TH_data,TL_data,RH_data,RL_data,CK_data;//传回的40位数据
uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;//处理后的数据
uint TH=28,TL=18,RH=80,RL=30;//温湿度上下限
uint numb,timer;//DHT11数据传输标志位
uint flag=0;//温湿度设置标志位(0:正常显示温度,1:上限温度值设置,2:下限温度值设置,3:上限湿度值设置,4:下限湿度值设置)
/*********************定义单片机I/O口*********************/
sbit BEEP=P1^5;//蜂鸣器
sbit DATA=P2^1;//DHT11总线
sbit PSB=P2^2;//并串口选择信号
sbit RST=P2^4;//复位信号
sbit RW=P2^5;//读写信号
sbit RS=P2^6;//并行指令,数据选择信号
sbit EN=P2^7;//并行使能信号
sbit K1=P3^0;//独立按键OK
sbit K2=P3^1;//独立按键MODE
sbit K3=P3^2;//独立按键+
sbit K4=P3^3;//独立按键-
sbit WG=P3^4;//温度高报警、控制
sbit WD=P3^5;//温度低报警、控制
sbit SG=P3^6;//湿度高报警、控制
sbit SD=P3^7;//湿度低报警、控制
/*************************函数声明*************************/
void read_DATA();//开始信号,读数据并校验
void delay(uint a);//延时函数
void delay1();//10us延时
void delay2(uint a);//延时函数
void LCD_init();//LCD初始化程序
void write_cmd(uchar cmd);//写指令
void write_data(uchar dat);//写数据
void IntConfiguration();//设置外部中断
void lcd_dis_code(uint cmd_addr,uchar num,uchar dis[]);//显示函数
void lcd_pos(unsigned char X,unsigned char Y);//LCD显示位置计算
void warning();//报警、控制程序
void shezhi();//设置上下线
void T();//温度上下限显示函数
void R();//湿度上下限显示函数
void xianshi();//温湿度显示函数
bit check_busy();//检测LCD忙信号
/************************定义数组*************************/
uchar code lcd0[]={"智能温湿度控制器"};
uchar code lcd1[]={"温度:"};
uchar code lcd2[]={"湿度:"};
uchar code lcd3[]={"℃ "};
uchar code lcd4[]={"%RH "};
uchar code lcd5[]={"温湿度上下限设置"};
uchar code lcd6[]={"上限:"};
uchar code lcd7[]={"下限:"};
uchar code lcd8[]={" 欢迎进入 "};
uchar code lcd9[]={"WELCOME"};
uchar code lcd10[]={"电子科学技术专业"};
uchar code lcd11[]={"******韩运******"};
uchar str1[]={""};//湿度数据
uchar str2[]={""};//温度数据
uchar str3[]={""};//温度上限TH
uchar str4[]={""};//温度下限TL
uchar str5[]={""};//湿度上限RH
uchar str6[]={""};//湿度下限RL
/**************************主函数***************************/
void main()
{
K1=K2=K3=K4=1;
LCD_init();//LCD初始化
lcd_dis_code(0x80,16,lcd8);
delay(50);
lcd_dis_code(0x92,7,lcd9);
delay(50);
lcd_dis_code(0x88,16,lcd10);
delay(50);
lcd_dis_code(0x98,16,lcd11);
delay(50);
delay(2000);
LCD_init();//LCD初始化
IntConfiguration();//中断程序
while(1)
{
shezhi();//设置上下限
if(flag==0)
{
xianshi();//显示温湿度测量值
}
else if(flag==1)
{
lcd_dis_code(0x80,16,lcd5);//显示lcd5
lcd_dis_code(0x93,4,lcd1);//显示lcd1
lcd_dis_code(0x88,6,lcd6);//显示lcd6
lcd_dis_code(0x98,6,lcd7);//显示lcd7
lcd_dis_code(0x8e,4,lcd3);//显示lcd3
lcd_dis_code(0x9e,4,lcd3);//显示lcd3
T();
if(K1==0)
{
delay(5);
if(K1==0)
{
delay(5);
TH=TH;
flag=0;
LCD_init();//LCD初始?
}
}
}
else if(flag==2)
{
lcd_dis_code(0x80,16,lcd5);//显示lcd5
lcd_dis_code(0x93,4,lcd1);//显示lcd1
lcd_dis_code(0x88,6,lcd6);//显示lcd6
lcd_dis_code(0x98,6,lcd7);//显示lcd7
lcd_dis_code(0x8e,4,lcd3);//显示lcd3
lcd_dis_code(0x9e,4,lcd3);//显示lcd3
T();
if(K1==0)
{
delay(5);
if(K1==0)
{
delay(5);
TL=TL;
flag=0;
LCD_init();//LCD初始化
}
}
}
else if(flag==3)
{
lcd_dis_code(0x80,16,lcd5);//显示lcd5
lcd_dis_code(0x93,4,lcd2);//显示lcd2
lcd_dis_code(0x88,6,lcd6);//显示lcd6
lcd_dis_code(0x98,6,lcd7);//显示lcd7
lcd_dis_code(0x8e,4,lcd4);//显示lcd4
lcd_dis_code(0x9e,4,lcd4);//显示lcd4
R();
if(K1==0)
{
delay(5);
if(K1==0)
{
delay(5);
RH=RH;
flag=0;
LCD_init();//LCD初始?
}
}
}
else if(flag==4)
{
lcd_dis_code(0x80,16,lcd5);//显示lcd5
lcd_dis_code(0x93,4,lcd2);//显示lcd2
lcd_dis_code(0x88,6,lcd6);//显示lcd6
lcd_dis_code(0x98,6,lcd7);//显示lcd7
lcd_dis_code(0x8e,4,lcd4);//显示lcd4
lcd_dis_code(0x9e,4,lcd4);//显示lcd4
R();
if(K1==0)
{
delay(5);
if(K1==0)
{
delay(5);
RL=RL;
flag=0;
LCD_init();//LCD初始?
}
}
}
}
}
/********************LCD显示温湿度函数*********************/
void xianshi()
{
uchar a,b;
lcd_dis_code(0x80,16,lcd0);//显示lcd0
lcd_dis_code(0x88,6,lcd1);//显示lcd1
lcd_dis_code(0x98,6,lcd2);//显示lcd2
lcd_dis_code(0x8e,2,lcd3);//显示lcd3
lcd_dis_code(0x9e,3,lcd4);//显示lcd4
read_DATA();//读取温湿度数据
for(a=0; a<2; a++)
{
lcd_pos(4,a+4);//LCD显示位置计算
write_data(str1[a]);//写数据
}//湿度
for(b=0; b<2; b++)
{
lcd_pos(3,b+4);//LCD显示位置计算
write_data(str2[b]);//写数据
}//温度
delay(2000);
warning();//报警、控制程序
}
/********************LCD显示位置计算函数*********************/
void lcd_pos(unsigned char X,unsigned char Y)//LCD显示位置计算函数
{
unsigned char pos;
if( X==1 )
{
pos=0x80;
}
else if(X==2)
{
pos=0x90;
}
else if(X==3)
{
pos=0x88;
}
else if(X==4)
{
pos=0x98;
}
write_cmd(Y|pos);//数据指针=80+地址变量
}
/*************************DHT11模块*************************/
uchar receive_byte()//接收一个字节
{
uchar i,temp;
for(i=0;i<8;i++)
{
count=2;
while((!DATA)&&count++)//等待50us低电平结束,并防止死循环
temp=0;
delay1();
delay1();
delay1();
if(DATA==1)
{
temp=1;
count=2;
while(DATA&&count++);
}
else
temp=0;
data_byte<<=1;
data_byte|=temp;
}
return(data_byte);
}
/*************************读数据并处理*************************/
void read_DATA()//开始信号,读数据并校验
{
DATA=0;
delay(18);//主机拉低18ms
DATA=1;//DATA总线由上拉电阻拉高 主机延时20us
delay1();
delay1();
delay1();
delay1();
DATA=1;//主机设置为输入高电平,判断从机响应信号
if(!DATA)
{
count=2;
while((!DATA)&&count++);//判断DHT11发出80us低电平响应信号是否结束
count=2;
while(DATA&&count++);//判断DHT11拉高总线80us高电平是否结束
RH_temp=receive_byte();
RL_temp=receive_byte();
TH_temp=receive_byte();
TL_temp=receive_byte();
CK_temp=receive_byte();
DATA=1;
numb=(RH_temp+RL_temp+TH_temp+TL_temp);//数据校验
if(numb==CK_temp)
{
RH_data=RH_temp;
RL_data=RL_temp;
TH_data=TH_temp;
TL_data=TL_temp;
CK_data=CK_temp;
}
}
str1[0]=(char)(0x30+RH_data/10);
str1[1]=(char)(0x30+RH_data%10);//湿度部分
str2[0]=(char)(0x30+TH_data/10);
str2[1]=(char)(0x30+TH_data%10);//温度部分
}
/**********************12864模块程序**********************/
void lcd_dis_code(uint cmd_addr,uchar num,uchar dis[])
{
uint i;
write_cmd(cmd_addr);
for(i=0;i
write_data(dis[i]);
}
/***********************12864初始化************************/
void LCD_init()
{
PSB=1;
RST=0;
delay(5);
RST=1;
delay(5);
write_cmd(0x34);//扩充指令
delay(5);
write_cmd(0x30);//基本指令
delay(5);
write_cmd(0x0c);//显示开关光标
delay(5);
write_cmd(0x01);//清屏
delay(5);
}
/************************检验忙信号************************/
bit check_busy()
{
bit temp;
RS=0;
RW=1;
EN=1;
delay(5);
temp=(bit)(P0&0x80); //按位与操作
EN=0;
return(temp);
}
/*************************写命令函数*************************/
void write_cmd(uchar cmd)
{
while(check_busy());
RS=0;
RW=0;
EN=0;
delay(5);
P0=cmd;
delay(5);
EN=1;
delay(5);
EN=0;
}
/*************************写数据函数*************************/
void write_data(uchar dat)
{
while(check_busy());
RS=1;
RW=0;
EN=0;
P0=dat;
delay(5);
EN=1;
delay(5);
EN=0;
}
/**************************延迟函数**************************/
void delay(uint a)
{
uchar i;
while(a--)
{
for(i=0;i<100;i++);
}
}
/********************延时函数1(10us)***********************/
void delay1()//延时10us
{
unsigned char i;
for(i=0;i<3;i++);
}
/**************************延迟函数2**************************/
void delay2(uint a)
{
uchar i;
while(a--)
{
for(i=0;i<100;i++)
{
BEEP=!BEEP;
_nop_();
BEEP=!BEEP;
_nop_();
BEEP=!BEEP;
_nop_();
BEEP=!BEEP;
_nop_();
BEEP=!BEEP;
_nop_();
}
}
}
/**********************报警、控制程序**********************/
void warning()
{
WG=0;
WD=0;
SG=0;
SD=0;
BEEP=1;
if (TH_data>TH)
{
delay2(1000);
WG=1;
}
else if (TH_data
{
delay2(1000);
WD=1;
}
else if (RH_data>RH)
{
delay2(1000);
SG=1;
}
else if (RH_data
{
delay2(1000);
SD=1;
}
}
/*******************温度上下限显示函数************************/
void T()
{
uchar j,k;
str3[0]=(char)(0x30+TH/10);
str3[1]=(char)(0x30+TH%10);
str4[0]=(char)(0x30+TL/10);
str4[1]=(char)(0x30+TL%10);
for(j=0;j<2;j++)
{
lcd_pos(3,j+4);//LCD显示位置计算
write_data(str3[j]);//写数据
}
for(k=0;k<2;k++)
{
lcd_pos(4,k+4);//LCD显示位置计算
write_data(str4[k]);//写数据
}
}
/*******************湿度上下限显示函数************************/
void R()
{
uchar h,i;
str5[0]=(char)(0x30+RH/10);
str5[1]=(char)(0x30+RH%10);
str6[0]=(char)(0x30+RL/10);
str6[1]=(char)(0x30+RL%10);
for(h=0;h<2;h++)
{
lcd_pos(3,h+4);//LCD显示位置计算
write_data(str5[h]);//写数据
}
for(i=0;i<2;i++)
{
lcd_pos(4,i+4);//LCD显示位置计算
write_data(str6[i]);//写数据
}
}
/**********************外部中断设置***************************/
void IntConfiguration()
{
IT0=1;//设置INT0,跳变沿触发方式(下降沿)
EX0=1;//打开INT0的中断允许。
IT1=1;//设置INT1,跳变沿触发方式(下降沿)
EX1=1;//打开INT1的中断允许。
EA=1;//打开总中断
}
/*****选择设置选项(通过蜂鸣器的发声次数来判断设置的选项)******/
void shezhi()
{
if(K2==0)
{
delay(2);
BEEP=!BEEP;
if(K2==0)
{
delay(2);
BEEP=!BEEP;
flag=1;
}
}
delay(100);
if(K2==0)
{
delay(2);
BEEP=!BEEP;
if(K2==0)
{
delay(2);
BEEP=!BEEP;
flag=2;
}
}
delay(100);
if(K2==0)
{
delay(2);
BEEP=!BEEP;
if(K2==0)
{
delay(2);
BEEP=!BEEP;
flag=3;
}
}
delay(100);
if(K2==0)
{
delay(2);
BEEP=!BEEP;
if(K2==0)
{
delay(2);
BEEP=!BEEP;
flag=4;
}
}
}
/************** 外部中断0(+)的中断函数*********************/
void Int0() interrupt 0 //外部中断0的中断函数
{
switch(flag)
{
case 1:
{
if(K3==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
if(K3==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
TH++;//温度上限设置
}
}
}
case 2:
{
if(K3==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
if(K3==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
TL++;//温度下限设置
}
}
}
case 3:
{
if(K3==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
if(K3==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
RH++;//湿度上限设置
}
}
}
case 4:
{
if(K3==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
if(K3==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
RL++;//湿度下限设置
}
}
}
default:break;
}
}
/************** 外部中断1(-)的中断函数*********************/
void Int1() interrupt 2 //外部中断1的中断函数
{
switch(flag)
{
case 1:
{
if(K4==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
if(K4==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
TH--;//温度上限设置
}
}
}
case 2:
{
if(K4==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
if(K4==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
TL--;//温度下限设置
}
}
}
case 3:
{
if(K4==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
if(K4==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
RH--;//湿度上限设置
}
}
}
case 4:
{
if(K4==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
if(K4==0)
{
BEEP=!BEEP;//按键提示音
delay(2);
RL--;//湿度上限设置
}
}
}
default:break;
}
}
|
|