zoukankan      html  css  js  c++  java
  • 操作STC单片机(如:STC89C52RC单片机)自带EEPROM掉电保存数据存储器存储数码管显示按秒递增四位数字的项目工程

    #include <reg52.h>//52单片机头文件
    #include <intrins.h>//intrins.h文件
    #define uchar unsigned char   // 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
    #define uint unsigned int     //自定义uint为unsigned int(即有符号整数型数据,数据范围:0到65535。)
    #define ISP_ReadCommand 0x01  //自定义ISP的读字节操作
    #define ISP_WriteCommand 0x02 //自定义ISP的写字节操作
    #define ISP_EraseCommand 0x03 //自定义ISP的擦除扇区操作
    #define ERROR   0
    #define OK         1
    sbit duanxuan=P2^6;
    sbit weixuan=P2^7;    
    uint count,value;//声明定时器0中断次数变量、数值变量
    uint ge,shi,bai,qian;//声明数码管个位变量、数码管十位变量、数码管百位变量、数码管千位变量
    uint valuege,valueshi,valuebai,valueqian;//声明数值变量个位变量、数值变量十位变量、数值变量百位变量、数值变量千位变量
    uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
    //#define WAIT_TIME   0x00     //mcu clock 小于 40mhz
    //#define WAIT_TIME   0x01     //mcu clock 小于 20mhz
    //#define WAIT_TIME   0x02     //mcu clock 小于 10mhz
    #define WAIT_TIME   0x03       //mcu clock 小于 5mhz
    sfr ISP_DATA=0xe2;  //Flash数据寄存器
    sfr ISP_ADDRH=0xe3; //Flash高字节地址寄存器
    sfr ISP_ADDRL=0xe4; //Flash低字节地址寄存器
    sfr ISP_CMD=0xe5;   //Flash命令模式寄存器
    sfr ISP_TRIG=0xe6;  //Flash命令触发寄存器
    sfr ISP_CONTR=0xe7; //ISP/IAP 控制寄存器
    //  void Delay100us()    //晶振11.0592MHz,100微妙延时。
    //{
    //   unsigned char i, j;
    //   _nop_();
    //   _nop_();
    //   i = 2;
    //   j = 15;
    //   do
    // {
    //    while (--j);
    //   } 
    //   while (--i);
    // }
      void Delay(uint z)//延时程序
    {
       uint x,y;
       for(x=z;x>0;x--)
        for(y=110;y>0;y--);
     }
      void OPEN_ISP_IAP()//打开ISP/IAP功能函数 
    {
       EA=0;//关中断
       ISP_CONTR=ISP_CONTR&0x18;//0001,1000
       ISP_CONTR=ISP_CONTR|WAIT_TIME;//写入硬件延时
       ISP_CONTR=ISP_CONTR|0x80;//ISPEN=1    
     }
      void CLOSE_ISP_IAP()//关闭ISP/IAP功能函数 
    {
       ISP_CONTR=ISP_CONTR&0x7f;//ISPEN=0
       ISP_TRIG=0x00;//关掉与ISP有关的特殊功能寄存器
       EA=1;//开中断
     }
      void ActiveOperate(void)//触发执行函数
    {
       OPEN_ISP_IAP(); //打开ISP/IAP功能
       ISP_TRIG=0x46;  //触发ISP_IAP命令字节1
       ISP_TRIG=0xb9;  // 触发ISP_IAP命令字节2
       _nop_();//延时
     }
      uchar ReadByte(uint byteaddress)//读字节函数
    {
       ISP_ADDRH=(uchar)(byteaddress>>8);//高8位字节地址
       ISP_ADDRL=(uchar)(byteaddress&0x00ff);//低8位字节地址
       ISP_CMD=ISP_CMD&0xf8;//清除低3位
       ISP_CMD=ISP_CMD|ISP_ReadCommand;//写入读命令
       ActiveOperate();//触发执行
       CLOSE_ISP_IAP();//关闭ISP/IAP功能
       return (ISP_DATA);//返回读到的数据
     }
      void SectorErase(uint sectoraddress)//删除扇区函数
    {
       uint isectoraddress;//声明扇区地址变量
       isectoraddress=(sectoraddress&0xfe00);//扇区地址赋值
       ISP_ADDRH=(uchar)(isectoraddress>>8);//高8位字节地址
       ISP_ADDRL=0x00;//低8位字节地址复位
       ISP_CMD=ISP_CMD&0xf8;//清除低3位
       ISP_CMD=ISP_CMD|ISP_EraseCommand;//擦除命令3
       ActiveOperate();//触发执行
       CLOSE_ISP_IAP();//关闭ISP/IAP功能
     }
      void WriteByte(uint byteaddress,uchar originaldata)//写字节函数
    {
       ISP_ADDRH=(uchar)(byteaddress>>8);//高8位字节地址
       ISP_ADDRL=(uchar)(byteaddress&0x00ff);//低8位字节地址
       ISP_CMD=ISP_CMD&0xf8;//清除低3位
       ISP_CMD=ISP_CMD|ISP_WriteCommand;//写命令2
       ISP_DATA=originaldata;//写入数据准备
       ActiveOperate();//触发执行
       CLOSE_ISP_IAP();//关闭ISP/IAP功能
     }
      void ShuMaGuanDisplayValue(uint value)//数码管显示数值函数
    {  
       qian=value/1000;//数码管千位变量
       bai=value%1000/100;//数码管百位变量
       shi=value%100/10;//数码管十位变量
       ge=value%10;//数码管个位变量
      
    //
    //   P2=0xfe;//数码管千位显示位
    //   P0=table[qian];//数码管千位数值显示
    //   Delay(5);//延时
    
    //   P2=0xfd;//数码管百位显示位
    //   P0=table[bai];//数码管百位数值显示
    //   Delay(5);//延时
    
    //   P2=0xfb;//数码管十位显示位
    //   P0=table[shi];//数码管十位数值显示
    //   Delay(5);//延时 
    
    //   P2=0xf7;//数码管个位显示位
    //   P0=table[ge];//数码管个位数值显示
    //   Delay(5);//延时
    
       weixuan=1;
       P0=0xfe;//数码管千位显示位
       weixuan=0;
       duanxuan=1;
       P0=table[qian];//数码管千位数值显示
       duanxuan=0;
       P0=0xff;
       Delay(5);//延时
    
       weixuan=1;
       P0=0xfd;//数码管百位显示位
       weixuan=0;
       duanxuan=1;
       P0=table[bai];//数码管百位数值显示
       duanxuan=0;
       P0=0xff;
       Delay(5);//延时
      
       weixuan=1;
       P0=0xfb;//数码管十位显示位
       weixuan=0;
       duanxuan=1;
       P0=table[shi];//数码管十位数值显示
       duanxuan=0;
       P0=0xff;
       Delay(5);//延时
    
       weixuan=1;
       P0=0xf7;//数码管个位显示位
       weixuan=0;
       duanxuan=1;
       P0=table[ge];//数码管个位数值显示
       duanxuan=0;
       P0=0xff;
       Delay(5);//延时 
     }
      void Timer0Init()//定时器0初始化
    {
       TMOD=0x01;//设定定时器类型为定时器0,定时器工作模式为模式0。
       TH0=(65536-50000)/256;//TH0装初值
       TL0=(65536-50000)%256;//TL0装初值
       EA=1;//开启定时器总中断
       ET0=1;//开启定时器0中断开关
       TR0=1;//启动定时器0
     }
      void Timer0() interrupt 1//定时器0中断函数
    {
       TH0=(65536-50000)/256;//TH0重新装值
       TL0=(65536-50000)%256;//TL0重新装值
       count++;//定时器0中断次数变量先赋值再加
      }
      void main()//主函数
    {
       Timer0Init();//定时器0初始化函数
       value=ReadByte(0x2004)*1000+ReadByte(0x2003)*100+ReadByte(0x2002)*10+ReadByte(0x2001);//断电后,读取EEPROM存储器掉电保存的数据。  
       if(value>=3600)//判断数值变量是否大于等于3600
       value=0;//数值变量置0
       while(1)//固定循环
     {
        if(count==18)//判断定时器0中断次数变量是否为18次
      {
         count=0;//定时器0中断次数变量归零
         value++;//数值变量先赋值再加
         valueqian=value/1000;//数值变量千位变量
         valuebai=value%1000/100;//数值变量百位变量
         valueshi=value%100/10;//数值变量十位变量
         valuege=value%10;//数值变量个位变量
         SectorErase(0x2000);//擦除EEPROM第一扇区
         WriteByte(0x2004,valueqian);//对EEPROM第一扇区第4个扇区地址(从第0个扇区地址数起)重新写入数据
         WriteByte(0x2003,valuebai);//对EEPROM第一扇区第3个扇区地址(从第0个扇区地址数起)重新写入数据
         WriteByte(0x2002,valueshi);//对EEPROM第一扇区第2个扇区地址(从第0个扇区地址数起)重新写入数据
         WriteByte(0x2001,valuege);//对EEPROM第一扇区第1个扇区地址(从第0个扇区地址数起)重新写入数据
         if(value==3600)//判断数值变量是否达到3600
       {
          value=0;//数值变量归零  
         }
        }
        ShuMaGuanDisplayValue(value);//数码管显示数值     
       }
     }

  • 相关阅读:
    fastDFS与nginx整合2
    fastDFS分布式文件系统
    NIO编程
    Nginx正向代理与反向代理
    JAVA序列化
    FileUpload问题
    测试覆盖率实现技术
    Hutool 功能特色:
    自建右键服务器
    20191123-SWITCH后面跟的参数不能为string类型
  • 原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12304848.html
Copyright © 2011-2022 走看看