2667|3

36

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求帮助 [复制链接]

#include
#include                     //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
#define RdCommand 0x01        //定义ISP的操作命令
#define PrgCommand 0x02
#define EraseCommand 0x03       
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间
sfr ISP_DATA=0xe2;  //寄存器申明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit dula=P2^6;                //申明U1锁存器的锁存端
sbit wela=P2^7;                //申明U2锁存器的锁存端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar num,num1,flag;
void delayms(uint xms)                               
{
        uint i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)  //显示子函数
{
    dula=1;
        P0=table[shi];    //送十位段选数据
        dula=0;
        P0=0xff;                //送位选数据前关闭所有显示,防止打开位选锁存时
        wela=1;                        //原来段选数据通过位选锁存器造成混乱
        P0=0xfe;                //送位选数据
        wela=0;
        delayms(5);        //延时
        dula=1;
        P0=table[ge];  //送个位段选数据
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delayms(5);
}
/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
        EA        =        0;                                                        /* 关中断                 */
        ISP_CONTR =        ISP_CONTR & 0x18;       /* 0001,1000        */
        ISP_CONTR =        ISP_CONTR | WaitTime;        /* 写入硬件延时        */
        ISP_CONTR =        ISP_CONTR | 0x80;       /* ISPEN=1                */
}
/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
        ISP_CONTR        =        ISP_CONTR & 0x7f;        /* ISPEN = 0 */
        ISP_TRIG        =        0x00;
        EA                        =   1;                        /* 开中断 */
}
/* ================ 公用的触发代码 ==================== */
void ISPgoon(void)
{
        ISP_IAP_enable();                        /* 打开 ISP,IAP 功能        */
        ISP_TRIG        =        0x46;                /* 触发ISP_IAP命令字节1        */
        ISP_TRIG        =        0xb9;                /* 触发ISP_IAP命令字节2        */
        _nop_();
}
/* ==================== 字节读 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
        ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值        */
        ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
        ISP_CMD   = ISP_CMD        & 0xf8;                        /* 清除低3位         */
        ISP_CMD   = ISP_CMD        | RdCommand;        /* 写入读命令        */
        ISPgoon();                                                        /* 触发执行                */
        ISP_IAP_disable();                                /* 关闭ISP,IAP功能        */
        return (ISP_DATA);                                /* 返回读到的数据        */
}
/* ================== 扇区擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
        unsigned int iSectorAddr;
        iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
        ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
        ISP_ADDRL = 0x00;
        ISP_CMD        = ISP_CMD & 0xf8;                        /* 清空低3位         */
        ISP_CMD        = ISP_CMD | EraseCommand;        /* 擦除命令3         */
        ISPgoon();                                                        /* 触发执行                */
        ISP_IAP_disable();                                /* 关闭ISP,IAP功能        */
}
/* ==================== 字节写 ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
        ISP_ADDRH =        (unsigned char)(byte_addr >> 8);         /* 取地址         */
        ISP_ADDRL =        (unsigned char)(byte_addr & 0x00ff);
        ISP_CMD         = ISP_CMD & 0xf8;                                /* 清低3位        */
        ISP_CMD  = ISP_CMD | PrgCommand;                /* 写命令2        */
        ISP_DATA = original_data;                        /* 写入数据准备        */
        ISPgoon();                                                        /* 触发执行                */
        ISP_IAP_disable();                                        /* 关闭IAP功能        */
}
void main()
{
        uchar a,b,num1;
        TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
        TH0=(65536-50000)/256;     
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        num1=byte_read(0x2000);//程序开始时读取EEPROM中数据
        if(num1>=60)        //防止首次上电时读取出错
                num1=0;
        while(1)
        {
                if(flag==1)
                {
                   flag=0;
                        //num1++;
                        SectorErase(0x2000);//擦除扇区
                        byte_write(0x2000,num1);//重新写入数据
                //        if(num1==60)
                //        {
                        //        num1=0;
                //        }
                        a=num1/10;
                        b=num1%10;
                }
                display(a,b);
        }
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        num++;       
         if(num==20)
         {num1++;
          num=0;
          flag=1;
          if(num1==60)
          { num1=0;}
         }
}
#include
#include                     //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
#define RdCommand 0x01        //定义ISP的操作命令
#define PrgCommand 0x02
#define EraseCommand 0x03       
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间
sfr ISP_DATA=0xe2;  //寄存器申明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit dula=P2^6;                //申明U1锁存器的锁存端
sbit wela=P2^7;                //申明U2锁存器的锁存端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar num;
void delayms(uint xms)                               
{
        uint i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)  //显示子函数
{
    dula=1;
        P0=table[shi];    //送十位段选数据
        dula=0;
        P0=0xff;                //送位选数据前关闭所有显示,防止打开位选锁存时
        wela=1;                        //原来段选数据通过位选锁存器造成混乱
        P0=0xfe;                //送位选数据
        wela=0;
        delayms(5);        //延时
        dula=1;
        P0=table[ge];  //送个位段选数据
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delayms(5);
}
/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
        EA        =        0;                                                        /* 关中断                 */
        ISP_CONTR =        ISP_CONTR & 0x18;       /* 0001,1000        */
        ISP_CONTR =        ISP_CONTR | WaitTime;        /* 写入硬件延时        */
        ISP_CONTR =        ISP_CONTR | 0x80;       /* ISPEN=1                */
}
/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
        ISP_CONTR        =        ISP_CONTR & 0x7f;        /* ISPEN = 0 */
        ISP_TRIG        =        0x00;
        EA                        =   1;                        /* 开中断 */
}
/* ================ 公用的触发代码 ==================== */
void ISPgoon(void)
{
        ISP_IAP_enable();                        /* 打开 ISP,IAP 功能        */
        ISP_TRIG        =        0x46;                /* 触发ISP_IAP命令字节1        */
        ISP_TRIG        =        0xb9;                /* 触发ISP_IAP命令字节2        */
        _nop_();
}
/* ==================== 字节读 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
        ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值        */
        ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
        ISP_CMD   = ISP_CMD        & 0xf8;                        /* 清除低3位         */
        ISP_CMD   = ISP_CMD        | RdCommand;        /* 写入读命令        */
        ISPgoon();                                                        /* 触发执行                */
        ISP_IAP_disable();                                /* 关闭ISP,IAP功能        */
        return (ISP_DATA);                                /* 返回读到的数据        */
}
/* ================== 扇区擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
        unsigned int iSectorAddr;
        iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
        ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
        ISP_ADDRL = 0x00;
        ISP_CMD        = ISP_CMD & 0xf8;                        /* 清空低3位         */
        ISP_CMD        = ISP_CMD | EraseCommand;        /* 擦除命令3         */
        ISPgoon();                                                        /* 触发执行                */
        ISP_IAP_disable();                                /* 关闭ISP,IAP功能        */
}
/* ==================== 字节写 ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
        ISP_ADDRH =        (unsigned char)(byte_addr >> 8);         /* 取地址         */
        ISP_ADDRL =        (unsigned char)(byte_addr & 0x00ff);
        ISP_CMD         = ISP_CMD & 0xf8;                                /* 清低3位        */
        ISP_CMD  = ISP_CMD | PrgCommand;                /* 写命令2        */
        ISP_DATA = original_data;                        /* 写入数据准备        */
        ISPgoon();                                                        /* 触发执行                */
        ISP_IAP_disable();                                        /* 关闭IAP功能        */
}
void main()
{
        uchar a,b,num1;
        TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
        TH0=(65536-50000)/256;     
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        num1=byte_read(0x2000);//程序开始时读取EEPROM中数据
        if(num1>=60)        //防止首次上电时读取出错
                num1=0;
        while(1)
        {
                if(num>=20)
                {
                        num=0;
                        num1++;
                        SectorErase(0x2000);//擦除扇区
                        byte_write(0x2000,num1);//重新写入数据
                        if(num1==60)
                        {
                                num1=0;
                        }
                        a=num1/10;
                        b=num1%10;
                }
                display(a,b);
        }
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        num++;       
}
这第一个程序不能正常工作显示上次的值后数就不变了,第二个就不一样了。判断的地方不一样怎么结果也不一样啊,谁能给我解释啊。
此帖出自51单片机论坛

最新回复

“这第一个程序不能正常工作显示上次的值后数就不变了,第二个就不一样了。判断的地方不一样怎么结果也不一样啊,谁能给我解释啊。”啥意思啊,好像这句话我都看不懂啊。。。。。。  详情 回复 发表于 2012-2-23 11:00
点赞 关注
 

回复
举报

207

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
看得我眼花了
此帖出自51单片机论坛
 
 
 

回复

535

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
“这第一个程序不能正常工作显示上次的值后数就不变了,第二个就不一样了。判断的地方不一样怎么结果也不一样啊,谁能给我解释啊。”啥意思啊,好像这句话我都看不懂啊。。。。。。
此帖出自51单片机论坛
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

4
 

帮助

就是第二个程序每一秒加一并显示一次并且把他写入E²PROM上电后从E2PROM中读出上次的值继续显示每秒加一。第一个程序上电后就是保持上次的值不变。

此帖出自51单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表