|
#include "stc.h"
#include <intrins.h>
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
#define NOP() _nop_()
#define EEPROM_START_ADDRESS 0x2000
/********************************************************************
初始定义
*********************************************************************/
uint sec=0; //定义计数值
uint sec1=0; //定义计数值
uint tcnt; //脉冲计数
uint tcnt1; //脉冲计数
uchar timet=0;
uint t1;
bit write;
uchar sudu;
uchar shuru;
uchar dingshi=1;
uint shi=0;
uchar xiaoshi=0;
uchar baojing=0;
uchar biaozhi=0;
/********************************************************************
I/O定义
*********************************************************************/
sbit P35=P3^5; //脉冲
sbit P36=P3^6; //继电器
sbit P37=P3^7; //蜂鸣器
/********************************************************************
延时100MS函数
*********************************************************************/
void Delay100ms(uint t)
{
uint i, j;
_nop_();
i = 100;
j = t;
while (--j);
while (--i);
}
/********************************************************************
蜂鸣器函数
*********************************************************************/
void fmq()
{
P37=0; Delay100ms(20000);P37=1;
}
/****************************************************
* 函数名称: DelayNus
* 输 入: t 延时时间
* 输 出: 无
* 功能描述: 微秒级延时
*****************************************************/
void DelayNus(uint t)
{
uint d=0;
d=t;
do
{
NOP();
}while(--d >0);
}
/****************************************************
* 函数名称: DelayNms
* 输 入: t 延时时间
* 输 出: 无
* 功能描述: 毫秒延时
*****************************************************/
void DelayNms(uint t)
{
do
{
DelayNus(1000);
}while(--t >0);
}
/****************************************************
* 函数名称: EEPROMEnable
* 输 入: 无
* 输 出: 无
* 功能描述: EEPROM使能
*****************************************************/
void EEPROMEnable(void)
{
ISP_CONTR=0x81;//使能并设置好等待时间
}
/****************************************************
* 函数名称: EEPROMDisable
* 输 入: 无
* 输 出: 无
* 功能描述: EEPROM禁用
*****************************************************/
void EEPROMDisable(void)
{
ISP_CONTR=0x00; //禁止EEPROM
ISP_CMD=0x00; //无ISP操作
ISP_TRIG=0x00; //清零
ISP_ADDRH=0x00; //清零
ISP_ADDRL=0x00; //清零
}
/****************************************************
* 函数名称: EEPROMSetAddress
* 输 入: addr 16位地址
* 输 出: 无
* 功能描述: EEPROM 设置读写地址(相对地址)
*****************************************************/
void EEPROMSetAddress(uint addr)
{
addr+=EEPROM_START_ADDRESS; //初始化地址为0x2000
ISP_ADDRH=(uchar)(addr>>8); //设置读写地址高字节
ISP_ADDRL=(uchar) addr; //设置读写地址低字节
}
/****************************************************
* 函数名称: EEPROMStart
* 输 入: 无
* 输 出: 无
* 功能描述: EEPROM 启动
*****************************************************/
void EEPROMStart(void)
{
ISP_TRIG=0x46; //首先写入0x46
ISP_TRIG=0xB9; //然后写入0xB9
}
/****************************************************
* 函数名称: EEPROMReadByte
* 输 入: addr 16位 地址
* 输 出: 单个字节
* 功能描述: EEPROM 读取单个字节
*****************************************************/
uchar EEPROMReadByte(uint addr)
{
ISP_DATA=0x00; //清空ISP_DATA
ISP_CMD=0x01; //读模式
EEPROMEnable(); //EEPROM使能
EEPROMSetAddress(addr); //设置EEPROM地址
EEPROMStart(); //EEPROM启动
DelayNus(10); //读取一个字节要10us
EEPROMDisable(); //禁止EEPROM
return (ISP_DATA); //返回读取到的数据
}
/****************************************************
* 函数名称: EEPROMWriteByte
* 输 入: addr 16位 地址
byte 单个字节
* 输 出: 无
* 功能描述: EEPROM 写入单个字节
*****************************************************/
void EEPROMWriteByte(uint addr,uchar byte)
{
EEPROMEnable(); //EERPOM使能
ISP_CMD=0x02; //写模式
EEPROMSetAddress(addr); //设置EEPROM地址
ISP_DATA=byte; //写入数据
EEPROMStart(); //EEPROM启动
DelayNus(60); //写一个字节需要60us
EEPROMDisable(); //禁止EEPROM
}
/****************************************************
* 函数名称: EEPROMSectorErase
* 输 入: addr 16位 地址
* 输 出: 无
* 功能描述: EEPROM 扇区擦除
*****************************************************/
void EEPROMSectorErase(uint addr)
{
ISP_CMD=0x03; //扇区擦除模式
EEPROMEnable(); //EEPROM使能
EEPROMSetAddress(addr);//设置EEPROM地址
EEPROMStart(); //EEPROM启动
DelayNms(10); //擦除一个扇区要10ms
EEPROMDisable(); //禁止EEPROM
}
/********************************************************************
按键判断函数
*********************************************************************/
void KEY()
{
shuru=P1;
switch(shuru)
{
case 0XF8: fmq();P36=0;TR0=0;P35=0;Delay100ms(50000);break;//D
case 0XF2: fmq();sudu++;write=1;if(sudu>=41)sudu=41;Delay100ms(20000);break;//B
case 0XF4: fmq();sudu--;write=1;if(sudu<=1)sudu=1;Delay100ms(20000);break;//C
case 0XF1: fmq();P36=1;TR0=1;P35=1;Delay100ms(50000);break;//A
default:break;
}
switch(sudu)
{
case 1: t1=1;break;//2K
case 2: t1=2;break;//2K
case 3: t1=3;break;//2K
case 4: t1=4;break;//1.6k
case 5: t1=5;break;//1.33k
case 6: t1=6;break;//1.14k
case 7: t1=7;break;//1k
case 8: t1=8;break;// 880
case 9: t1=9;break;// 800
case 10: t1=10;break;// 660
case 11: t1=11;break;// 660
case 12: t1=12;break;// 660
case 13: t1=13;break;// 580
case 14: t1=14;break;// 660
case 15: t1=15;break;// 500
case 16: t1=16;break;// 660
case 17: t1=17;break;// 450
case 18: t1=18;break;// 660
case 19: t1=19;break;// 400
case 20: t1=20;break;// 660
case 21: t1=21;break;// 360
case 22: t1=22;break;// 350
case 23: t1=23;break;// 660
case 24: t1=24;break;// 660
case 25: t1=25;break;// 300
case 26: t1=26;break;// 300
case 27: t1=30;break;// 260
case 28: t1=33;break;// 240
case 29: t1=37;break;// 220
case 30: t1=41;break;// 200
case 31: t1=50;break;// 160
case 32: t1=60;break;// 135
case 33: t1=65;break;// 125
case 34: t1=75;break;// 110
case 35: t1=80;break;// 100
case 36: t1=95;break;// 84
case 37: t1=120;break;//60
case 38: t1=150;break;//50
case 39: t1=300;break;//30
case 40: t1=1000;break;//8
case 41: t1=10000;break;//1
default:break;
}
}
/********************************************************************
定时中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
tcnt1++;
if(tcnt1>=t1)
{
tcnt1=0;
P35=!P35;
}
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
uchar Q;
TMOD=0x02; //定时器工作在方式2
TH0=0x06; //对TH0 TL0 赋值
TL0=0x06;
TR0=0; //关定时
ET0=1; //开定时器
EA=1; //开总中断
P1=0XFF;
P35=0;//脉冲输出脚
P36=0;//继电器输出控制关
Q=EEPROMReadByte(0); //从EERPOM的相对0地址读取数据
sudu=Q;
while(1)
{
KEY();
if(write==1)
{
EEPROMSectorErase(0); //从EEPROM的相对0地址扇区擦除
EEPROMWriteByte(0,sudu);//从EEPROM的相对0地址写入0x88
write=0;
}
}
}
|
|