// 中断函数注意养成指定寄存器组的习惯
//不同优先级的中断程序绝对不能使用同一组寄存器
/*****编程时防止中断把寄存器中的数据改变的解决方法是给中断指定寄存器, 同优先级的使用同一组没事。
1、写中断程序一定要用using语句指定寄存器组。第1、2、3组都可以,不能是0.
2、51单片机的中断有两个优先级。一个中断不会打断另一个相同优先级的中断。
这样相同级别中断可以使用同一个组。比如:低优先级的中断函数都 用 using 1,高优先级的中断都用 using 2 。这样不会冲突。 下面是一个正常的例子:
C程序: void int0() interrupt 0 using 1 默认5个中断时同级的,不会冲突,但是最好养成好习惯
不指定中断要使用的寄存器,每次都要入栈保护数据,中断完还要出栈,代码会增加32字节
完整代码下载:http://www.51hei.com/f/hwxx52.rar
********************************************************************/ #include
//少占鱼制作 河北正定欢迎您 长沙航空职业技术学院 2010 年QQ:41165643 //
//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对ISP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对ISP_CONTR 寄存器设置此值
#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对ISP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对ISP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对ISP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对ISP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对ISP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对ISP_CONTR 寄存器设置此值
union union_temp16 {
uint un_temp16; uchar un_temp8[2]; }my_unTemp16;
uchar Byte_Read(uint add); //读一字节,调用前需打开IAP 功能
void Byte_Program(uint add, uchar ch); //字节编程,调用前需打开IAP 功能
void Sector_Erase(uint add); //擦除扇区 void IAP_Disable(); //关闭IAP 功能
sbit JIESHOU=P1^0; //接收指示灯 sbit FASHE=P1^1; //发射指示灯 sbit KEY=P3^5;
sbit cin=P3^2; //接收端 sbit contrl=P3^0;//发射控制端
sbit khz=P3^1;//38KHZ产生 ,由T1设置
/****************************************************************/ void delayms(uint); void ADC(); void InitADC(); void init1(); void init2(); void fashe(); void jieshou(); void delayus(uchar i); void led(uchar x);
/******************************************************/ uint voltage;
bit receive=0;//接收标志 bit flag=0;//低电平记录完成标志 bit end=0; bit finish=1;
uchar a[43]={121,1,3,4,44,55,24,156,35};//间接寻址的高128RAM,内部256RAM高128只能间接寻址 uchar j=0;
uint zu=0,addr=0; //扇区地址 uchar k;//按键代号
uchar m=0;//写EEPROM时用来移动数组的 uchar b[6];//用来存储每一组数据的总字节数
/**********************************************************************/
/****************************************************************/ void main() {
delayus(5); delayms(1000);
InitADC();//这里对其他用到P1口的地方有影响,尽量放前面 contrl=0;//关闭38K输出 KEY=1;
Sector_Erase(0x0000);//擦除扇区 1 Sector_Erase(0x200); Sector_Erase(0x400); Sector_Erase(0x600); Sector_Erase(0x800); Sector_Erase(0xa00);
Sector_Erase(0xc00);//擦除扇区 7 addr=0xc00; FASHE=0; JIESHOU=0; FASHE=1;
delayms(4900);
for(j=6;j>0;j--)//j是数据总长度,如此判断,不会存储多余的空位 { Byte_Program(addr,a
??);//从本组数据对应扇区首地址开始写EEPROM m++; //数组下移 addr++; //地址下移 delayms(1);} //for end m=Byte_Read(0xc00);
if(m==121) { JIESHOU=1; delayms(6000); }
m=0;//下面还要用,所以清0 addr=0; zu=0; FASHE=0; KEY=1; JIESHOU=0;
delayms(1000);