?? main.c
字號(hào):
////////////
#include <reg52.h> ///52的庫
#include <intrins.h>
/////////////////////
//sfr isp_wdt = 0xe1;
sfr isp_data = 0xe2;
sfr isp_addrh = 0xe3;
sfr isp_addrl = 0xe4;
sfr isp_cmd = 0xe5;
sfr isp_trig = 0xe6;
sfr isp_contr = 0xe7;
/////////
#define uchar unsigned char
#define uint unsigned int
#define Dlen 8
uchar Data[Dlen+1]={1};//={1,2,3,4,5,6,7,8,9,0xA,0xB,0x0C,0x0D};
uchar Databak[Dlen+1];
uchar AckData[Dlen+1];
uchar number,flag;
uchar Eeprom_data[Dlen];
sfr WDT=0XE1;
/*sfr ISP_DATA=0XE2;
sfr ISP_ADDRH=0xE3;
sfr ISP_ADDRL=0xE4;
sfr ISP_CMD=0xE5;
sfr ISP_TRIG=0xE6;
sfr ISP_COUNT =0xE7;
sfr ENABLE_ISP=0x80;
uchar DEBUG_DATA =0x5A;
uint DFSA=0x2000; */
sbit LED=P1^7;
sbit LED1=P3^4;
sbit LED2=P3^5;
bit BeingEnd=1;
uint TimerCount=0,mTcount=0;
bit cansend=0,issend=0,whilerec=0,whilesend=0;
/////////
unsigned char iic_num;
////寫入到從t_addr地址開始
/* 打開 ISP,IAP 功能 */
void EraseEeprom(unsigned char t_addr)
{
isp_addrh = t_addr;
isp_addrl = 0;
EA = 0; /* 關(guān)中斷 */
isp_contr = 0x81; /* 1000,0000 */
isp_cmd = 3;
isp_trig = 0x46;
isp_trig = 0xb9;
_nop_();
_nop_();
isp_contr = 0; /* 0111,1111 */
isp_cmd = 0;
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; /* 開中斷 */
}
////一次最多256個(gè),建議試用幾個(gè),要存入的數(shù)據(jù)松在指針指向的緩沖區(qū)
void WriteEeprom(unsigned char t_addr, unsigned char num, unsigned char /*xdata*/ *ptr)
{
EraseEeprom(t_addr);
for (iic_num=0; iic_num<num; iic_num++)
{
isp_data = *(ptr+iic_num);
isp_addrh = t_addr;
isp_addrl = iic_num;
EA = 0; /* 關(guān)中斷 */
isp_contr = 0x81; /* 1000,0000 */
isp_cmd = 2;
isp_trig = 0x46;
isp_trig = 0xb9;
_nop_();
_nop_();
isp_contr = 0; /* 0111,1111 */
isp_cmd = 0;
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; /* 開中斷 */
}
}
////從eeprom的t_addr地址開始讀出num個(gè)數(shù)據(jù)
////存入以temp[0]開始的存儲(chǔ)單元
////一次最多256個(gè),讀數(shù)的數(shù)據(jù)存入指針指向的緩沖區(qū)
void ReadEeprom(unsigned char s_addr, unsigned char num, unsigned char /*xdata*/ *ptr)
{
for (iic_num=0; iic_num<num; iic_num++)
{
isp_addrh = s_addr;
isp_addrl = iic_num;
EA = 0; /* 關(guān)中斷 */
isp_contr = 0x81; /* 1000,0000 */
isp_cmd = 1;
isp_trig = 0x46;
isp_trig = 0xb9;
_nop_();
_nop_();
isp_contr = 0; /* 0111,1111 */
isp_cmd = 0;
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; /* 開中斷 */
*(ptr+iic_num) = isp_data;
}
}/***********串口發(fā)送一個(gè)字節(jié)****************/
void send(uchar S_Data)
{
SBUF = S_Data;
while(TI == 0);
TI =0;
}
/************生成校驗(yàn)碼子程序***********/
char* XiaoYan(uchar *a)
{
uchar i, all=0;
for(i=0;i<Dlen;i++)
all=all+a[i];
all=~all;
all=all-1;
a[Dlen]=all;
return a;
}
/************接收數(shù)據(jù)校驗(yàn)子程序***********/
unsigned int RXiaoYan(uchar *a)
{
uchar rets=0,i, all=0;
for(i=0;i<Dlen;i++)
all=all+a[i];
all=~all;
all=all-1;
if(a[Dlen]==all)
rets=1;
return rets;
}
/****************串口發(fā)送子程序****************/
void sends(uchar *b )
{
uchar count,i;
cansend=0;
count=Dlen+1;
LED1=0;
for(i=0;i<count;i++)
send(b[i]);
}
//-------------等待接收----------------------
void whilRec(void)
{
unsigned char Cmd=0;
while(whilerec)
{
//if(flag==12)
flag=0;
number=0;
Cmd=0;
Cmd=Data[0];
if(RXiaoYan(Data)) //crc ok
{
if(Cmd>0xA0)//接到的是命令偵
{
switch (Cmd)
{
case 0xA1:
break;
case 0xA2:
break;
case 0xAC://應(yīng)答ok
cansend=1;
break;
case 0xAB://需要重發(fā)
sends(Databak);
whilerec=0;
cansend=1;
break;
case 0xCB://開始
BeingEnd=1;
break;
case 0xCE://暫停
BeingEnd=0;
break;
default:
break;
}
}
else //crc no
{
sends(XiaoYan(Data));
cansend=1;
whilerec=0;
}
}
else
{
AckData[0]=0xAB;//要求pc重發(fā)
sends(XiaoYan(AckData));
whilerec=0;
cansend=1;
}
whilerec=0;
}
}
/*********MCU初始化**************/
void MCU_Init(void)
{
TMOD = 0x22;
//TH1 = TL1 = 0xFA;//9600 T1 為波特率發(fā)生器
TH1 = TL1 = 0xFD;//19200 T1 為波特率發(fā)生器
TH0=TL0=0xa3;
SCON = 0x50;
PCON = 0x80;//SMOD=1;
TR1=1;
TR0=1;
ET0=1;
ES = 1;
EA = 1;
}
/*************T1中斷********************/
void T0_int() interrupt 1
{
TimerCount++;
if(TimerCount>200)
{
TimerCount=0;
WDT=0x34;
mTcount++;
}
}
/*************接收中斷********************/
void Serial() interrupt 4 using 2
{
uint num=0;
if(RI == 1)
{
LED2=0;
Data[number++]= SBUF;
num=number-1;
Databak[num]=Data[num];
RI = 0;
flag++;
if(flag==Dlen+1)
{
whilerec=1;
}
}
}
/**************主程序***********************/
void main(void)
{
unsigned int ld=0,san=0;
MCU_Init();
//send(0xAA);
//for(ld=0;ld<Dlen;ld++)
//Eeprom_data[ld]=0xA0+ld;
//WriteEeprom(0x82, Dlen, Eeprom_data);
_nop_();
_nop_();
send(0x01);
for(ld=0;ld<Dlen;ld++)
Eeprom_data[ld]=0;
while(1)
{
if(mTcount>350)
{
mTcount=0;
for(ld=0;ld<Dlen;ld++)
Eeprom_data[ld]=0;
LED2=LED1;
LED1=!LED1;
ReadEeprom(0x82, Dlen, Eeprom_data) ;
_nop_();
_nop_();
sends(XiaoYan(Eeprom_data));
/*ReadEeprom(0x83, Dlen, Eeprom_data) ;
_nop_();
_nop_();
sends(XiaoYan(Eeprom_data));
mTcount=0; */
mTcount=0;
}
//whilRec();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -