6931|15

7

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

为什么在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;
}
}

此帖出自51单片机论坛

最新回复

你是怎么烧录的,两种片子烧录方式不一样啊  详情 回复 发表于 2016-6-2 07:41
点赞 关注(1)
 

回复
举报

168

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
好像这两个单片机是不同厂家的吧。。。
能提出这个问题,呵呵
此帖出自51单片机论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
大神们,抓紧时间给解决一下!!!
此帖出自51单片机论坛
 
 
 

回复

831

帖子

5

TA的资源

一粒金砂(高级)

板凳
 
无法执行的表现?  编译通过?下载成功?
此帖出自51单片机论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

4
 
对啊,在stc89c52rc上完全能实现,但是烧录到at89s52上就不行了,没反应!
此帖出自51单片机论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

5
 
在用AVR 烧录at89s52时出错误提示,FLASH校验错误地址0h!!!
此帖出自51单片机论坛

点评

既然都出现提示了,那就按提示做呗 先确认下载器有没有问题,然后再确认下芯片是否损坏  详情 回复 发表于 2016-6-1 08:34
 
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

6
 
643060798 发表于 2016-5-31 22:19
在用AVR 烧录at89s52时出错误提示,FLASH校验错误地址0h!!!

既然都出现提示了,那就按提示做呗

先确认下载器有没有问题,然后再确认下芯片是否损坏
此帖出自51单片机论坛
 
 
 

回复

105

帖子

0

TA的资源

一粒金砂(中级)

7
 
是不是芯片损坏了,没写成功呢!
此帖出自51单片机论坛
 
 
 

回复

248

帖子

0

TA的资源

一粒金砂(中级)

8
 
在工程选择芯片的时候选择at89s52
此帖出自51单片机论坛
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

9
 
这两个能直接替换?仔细看看两者的data sheet!
此帖出自51单片机论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

10
 
haixinghp 发表于 2016-6-1 11:17
在工程选择芯片的时候选择at89s52

选择的就是at89s52,可是还是不行!
此帖出自51单片机论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

11
 
yang_alex 发表于 2016-6-1 15:01
这两个能直接替换?仔细看看两者的data sheet!

看过了,却是有的不同,可是建立工程时选择的是AT89S52的啊。。。
此帖出自51单片机论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

12
 
tianshuihu 发表于 2016-6-1 08:34
既然都出现提示了,那就按提示做呗

先确认下载器有没有问题,然后再确认下芯片是否损坏

正在尝试。。。
此帖出自51单片机论坛
 
 
 

回复

1488

帖子

2

TA的资源

纯净的硅(中级)

13
 
先烧录成功吧 然后点个灯验证芯片是否是好的
此帖出自51单片机论坛
 
个人签名专业从事于在线监测振动、转速、轴振动、位移等,设备管理及故障检测振动诊断系统在线监测点巡检系统-现场动平衡仪-测振仪、便携式测振仪
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

15
 
选AT89S52编译时有什么提示吗?
此帖出自51单片机论坛
 
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

16
 
你是怎么烧录的,两种片子烧录方式不一样啊
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表