📄 uart1.c
字号:
#include <REG932.H>
#include "uart1.h"
//通信中断
void UART_ISR(void) interrupt 4 using 1
{ char ch1;
if(RI)
{ RI = 0;ch1=SBUF;
sendRQ++;
if(com_start)
if(rec_p1)
{
rec1[rec_p1] = ch1;
rec_p1++;
if(rec_p1>19)rec_p1=19;
}
else
{if(ch1!=0x55)
rec1[rec_p1++] = ch1;
}
else
{ if(ch==0x55)
if(ch1==0x55)
{ com_start=1;
rec_p1=0;ch=0;
}
else ch=0;
else {ch=ch1;}
}
}else
if(TI)
{
TI=0;// clear transmit interrupt flag
if(c1)
{
SBUF=*ppp++;// start sending one byte
c1--;
}else string_end=0;
}
}
void sendtext1(char* dat)//送出文本,结束符停止
{ tt=0;//char tt;
while(string_end)//等待发送结束40毫秒
{ msec(1);
if(string_end)
{tt++;if(tt>40)string_end=0;}
}
if(!string_end)
{ string_end=1;c1=0;
ppp=dat++;//
while(*dat++){//计算发送字节
c1++;};
SBUF= *ppp++;
}
}
void sendbyte1(char dat)//送出单字节
{ tt=0;//char tt;
while(string_end)//等待发送结束40毫秒
{ msec(1);
if(string_end)
{tt++;if(tt>40)string_end=0;}
}
if(!string_end)
{ string_end=1;c1=0;
SBUF= dat;
}
}
void send9600(char* dat,uchar i)//按长度参数送出串,
{ tt=0;//char tt;
while(string_end)//等待发送结束40毫秒
{ msec(1);
if(string_end)
{tt++;if(tt>40)string_end=0;}
};
if(!string_end)
{ string_end=1;c1=i-1;
ppp=dat;
SBUF= *ppp++;
}
}
void asc16(char aa,char* p)//查表拆分一字节为16进字符2个
{ *p++ =asc16_0_f[(aa>>4)&0x0f];
*p++ =asc16_0_f[aa&0x0f];
}
void HEX_BCD_ASC(char aa,char* p)//0-99拆16进数为2字节十进ASC数
{
*p++ = aa/10+0x30;
*p = aa%10+0x30;
}
void init_io(void)//端口初始化为
{
P0M1 = 0x00;//00000000; // M1=0 M2=0 准双向
P0M2 = 0x00;//00001000;//01 推挽 11开漏输出 10输入
P1M1 = 0x00; //push pull except RX
P1M2 = 0x00; //0xFD;
P2M1 = 0x00; // push pull
P2M2 = 0x00;
OCA=1;
ICA=1;
KB2=1;
KB1=1;
ES = 1; // enable UART interrupt
EA = 1;
}
void UART_init(void)//通信口初始化
{
SCON=0x50; // select BRG as UART Baud Rate Gen
SSTAT=0x40;//60; // separate Rx / Tx interrupts
BRGR0=0xF0; // setup BRG for 9600 baud @ 7.373MHz internal RC oscillator
BRGR1=0x02;
// BRGR0=0x70; // setup BRG for 9600 baud @ 12MHz external Crystal
// BRGR1=0x04;
BRGCON = 0x03; // enable BRG
EX0=1;
IT0=1;
EX1=1;
IT1=1;
WDCON=0;
RTCCON = 0X60;//0x40;//0x63; //开RTC 定时器
RTCH = RTCH_DATA;
RTCL = RTCL_DATA; //设置初值
RTCCON = 0x63; //0x43;//开RTC 定时器
EWDRT=1;
}
void msec(int x) // 延时 x 毫秒
{
int j=0;
while(x>=0)
{
for (j=0; j<669; j++);//7.373Mhz
x--;
}
}
/**********************************/
//实时时钟中断程序
//功能:软件清零RTC 中断标志,重装计数值
/*********************************/
void RTC_int(void) interrupt 10
{
RTCCON &= 0x7e; //清零中断标志
// RTCH = RTCH_DATA;
// RTCL = RTCL_DATA; //设置初值
RTCCON = 0x63; //0x43;//清零中断标志
rtc1++;
}
//雨量中断*************************
void yuliang_int1() interrupt 2
{
yuliang1++;
}
void yuliang_int0() interrupt 0
{
yuliang1++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -