#include "config.h"
#include "math.h"
#include "mydef.h" // 自定义的常数
#include "myfun.h" // 自定义的函数
#include "myvrb.h" // 自定义的各种变量
// 主程序
int main(void)
{
meter_init(); // 开机时的上电初始化操作
while(1)
{
if(DATASEND==1)
{ // 把数据发给上位机
DATASEND=0;
datatoe8();
}
if(DATAREV==1)
{ // 处理来自上位机的数据
DATAREV=0;
e8todata();
}
if(UART0INIT==1)
{
UART0INIT=0;
UART0_Init(); // 串行通讯口初始化。
}
}
return(0);
}
// 开机时的上电初始化操作
void meter_init(void)
{
uint8 i;
// 开机时各IO口设置
PINSEL0=0x00000005; // 引脚功能设定 P0.0为TxD P0.1为RxD 其余P0口为GPIO
PINSEL1=0x00000000; // 引脚功能设定 P1口为GPIO
// 空IO口全部为输出低电平
IO0DIR=0x3BF3FFCC; // 0为输入,1为输出
IO1DIR=0x03FE0000; //
IO2DIR=0xE3DF0000; //
IO3DIR=0x30000000;
IO0SET=0x0080030C; //相应位置高电平
IO1SET=0x00880000;
IO2SET=0x00000000;
IO3SET=0x30000000;
Delay(20);
IO0CLR=0x3F73FCF0; //相应位清零
IO1CLR=0x03760000;
IO2CLR=0xE3DF0000;
IO3CLR=0x00000000;
Delay(600);
IO3CLR |= BEEP; //P3.28清零 停止蜂鸣器 高电平有效
Delay(10);
for(i=0;i<14;i++)
{
databuff[i]=0;
}
UART0_Init(); // 串行通讯口初始化。
VICIntSelect=0x00000000; //0:对应的中断请求分配为IRQ 1:对应的中断请求分配为FIQ。
}
// 串行通讯口0初始化操作,使用半双工方式
void UART0_Init(void)
{
uint16 Fdiv;
U0LCR=0x80; //8位为高电平的时候,可以设置波特率
Fdiv=(Fpclk/16)/57600; // 波特率为57600
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03; // 8个数据位,1个起始位,1个结束位。
U0FCR=0xC1; // 使能FIFO,14字节触发。
U0IER=0x01; // 允许接收中断
DATAREV=0; //有数据从上位机收到标志
DATASEND=0; //有数据要向上位机发送标志
UART0INIT=0; //数据发送完毕标志和还有后续数据标志
VICVectCntl7=0x26;
VICVectAddr7=(uint32)IRQ_UART0;
COMENABLE; // 使能串行通讯中断
}
// 串行通讯中断响应程序
void __irq IRQ_UART0(void)
{
uint8 i;
if((U0IER&0x02)==0x02)
{ // 串行通讯中断之发送中断
if(U0LSR&0x40)
{ // 检测到发送器为空
U0FCR|=0x04;
U0IER=0x00; // 改为允许接收中断
UART0INIT=1;
}
}
if((U0IER&0x01)==0x01)
{ // 串行通讯中断之接收中断
if(0x04==(U0IIR&0x0f))
{
U0IER=0x02; // 改为允许发送中断。
DATAREV=1; // 收到一帧数据
}
for(i=0;i<14;i++)
databuff[i]=U0RBR; // 只要读走数据就可以清除中断标志
U0FCR|=0x02;
}
VICVectAddr = 0x00; // 中断处理结束
}
// 向上位机发送数据
void datatoe8(void)
{
uint8 i;
for(i=0;i<14;i++)
U0THR=databuff[i];
}
// 处理来自上位机的数据
void e8todata(void)
{
// 首先检测收到的数据是否是正确格式的一帧数据
if(databuff[0] == 0xa3)
{ // 是正确的一帧数据
switch(databuff[1])
{
case 0x01: //参数发送指令
databuff[0] = 0xa3;
databuff[1] = 0x81;
databuff[2] = 0x00;
databuff[3] = 0x24;
databuff[4] = 0x16;
databuff[5] = 0x00;
databuff[6] = 0x00;
databuff[7] = 0x00;
databuff[8] = 0x00;
databuff[9] = 0x00;
databuff[10]= 0x00;
databuff[11]= 0x00;
databuff[12]= 0x00;
databuff[13]= 0x00;
DATASEND=1;
break;
case 0x02: //测试数据指令
databuff[0] = 0xa3;
databuff[1] = 0x82;
databuff[2] = 0x01;
databuff[3] = 0x02;
databuff[4] = 0x03;
databuff[5] = 0x04;
databuff[6] = 0x05;
databuff[7] = 0x06;
databuff[8] = 0x15;
databuff[9] = 0x16;
databuff[10]= 0x00;
databuff[11]= 0x00;
databuff[12]= 0x00;
databuff[13]= 0x00;
DATASEND=1;
break;
case 0x03: //去皮指令
databuff[0] = 0xa3;
databuff[1] = 0x83;
databuff[2] = 0x00;
databuff[3] = 0x26;
databuff[4] = 0x16;
databuff[5] = 0x00;
databuff[6] = 0x00;
databuff[7] = 0x00;
databuff[8] = 0x00;
databuff[9] = 0x00;
databuff[10]= 0x00;
databuff[11]= 0x00;
databuff[12]= 0x00;
databuff[13]= 0x00;
DATASEND=1;
break;
default: //错误指令
UART0_Init(); // 串行通讯口初始化
break;
}
}
else
{
UART0_Init(); // 串行通讯口初始化
}
}
void Delay(uint16 dly)
{
uint16 i;
while(dly)
{
for(i=0;i<100;i++);
dly--;
}
}
各位牛人,帮忙看看我这通讯程序,哪里出错了? |