|
#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;
}
}
}
|
|