📄 c_main.c
字号:
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
#include <Reg935.h>
#include <intrins.h>
#include <cewen.h>
#include <UART2.H>
#include <W_R_E2RAM.h>
////////////////////////////////////////////////////
unsigned char sendRQ=0;
unsigned char ch=0;
char text[]="response at 9600 baud";
////////////////////////////////////////////////////
//////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------------------
//delayms: 在使用内部RC震荡器时延时毫秒子程序
//入口参数: i 延时MS数
//出口参数: (无)
//---------------------------------------------------------------------------------------
void delayms(int i)
{
unsigned int k;
while(i>0)
{
for(k=0;k<670;k++);
i--;
}
}
//---------------------------------------------------------------------------------------
//InitTimer: 初始化系统定时器
//---------------------------------------------------------------------------------------
void InitTimer(void)
{
AUXR1=0x10; //ENT0=1,允许T0溢出触发输出
TMOD = 0x12; //TIMER0工作在MODE6,TIMER1工作在MODE1
TAMOD = 0x01;
//TH0=0x80; //赋初值
TR0=0; //启动定时器0
ET1=1;
EA=1;
}
/////////////////////////////////////////////////////////////////////////////////////////
void Init_Serial(void)
{
SSTAT=0x60; // separate Rx / Tx interrupts
PCON&=0x3f; /*UART 设置工作方式3,11 位数据*/
if(WorkMode==0x01) SCON=0x50;
else SCON=0xd0; // select BRG as UART Baud Rate Gen
BRGCON=0x00; /*装入波特率常数,0--1200bps 1--2400bps 2--4800bps*/
if(botelv==1) BRGR1_DATA=0x17;
else if(botelv==2)BRGR1_DATA=0x0b;
else if(botelv==3)BRGR1_DATA=0x05;
else if(botelv==4)BRGR1_DATA=0x02;
BRGR0_DATA=0xf0;
//////////////////////////////////////////////////////////////////////
BRGR1=BRGR1_DATA;
BRGR0=BRGR0_DATA;
BRGCON=0x03; //enable BRG
EST=0;
ESR=1;
ES = 1;
EA=1;
}
////////////////////////////////////////////////////////////////////////////////////////
void UART_ISR(void) interrupt 4
{
RI = 0; // clear receive interrupt flag
TI = 0;
ser_dat[ch]=SBUF; // copy input bufffer to ch
ch++;
if(sendRQ==0) sendRQ=1; // set flag for polling in main loop
}
////////////////////////////////////////////////////////////////////////////////////////
/********************************************************************
串口发送一个字节
功能:发送一个字节数据
入口参数:发送数据
出口参数:无
********************************************************************/
void Send_Data(uchar Serial_data)
{
ACC=Serial_data;
TB8=P;TI=0;
SBUF=Serial_data;
while(!TI);
TI=0; /*发送一个字节,并进行偶校验*/
}
////////////////////////////////////////////////////////////////////////////////////////
/*void sendtoPC(char* dat)
{
int j=0;
if(WorkMode==1)
{while(dat[j]) // send string
{
TI=0; // clear transmit interrupt flag
SBUF=dat[j]; // start sending one byte
while (!TI); // wait until sent
j++;
}
}
else
{ while(dat[j]) // send string
{Send_Data(dat[j]); j++;}
}
}*/
////////////////////////////////////////////////////////////////////////////////////////
void sendtoPCa(void)
{ int j=0;
if(WorkMode==1)
{while(ch--) // send string
{
TI=0; // clear transmit interrupt flag
SBUF=ser_dat[j]; // start sending one byte
while (!TI); // wait until sent
j++;
}
}
else
{ while(ch--) // send string
{Send_Data(ser_dat[j]);j++; }
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//初始化CPU——IO口
////////////////////////////////////////////////////////////////////////////////////////
void Init_cpuio(void)
{ P0M1=0x5e; //01011110 //P0.4~p0.1设置为仅为输入状态AD_io//
P0M2=0x80; //10000000 //p0.0-key1,p.05-key2//p0.6-RX,p0.7-TX 无线接收发射//
/////////////////////////////////////////////////////////////////////////////////////
P1M1=0x3e; //00111111 //P10-RXD,P11-TXD
P1M2=0xff; //11111111 //P16-LED_RED,LED-GREE
/////////////////////////////////////////////////////////////////////////////////////
P2M1=0x6c; //01101100 //RFC-P20,SD3-P21,
P2M2=0xff; //11111111 //SD2-P26,SD1-P27
/////////////////////////////////////////////////////////////////////////////////////
KF=1;
RFC=1; //无线接收状态控制位0为发送,1为接收状态
uart2txd=0; //无线发射端
CTRL485=1; //1为接收;0为发送485接收状态
LED_red=1; //
LED_green=1; //
ES = 1;
EA=1;
}
////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------------
//功能:RTC初始化
//--------------------------------------------------------------------------------------
void RTC_Init()
{
Time_S=0;
Time_M=0; //Time_M,Time_S初始化为0
IEN0|=0xC0; //使能RTC中断,使能EA中断
WDCON=0xE0; //关闭看门狗中断
RTCH=0xE0;
RTCL=0xFF; //7.3728MHz下,1s中断1次时,RTC的定时值
RTCCON=0x63; //开启RTC模块
}
/*------------------------------------------------------------------------------------*/
//-------------------------------------------------------------------------------------
//功能:模拟时钟变化,
//Time_S为秒,Time_M为分
//--------------------------------------------------------------------------------------
void Inc_time()
{
Time_S++;
if(Time_S>59)
{
Time_S=0;
Time_M++;
if(Time_M>59)
{
Time_M=0;
Time_x++;
if(Time_x>23) Time_x=0;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//功能:RTC中断服务程序
//-----------------------------------------------------------------------------
void RTC_ISR() interrupt 10
{
EA=0;
RTCCON&=0x63; //清除RTC中断标志位
Inc_time();
EA=1;
}
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
uchar Int_System(void)
{ uchar count,num=0,i;
uchar idata work_dat[16]={0};
Read_Datato_E2RAM(16,0,work_dat);
if(work_dat[0]==0x36)
{
count=work_dat[1];
for(i=0;i<count+1;i++)
{
num+=work_dat[1+i];
}
if(num==0)
{ WorkMode=work_dat[3];
//Load_x=work_dat[6];
//Load_M=work_dat[7];
//Load_S=work_dat[8];
botelv=work_dat[8];
Readnum=work_dat[13];
return(0x01);}
else return(0x00);
}
else return(0x00);
}
//////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
void Wait_Code1(void)
{
uchar idata work_dat[16]={0};
uchar i1,ki1,j1;
LED_red=1;
LED_green=0;
KF=0;
RFC=0; //无线接收状态控制位0为发送,1为接收状态
uart2txd=0; //无线发射端
delayms(100);
KF=1;
RFC=1;
while(1){
while(1){
if(uart2read()==0x55)ki1++;
else ki1=0;
if(ki1>5)break;
}
while(1){if(uart2read()==0x36)
{work_dat[0]=0x36;break;}
}
ki1=uart2read();
work_dat[1]=ki1;
for(i1=0;i1<ki1;i1++)work_dat[i1+2]=uart2read();
j1=0;
for(i1=1;i1<ki1+2;i1++)j1+=work_dat[i1];
if(j1==0)
{Write_Datato_E2RAM(16,0,work_dat);
botelv=work_dat[8];
for(i1=0;i1<botelv;i1++)
{
LED_red=!LED_red;
delayms(600);
LED_red=!LED_red;
delayms(600);
}
WorkMode=work_dat[3];
for(i1=0;i1<work_dat[3];i1++)
{
LED_green=!LED_green;
delayms(600);
LED_green=!LED_green;
delayms(600);
}
break;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
uchar Wait_Code2(void)
{
uchar idata work_dat[16]={0};
uchar ki1;
Time_S=0;
while(Time_S<3){
if(uart2read()==0x55)ki1++;
else ki1=0;
if(ki1>5)break;
}
while(Time_S<4){
if(uart2read()==0xff)break;
}
while(Time_S<5){
if(uart2read()==0x35)
{
work_dat[0]=0x35;break;
}
}
ki1=uart2read();
if(ki1==1)return(0x01);
else return(0x00);
}
////////////////////////////////////////////////////////////////////////////////////////
void SendDatatowless_a()
{uchar i_3,i;
for(i_3=0;i_3<3;i_3++)
{
LED_red=!LED_red;
delayms(600);
LED_red=!LED_red;
uart2txd=0; RFC=0;
delayms(10);
for(i=0;i<10;i++)uart2send(0x55);
for(i=0;i<2;i++)uart2send(0x00);
uart2send(0x06);uart2send(ch);
for(i=0;i<ch;i++){uart2send(ser_dat[i]);}
delayms(2);
uart2txd=0; RFC=1;
delayms(15);
// if(Wait_Code2()==1)break;
}
}
/////////////////////////////////////////////////////////////////////////////////////////
void SendDatatowless_b()
{
Time_S=0;Time_M=0;
while(Time_S>1);
LED_green=!LED_green;
delayms(300);
LED_green=!LED_green;
SendDatatowless_a();
// sendtoPCa();
delayms(10);
uart2txd=0; RFC=1;
sendRQ=0;ch=0; // reset send request flag
}
/////////////////////////////////////////////////////////////////////////////////////////
void Taking_overDataWelss(void)
{
uchar i;
// uchar xdata MTR_dat[60]={0};
while(uart2read()!=0x06);
ch=uart2read();
for(i=0;i<ch;i++)ser_dat[i]=uart2read();
LED_green=!LED_green;
delayms(300);
LED_green=!LED_green;
sendtoPCa();
delayms(10);
uart2txd=0; RFC=1;
sendRQ=0;ch=0;
}
/////////////////////////////////////////////////////////////////////////////////////////
/*-------------------------------------------------------------------------------------*/
// main
/*-------------------------------------------------------------------------------------*/
main()
{ uchar ki1,ip=50;
// uchar data MRD[2]={0};
// uchar data MRD_T[3]={0};
//uchar data MRD1[2]={0};
// uchar data MRD1_T[3]={0};
Init_cpuio();
InitTimer();
Init_Serial();
RTC_Init();
while(1){
if(Int_System()==0x00)Wait_Code1();
else {
Init_Serial();
LED_red=0;
LED_green=1;
uart2txd=0; RFC=1;
CTRL485=1;RI=0;
while(1)
{
if(key1==0){Write_Datato_00E2RAM (16,0 );break;}
if (sendRQ)SendDatatowless_b(); // wait for command 'S'
while(--ip){
if(uart2read()==0x55)ki1++;
else ki1=0;
if(ki1>5)break;
}
ip=50;
if(ki1>5)Taking_overDataWelss();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -