📄 复件 l0.c
字号:
//pragma CODE DEBUG SYMBOLS OBJECTEXTEND
#include <c8051f020.h> // SFR declarations
#include <stdio.h>
#include <intrins.h>
#include<absacc.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SDA=P3^1;
sbit SCL=P3^2;
#define IIC_READ 0xA3 //
#define IIC_WRITE 0xA2 //
#define REG_READ 0xD3 //rtc
#define REG_WRITE 0xD2
xdata uchar SaveAddr; //FM31256 内部存储参数起始地址
#define RUN 1
#define STOP 0
#define NOP _nop_()
#define AlarmParaSaveAddr 80 //告警参数存储地址 ReadAlarmParameter
#define DeviceParaSaveAddr 200 //功能参数存储地址
uchar bdata bbyte;
sbit a0=bbyte^0;
sbit a1=bbyte^1;
sbit a2=bbyte^2;
sbit a3=bbyte^3;
sbit a4=bbyte^4;
sbit a5=bbyte^5;
sbit a6=bbyte^6;
sbit a7=bbyte^7;
bit IFACK; //record the SDA state to confirn if ACK has happened
sbit fm1= P3^4;//蜂鸣器
#define DELAYNUM 1
#define FiveNop; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
#define SOMEnop; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define SYSCLK 24576000 // SYSCLK frequency in Hz
#define BAUDRATE 9600 // Baud rate of UART in bps
//#define SAMPLERATE0 5000
#define NUM_SAMPLES 20
#define TRUE 1
#define FALSE 0
xdata float int_part,frc_part;//拆分浮点数为整数和小数部分
xdata uchar dotnum; //记录小数点位置
//uchar DeviceParaSaveAddr;
/*---------------------------------------------------------*/
// xdata float tmpa;
// data uint tt;
// xdata float ts;
//----------------------------------------------
void SYSCLK_Init (void)
{
xdata unsigned int u;
OSCXCN = 0x67; //启动外部振荡器(22.1184MHz晶体)
for (u = 0; u < 3000; u++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x88; // detector
}
//---------------------------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x04;
XBR1 = 0x00;
XBR2 = 0x40; //P0.0-TXD0 P0.1-RXD0 P0.2-TXD1 P0.3-RXD1
P0MDOUT = 0xc0; // enable TX0 as a push-pull output推挽输出
P1MDOUT = 0x00; // 配置输出为漏极开路
P2MDOUT = 0xff; // 配置输出为漏极开路
P3MDOUT = 0xff; // Enable crossbar and weak pull-ups允许交叉开关和弱上拉
P74OUT = 0x33;
P7=0xff;
}
#define NOP25; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define NOP50; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define DELAY1us; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define DELAY50us 50
#define DELAY100us 100
void DelaySomeNops()
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//======================================
/*开始 当主机把SDA 从高电平拉为低电平,同时SCL信号为高电平时被认为是开始信号,
所有的读写操作均由开始信号开始。*/
//========================================
//FUNCTION:ROUTES TO PROVIDE A START SIGNAL
void start(void)
{// EA = 0;
SCL=0;DelaySomeNops();
SDA=1;DelaySomeNops();
SCL=1;DelaySomeNops();
SDA=0;DelaySomeNops();
SCL=0;DelaySomeNops();
}
// SCL=0;SDA=1;SCL=1;SDA=0;SCL=0;
//=======================================
//FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
/*停止 当主机把SDA从低电平拉为高电平,同时SCL信号为高电平时认为是停止信号,*/
void stop(void)
{
//SCL=0;
SDA=0;DelaySomeNops();
SCL=1;DelaySomeNops();
SDA=1;DelaySomeNops();
SCL=0;DelaySomeNops();
}
//SCL=0;
// SDA=0;SCL=1;SDA=1; SCL=0;
//=====================================
//FUNCTION:ROUTES TO PROVIDE ACK SINGAL
/*应答 在任何传送中,应答信号出现在第8位数据位被传送之后,在这个状态下,发送方应该释放SDA
信号以便由接收方驱动。接受方驱动SDA为低电平,以应答收到一个字节数据。
*/
/*void ack(void)
{
//SCL=0;
SDA=0;DelaySomeNops();
SCL=1;DelaySomeNops();
SCL=0;DelaySomeNops();
}*/
// SDA=0;SCL=1;SCL=0;
//=====================================
//FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
// OR TO PROVIDE A NO_ACK SIGNAL
/* SDA=1;
SCL=1;
i=5;
while(i--){;}
IFACK=SDA;
//while(SDA){;};
SCL=0;
IFACK=1;*/
void nack(void)
{
xdata uchar i;
//SCL=0;
SDA=1;DelaySomeNops();
SCL=1;DelaySomeNops();
i=5;DelaySomeNops();
while(i--){DelaySomeNops();}
IFACK=SDA;DelaySomeNops();
//while(SDA){;};
SCL=0;DelaySomeNops();
IFACK=1;DelaySomeNops();
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
uchar inbyte(void) {
SDA=1;DelaySomeNops();
SCL=1;DelaySomeNops();a7=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
SCL=1;DelaySomeNops();a6=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
SCL=1;DelaySomeNops();a5=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
SCL=1;DelaySomeNops();a4=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
SCL=1;DelaySomeNops();a3=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
SCL=1;DelaySomeNops();a2=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
SCL=1;DelaySomeNops();a1=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
SCL=1;DelaySomeNops();a0=SDA;DelaySomeNops();SCL=0;DelaySomeNops();
return(bbyte);
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
void outbyte(uchar outdata) {
bbyte=outdata;
SDA=a7;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
SDA=a6;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
SDA=a5;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
SDA=a4;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
SDA=a3;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
SDA=a2;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
SDA=a1;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
SDA=a0;DelaySomeNops();SCL=1;DelaySomeNops();SCL=0;DelaySomeNops();
}
//======================================================
//FUNCTION:BYTE WRITE. 'add' THE WRITE ADDRESS, 'wbyte' THE DATA WANT TO WRITE
void writebyte(uint add,uchar wbyte)
{ xdata uchar addh;
start(); DelaySomeNops();
outbyte(IIC_WRITE); DelaySomeNops();
nack(); DelaySomeNops();
addh=add>>8; DelaySomeNops();
outbyte(addh); DelaySomeNops();
nack(); DelaySomeNops();
outbyte(add); DelaySomeNops();
nack(); DelaySomeNops();
outbyte(wbyte); DelaySomeNops();
nack(); DelaySomeNops();
stop(); DelaySomeNops();
}
//=====================================================
//FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
uchar readbyte (uint add)
{ xdata uchar addh;
xdata uchar temp;
start(); DelaySomeNops();
outbyte(IIC_WRITE); DelaySomeNops();
nack(); DelaySomeNops();
addh=add>>8; DelaySomeNops();
outbyte(addh); DelaySomeNops();
nack(); DelaySomeNops();
outbyte(add); DelaySomeNops();
nack(); DelaySomeNops();
start(); DelaySomeNops();
outbyte(IIC_READ); DelaySomeNops();
nack(); DelaySomeNops();
temp=inbyte(); DelaySomeNops();
nack(); DelaySomeNops();
stop(); DelaySomeNops();
return(temp);
}
/*typedef struct _Device_Set{ //定义设备设置纪录集结构类型
uchar cell_type, cell_num; //电池类型,电池数量
uint cell_inner_resistant; //电池内阻
uint cell_content1,cell_content2;//剩余电量,
uint standard_Ah ; //标称安时
uint cell_life; //电池寿命
uchar device_addr; //设备地址
uint time_used; //使用时间
uchar cell_groups; //电池组数
uint Current_range; //电流量程
uint Chg_Current1; //浮充电流(放大倍)
uint Chg_Current2; //浮充电流(放大倍)
uint dischg_Current1; //放电电流(放大倍)
uint dischg_Current2; //放电电流(放大倍)
uint chg_current_display_threshold1; //充电电流显示门坎(安,两位小数) 2字节
uint chg_current_display_threshold2; //充电电流显示门坎(安,两位小数) 2字节
uint Chg_I_threshold1; //充电电流计量门坎(安,两位小数) 2字节
uint Chg_I_threshold2; //充电电流计量门坎(安,两位小数) 2字节
uint dischg_current_display_threshold1; //放电电流显示门坎(安,两位小数) 2字节
uint dischg_current_display_threshold2; //放电电流显示门坎(安,两位小数) 2字节
uint disChg_I_threshold1; //放电电流计量门坎(安,两位小数) 2字节
uint disChg_I_threshold2; //放电电流计量门坎(安,两位小数) 2字节
float fDiagnose[8]; //诊断参数1~诊断参数8
} T_Device_Set;*/
float inputfloat(float x,uchar knum,bit dot)
{
frc_part=modf(x,&int_part);
if(dot==0)
int_part=int_part*10+knum;
else
{
if(dotnum==1)
{ frc_part=(float)frc_part+(float)knum/10;
dotnum++;
}
else if(dotnum==2)
{ frc_part=(float)frc_part+(float)knum/100;
dotnum++;
}
else if(dotnum==3)
frc_part=(float)frc_part+(float)knum/1000;
}
x=int_part+frc_part;
return x;
}
/*****************************************************************************************
在addr 处显示 x
******************************************************************************************/
void DisFloat(unsigned int addr,float x)
{
bit sign;
xdata unsigned char DisplayBuf[12]; //设置显示缓冲区
xdata unsigned char Buf[12];
uchar i;
if(x>=0) sign=0;
else sign=1;
x=fabs(x);
x=0.01234; //2d
sprintf(DisplayBuf,"%e",x);
// x=19.234; //2b
// sprintf(DisplayBuf,"%e",x);
// x=6.234;
// sprintf(DisplayBuf,"%e",x);
//正数显示
DisplayBuf[11]=DisplayBuf[11]-0x30;
if(DisplayBuf[9]==0x2B) //+
{ if(DisplayBuf[11]==0)
{ for(i=0;i<5;i++)
{ Buf[i]=DisplayBuf[i];
}
}
else if(DisplayBuf[11]==1)
{
Buf[0]=DisplayBuf[0];
Buf[1]=DisplayBuf[2];
Buf[2]=0x2e;
Buf[3]=DisplayBuf[3];
Buf[4]=DisplayBuf[4];
}
else if(DisplayBuf[11]==2)
{
Buf[0]=DisplayBuf[0];
Buf[1]=DisplayBuf[2];
Buf[2]=DisplayBuf[3];
Buf[3]=0x2e;
Buf[4]=DisplayBuf[4];
}
else if(DisplayBuf[11]==3)
{
Buf[0]=DisplayBuf[0];
Buf[1]=DisplayBuf[2];
Buf[2]=DisplayBuf[3];
Buf[3]=DisplayBuf[4];
}
}
else if(DisplayBuf[9]==0x2D) //-
{
if(DisplayBuf[11]==1)
{
Buf[0]=0x30;
Buf[1]=0x2e;
Buf[2]=DisplayBuf[0];
Buf[3]=DisplayBuf[2];
Buf[4]=DisplayBuf[3];
}
else if(DisplayBuf[11]==2)
{
Buf[0]=0x30;
Buf[1]=0x2e;
Buf[2]=0x30;
Buf[3]=DisplayBuf[0];
Buf[4]=DisplayBuf[2];
}
else if(DisplayBuf[11]==3)
{
Buf[0]=0x30;
Buf[1]=0x2e;
Buf[2]=0x30;
Buf[3]=0x30;
Buf[4]=DisplayBuf[0];
}
}
if(sign==0)
{
if(DisplayBuf[9]==0x2b) //+
{
switch (DisplayBuf[11])
{
case 0:// Write_Num(addr,DisplayBuf[0]-0x30);
//Write_Num(addr+1,0x10);
//Write_Num(addr+2,DisplayBuf[2]-0x30);
// Write_Num(addr+3,DisplayBuf[3]-0x30);
// Write_Num(addr+4,DisplayBuf[4]-0x30);
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
default:break;
}
}
else if(DisplayBuf[9]==0x2D) //-
{
switch (DisplayBuf[11])
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
default:break;
}
}
}
else if(sign==1)
{
if(DisplayBuf[9]==0x2b) //-
{
switch (DisplayBuf[11])
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
default:break;
}
}
else if(DisplayBuf[9]==0x2D) //-
{
switch (DisplayBuf[11])
{
case 1:
break;
case 2:
break;
case 3:
break;
default:break;
}
}
}
}
delay100us()
{ uchar i;
i=190;
while(i>0)
{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
i--;
}
}
delay245us()
{ uchar i;
i=255;
while(i>0)
{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_();
i--;
}
}
delay1us()
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
delay5us()
{
delay1us();
delay1us();
delay1us();
delay1us();
delay1us();
delay1us();
}
delay1ms()
{ delay245us();
delay245us();
delay245us();
delay245us();
}
//----------------------------------------------------------------------
void main (void)
{
uchar i,nn=2,mm=0,p,a[4],j;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
SYSCLK_Init ();
PORT_Init ();
Lcd_Init();
ClearScreen();
MainShow();
while(1)
{
fm1=!fm1;
delay1ms();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -