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 }
操作STC单片机(如:STC89C52RC单片机)自带EEPROM掉电保存数据存储器存储数码管显示按秒递增四位数字的项目工程
猜你喜欢
转载自www.cnblogs.com/AChenWeiqiangA/p/12304848.html
今日推荐
周排行