📄 init_comm.c
字号:
#include <reg52.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <intrins.h>
#include "define.h"
//#include "val.h"
#include "function.h"
//unsigned char ram_wr24c02;
//unsigned char pt_write_24c02;
#define TRRE_GAP_MAX 5
bit second_bit;
bit sec_bit,bReceOK;
unsigned char dms1,dms10,dms100,sec,key_dms10,comm_time;
unsigned char wel_time;
//unsigned char ram_373;
unsigned char idata cReceBuffer[30],cSendBuffer[30];
unsigned char cSendLen,cReceLen,cSendPosi,cReceTimeOut;
extern unsigned char upDataTime,cReceLen;
unsigned char rece_gap_time,speed_time;
unsigned char rece_pt;
/**************************************************/
// 系统进行初始化程序
/**************************************************/
//------------------------------------------------
// 对定时器0进行初始化
//------------------------------------------------
void init_t0(void)
{
TH0=0xf8;
TL0=0x2f;
ET0=1;
TR0=1;
}
//------------------------------------------------
// 串口进行初始化
//------------------------------------------------
void init_com(void)
{
SCON=0x40; // mode 1 tx/re
PCON=0x80; // smod=0 fosc
TMOD=0x21; // t0 16b/count t1 auto load
TH1=0xfa; // 19.2 kbit/s 1.2kbyte/s
TL1=0xfa;
RI=0;
TI=0;
REN=1; // enable ren
TR1=1; // enable time1 count
ES=1;
}
//------------------------------------------------
// 对存储的数据进行初始化
//------------------------------------------------
/*void init_setup(void)
{
EA=0;
Read24c02(ram_wr24c02,0,5);
EA=1;
}
void init_24c02(void)
{
EA=0;
// 读取 24C02 的读写指针
// Read24c02(&pt_write_24c02,PT_WRITE24C02_ADDRESS,1);
EA=1;
}*/
//------------------------------------------------
// 对液晶显示屏进行初始化,并进行时间的延迟,保证外部信号的有效性
//------------------------------------------------
void init_lcd(void)
{
unsigned char i;
GROUND_LED=0; // 背景灯亮
STATUS_LED=1; // 错误状态灯灭
BUZZER=1;
for(i=0;i<8;i=i+2) {
display_l_black(i,0,64);
display_r_black(i,0,64);
}
}
/**************************************************/
// 初始化程序结束
/**************************************************/
void init_sub(void)
{
init_com();
init_lcd();
init_t0();
// init_24c02();
open_display();
}
//---------------------
void time_add(void)
{
second_bit=0;
sec_bit=1;
wel_time++;
}
void t0_int(void) interrupt 1 // using 0
{
// TH0=0xfc; //
// TL0=0x18; //
TH0=0xf8; // 定时器中断中需要的数据初始化
TL0=0x2f; // 定时器中断中需要的数据初始化
clr_wdt=1;
// 计时过程的开始
dms1++;
if(dms1==10) {
dms1=0;
dms10++;
key_dms10++;
comm_time++;
if(dms10==10){
dms10=0;
dms100++;
upDataTime++;
speed_time++;
if(dms100==10) {
dms100=0;
second_bit=1;
}
}
}
if(cReceLen) {
rece_gap_time++;
if(rece_gap_time>TRRE_GAP_MAX) {
cReceLen=0; // 两个数据之间的时间超过了5MS,接收出错
// 接收的数据必须在5MS内处理完,否则接收缓冲器的指针会复位
// 或是长时间接收不到数据,接收缓冲器清空
// rece_bit_success=0; // 清除正确接收标志
// rece_bit_fail=0; // 清除错误接收标志
rece_gap_time=0; // 清除接收间隔时间
// REN=1; // enable rece
}
}
}
void uart_int(void) interrupt 4
{
if(TI)
{
TI = 0;
if(cSendLen > 0)
{
SBUF = cSendBuffer[cSendPosi++]|0x80;
cSendLen--;
}
else
{
// 使能485接收
tran_en = 0;
cReceLen = 0;
}
}
else if(RI)
{
RI = 0;
rece_gap_time=0;
cReceTimeOut = 5;
cReceBuffer[cReceLen] = SBUF&0x7f;
if(cReceLen > 5) {
if((cReceBuffer[cReceLen-1] == 0x0d) && (cReceBuffer[cReceLen] == 0x0a))
bReceOK = 1;
}
cReceLen++;
rece_pt=cReceLen;
if(cReceLen>28) cReceLen=0;
// cReceBuffer[cReceLen]=cReceLen;
// CheckCommData();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -