📄 20090309161950f65785[1].txt
字号:
temp1=Count/1000;//取前1-2位
ComBuf[1]=temp1;
temp2=Count/10-temp1*100;//得到3-4位
ComBuf[2]=temp2;
ComBuf[3]=Count-(temp1*1000+temp2*10);
SendByteArray();//发送数据
}
//--------------------------------------------------------------------------//
//写一个字节到AT24C04EEPROM
void WriteAT24C04()
{
uchar address,RomData;
address=ComBuf[1];
RomData=ComBuf[2];
WriteByte_24c04(RomData,address);
}
//读取AT24C04EEPROM一个字节
void ReadAT24C04()
{
ComBuf[2]=ReadByte_24c04(ComBuf[1]);
SendByteArray();//发送数据
}
//=================================
// 看门狗设置
//=================================
//void watchdog()
//{
//WDTRST=0x1E;
//WDTRST=0xE1;//喂狗指令
//}
void SetLedData()
{
uchar ShowData,ShowBit;
Timer_Pro_Flag=0;//0为显示处理,1为时序采集处理
ShowBit=ComBuf[1];
ShowData=LED_NUM[ShowBit];//选择位
ShowData|=ComBuf[2];//显示内容
LED_BIT[ShowBit]=0x00;
LED_BIT[ShowBit]=ShowData;
TH0=(65536-4000)>>8;
TL0=(65536-4000)&0xff;
TR0=ComBuf[3];
if(ComBuf[3]) P0=0x00;//关闭显示
}
/*=========================================
PluckPulse----时序采集
===========================================*/
void PluckPulse()
{
Timer_Pro_Flag=1;//0为显示处理,1为时序采集处理
OLD_TH0=ComBuf[2];
OLD_TL0=ComBuf[3];
TH0=OLD_TH0;
TL0=OLD_TL0;
TR0=ComBuf[1];//关闭或启动计时器
}
//------------
/*=========================================
PWM----时序采集
===========================================*/
void PWM()
{
Timer_Pro_Flag=2;//0为显示处理,1为时序采集处理
OLD_TH0=ComBuf[2];
OLD_TL0=ComBuf[3];
TH0=OLD_TH0;
TL0=OLD_TL0;
TR0=ComBuf[1];//关闭或启动计时器
}
//------------
void timer0(void) interrupt 1 using 1
{
//-------------------
switch(Timer_Pro_Flag)
{
case 0:
//LED显示处理
TH0=(0xffff-4000)>>8;
TL0=(0xffff-4000)&0xff;
if (LedCount>4) LedCount=0;
P0=0x00;
P0=LED_BIT[LedCount++];
break;
case 1:
// 时序采集
TH0=OLD_TH0;
TL0=OLD_TL0;
SendByte(IrDA_in_Pin);//发送P1^0引脚状态
break;
case 2://模拟PWM输出
if(!PWMFlag)
{
TH0=OLD_TH0;
TL0=OLD_TL0;
TR0=1;
PWMFlag=1;
PWM_Pin=0;
}
else
{
PWM_Pin=1;
TR0=0;
TH0=OLD_TH0;
TL0=OLD_TL0;
TR0=1;
PWMFlag=0;
}
break;
}
}
/*===================================================================
主程序开始处
===================================================================*/
void main()
{
//晶振:11.0592,波特率:19200
TMOD=0x21;
TL1=0xfd;
TH1=0xfd;
SCON=0xd8;
PCON=0x80;//高位为0时不倍频:9600pbf,1时倍频:19200bpf
TR1=1;
//------------------
// TMOD=0x01;//工作在定时器方式1,16位计数器
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
ET0=1;
EA=1;//中断允许
//-------------
while(1)
{
WaitComm();//等待接收数据
//校对checksum校验码是否正确,如正确则进行相关的操作
if(ISCheckSUM())
{
switch (ComBuf[0])
{
case 0x01:WritePortData(); break; //响应上位机发送的写操作
case 0x02:SendPortData(); break; //响应上位机发送的读操作
case 0x03:SetEA();break; //中断允许设定
case 0x04:GetAD();break; //TLC1549数据采集
case 0x05:GetAD_With_VOL_Filter();break;//采软件滤软件的TLC1549数据采集
case 0x06:CD4051_PickVol();break; //CD4051--8选1TLC1549采集
case 0x07:CD4051_LoopPickVol();break; //8路巡检TLC1549采集
case 0x08:ReadAT24C04();break; //读取AT24C04EEPROM一个字节
case 0x09:WriteAT24C04();break; //写一个字节到AT24C04EEPROM
case 0x0a:SetLedData();break; //设定显示的数据
case 0x0b:TestCapCount();break; //电容放电时间计数测试
case 0x0c:PluckPulse();break; //时序采集
case 0x0d:PWM();break; //控制P2_7模拟输出PWM
}
}
else//如检验错误则返回上位机错误信息
{
ComBuf[0]=0xFF;
SendByteArray();//返回错误信息
}
}
}
#i nclude <stdio.h>
#i nclude <REGX51.H>
#i nclude "iic.h"
#define uchar unsigned char
#define uint unsigned int
uint Timer_Pro_Flag=0;//0为显示处理,1为时序采集处理
sbit TEST_CAP_VOL_CRLT=P1^0;//用于控制外部继电器
sbit PWM_Pin=P3^7;//PWM输出
sbit IrDA_in_Pin=P1^0;//红外脉冲输入检测脚
bit PWMFlag=0;
uchar OLD_TH0,OLD_TL0;
#define MAXCMD_LENGTH 7
#define AD_VOL_PER 1.04058 //正常采集时的电压校准值
#define AD_Loop_PickVol_PER 1.04058 //CD4051循环采集时的电压校准值
sbit WDTRST=0xA6;//At89S5x看门狗寄存器
sbit ADCLK=P2^0;
sbit ADOUT=P2^1;
sbit ADCS=P2^2;
//--------------------------
/************CD4051---8选1模拟开关芯片*****************/
/*
|------------------------------------------------------|
| 4 2 1 |
|-----------------------------------------------|------|
|端口 | INH C B A | | |
|------ 7 6 5 4 3 2 1 0 | 正值 | 取反 |
| 通道 |--------------------------------|-------|------|
|------|...............|8 4 2 1 | | |
|------|---------------|----------------|-------|------|
| 0 |0 0 0 0 0 0 0 0 | 0x00 | 0xff |
| 1 |0 0 0 0 0 0 1 0 | 0x02 | 0xf7 |
| 2 |0 0 0 0 0 1 0 0 | 0x04 | 0xfb |
| 3 |0 0 0 0 0 1 1 0 | 0x06 | 0xf3 |
| 4 |0 0 0 0 1 0 0 0 | 0x08 | 0xfd |
| 5 |0 0 0 0 1 0 1 0 | 0x0A | 0xf8 |
| 6 |0 0 0 0 1 1 0 0 | 0x0C | 0xf9 |
| 7 |0 0 0 0 1 1 1 0 | 0x0e | 0xf1 |
|---------------------------------------|-------|------|
*/
uchar
CD4051_NUM[]={0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0e};
//0~7编码
sbit CD4051_A=P1^1;
sbit CD4051_B=P1^2;
sbit CD4051_C=P1^3;
sbit CD4051_INH=P1^4; //CD4051_INH为1时,,所有通导都不导通
bit CD4051_Vol_Conver_Flag=0; //0时为正常采集,1为CD4051循环采集
//--------------------------
//LED显示
//--------------------------
uchar LedCount=0;
uchar LED_BIT[5]; //用于显示的每一位数据码的内容
uchar LED_NUM[]={0x00,0x10,0x20,0x40,0x80};//选择显示位
//--------------------------------------------------------
void SendByte(unsigned char word)
{
TI=0;
SBUF=word;
while(TI==0);
TI=0;
}
uchar ComBuf[MAXCMD_LENGTH];//用于保存串口的数据
/*---少量延时---*/
void delay(uint t)
{
uint i=0;
for(;i<=t;i++);
}
void Pluckdelay(uint t)
{
uint i=0,j;
for(;i<=t;i++)
for(j=1;j<=1000;j++);
}
/*=================================
ComBuf[5]加入CheckSUM校验码
算法:0x01+not(字节1+字节2+...+字节N)
=================================*/
void SetCheckSUM()
{
ComBuf[5]=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]);
}
/*=============================================================
检测上位机发送来的ComBuf[5]checksum校验码和计算后的是否相等
正确则返回:1
错误则返回:0
==============================================================*/
bit ISCheckSUM()
{
uchar crc;
crc=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]);
if(ComBuf[5]==crc)
return 1;
else
{
ComBuf[1]=crc;//如果错误,则返回计算后得到的CHECKSUM校验码
ComBuf[2]=ComBuf[5];//返回原来上位机发送来的CHECKSUM校验码
return 0;
}
}
/*-----------------------------------
* *
* 等待接收上位机发来的指令 *
* *
-------------------------------------*/
void WaitComm()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -