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

  1 #include <intrins.h>
  2 #include <reg52.h>
  3 #define uchar unsigned char // 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
  4 #define uint unsigned int//自定义uint为unsigned int(即有符号整数型数据,数据范围:0到65535。)
  5 #define ISP_ReadCommand 0x01 //自定义ISP的读字节操作
  6 #define ISP_WriteCommand 0x02//自定义ISP的写字节操作
  7 #define ISP_EraseCommand 0x03 //自定义ISP的擦除扇区操作
  8 #define ERROR   0
  9 #define OK      1
 10 uint count,value;
 11 uint ge,shi,bai,qian;
 12 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
 13 //#define WAIT_TIME   0x00     //mcu clock 40mhz
 14 #define WAIT_TIME   0x01     //mcu clock 20mhz
 15 //#define WAIT_TIME   0x02     //mcu clock 10mhz
 16 //#define WAIT_TIME   0x03     //mcu clock 5mhz
 17 sfr ISP_DATA=0xe2;  //Flash数据寄存器
 18 sfr ISP_ADDRH=0xe3; //Flash高字节地址寄存器
 19 sfr ISP_ADDRL=0xe4; //Flash低字节地址寄存器
 20 sfr ISP_CMD=0xe5;   //Flash命令模式寄存器
 21 sfr ISP_TRIG=0xe6;  //Flash命令触发寄存器
 22 sfr ISP_CONTR=0xe7; //ISP/IAP 控制寄存器
 23   void Delay(uint z)//延时程序
 24 {
 25    uint x,y;
 26    for(x=z;x>0;x--)
 27     for(y=110;y>0;y--);
 28  }
 29   void OPEN_ISP_IAP()//打开ISP/IAP功能函数 
 30 {
 31    EA=0;//关中断
 32    ISP_CONTR=ISP_CONTR&0x18;//0001,1000
 33    ISP_CONTR=ISP_CONTR|WAIT_TIME;//写入硬件延时
 34    ISP_CONTR=ISP_CONTR|0x80;//ISPEN = 1     
 35  }
 36   void CLOSE_ISP_IAP()//关闭ISP/IAP功能函数 
 37 {
 38    ISP_CONTR=ISP_CONTR & 0x7f; //ISPEN = 0
 39    ISP_TRIG=0x00;//
 40    EA=1;//开中断
 41  }
 42   void ActiveOperate(void)//触发执行函数
 43 {
 44    OPEN_ISP_IAP();//打开ISP/IAP功能
 45    ISP_TRIG=0x46;  //触发ISP_IAP命令字节1
 46    ISP_TRIG=0xb9;  // 触发ISP_IAP命令字节2
 47    _nop_();
 48  }
 49   uchar ReadByte(uint byteaddress)//读字节函数
 50 {
 51    ISP_ADDRH=(uchar)(byteaddress >> 8);//地址赋值
 52    ISP_ADDRL=(uchar)(byteaddress&0x00ff);//
 53    ISP_CMD=ISP_CMD&0xf8;//清除低3位
 54    ISP_CMD=ISP_CMD|ISP_ReadCommand;//写入读命令
 55    ActiveOperate();//触发执行
 56    CLOSE_ISP_IAP();//关闭ISP/IAP功能
 57    return (ISP_DATA);//返回读到的数据
 58  }
 59   void SectorErase(uint sectoraddress)//扇区删除函数
 60 {
 61    uint isectoraddress;
 62    isectoraddress=(sectoraddress&0xfe00);//取扇区地址
 63    ISP_ADDRH=(uchar)(isectoraddress >> 8);//地址赋值
 64    ISP_ADDRL=0x00;//
 65    ISP_CMD=ISP_CMD&0xf8;//清除低3位
 66    ISP_CMD=ISP_CMD|ISP_EraseCommand;//擦除命令3
 67    ActiveOperate();//触发执行
 68    CLOSE_ISP_IAP();//关闭ISP/IAP功能
 69  }
 70   void WriteByte(uint byteaddress,uchar originaldata)//写字节函数
 71 {
 72    ISP_ADDRH=(uchar)(byteaddress >> 8);//取地址
 73    ISP_ADDRL=(uchar)(byteaddress&0x00ff);//
 74    ISP_CMD=ISP_CMD&0xf8;//清除低3位
 75    ISP_CMD=ISP_CMD|ISP_WriteCommand;//写命令2
 76    ISP_DATA=originaldata;//写入数据准备
 77    ActiveOperate();//触发执行
 78    CLOSE_ISP_IAP();//关闭ISP/IAP功能
 79  }
 80   void ShuMaGuanDisplayValue(uint value)//数码管显示数值函数
 81 {  
 82    ge=value%10;
 83    shi=value%100/10;
 84    bai=value%1000/100;
 85    qian=value/1000;
 86   
 87    P2=0xf7;//数码管个位显示位
 88    P0=table[ge];//数码管个位数值显示
 89    Delay(5);//延时
 90 
 91    P2=0xfb;//数码管十位显示位
 92    P0=table[shi];//数码管十位数值显示
 93    Delay(5);//延时
 94    
 95    P2=0xfd;//数码管百位显示位
 96    P0=table[bai];//数码管百位数值显示
 97    Delay(5);//延时
 98    
 99    P2=0xfe;//数码管千位显示位
100    P0=table[qian];//数码管千位数值显示
101    Delay(5);//延时
102  }
103   void Timer0Init()
104 {
105    TMOD=0x01;//设定定时器类型为定时器0,定时器工作模式为模式0。
106    TH0=(65536-50000)/256;//TH0装初值
107    TL0=(65536-50000)%256;//TL0装初值
108    EA=1;//开启定时器总中断
109    ET0=1;//开启定时器0中断开关
110    TR0=1;//启动定时器0
111  }
112   void Timer0() interrupt 1//定时器0中断函数
113 {
114    TH0=(65536-50000)/256;//TH0重新装值
115    TL0=(65536-50000)%256;//TL0重新装值
116    count++;//定时器0中断次数变量先赋值再加
117   }
118   void main()//主函数
119 {
120    Timer0Init();//定时器0初始化函数
121    value=ReadByte(0x2000);//
122    while(1)
123  {
124       if(count==18)//判断定时器0中断次数变量是否为18次
125   {
126      count=0;//定时器0中断次数变量归零
127      value++;//数值变量先赋值再加
128      SectorErase(0x2000);//
129      WriteByte(0x2000,value);//
130      if(value==3600)//判断秒钟变量是否达到60秒
131    {
132       value=0;//数值变量归零  
133      }
134     }
135      ShuMaGuanDisplayValue(value);
136    }
137  }

猜你喜欢

转载自www.cnblogs.com/AChenWeiqiangA/p/12304848.html