📄 main.c
字号:
/***************************************************************************************
*文件名称:Main.c
*作 者:
*版 本: 1.00
*项目名称: LIC-9601
*说 明: 主控芯片为AT89C52
*创建日期:2006.12.13
*修改记录:
****************************************************************************************/
//#pragma OT(8,SPEED) BR NOIP FF(0) DB OE CD
#include <reg52.h>
#include <absacc.h>
#include <ADEF.h>
#include <INTRINS.h>
/****************************************************************************************
*函数名称:beep()
*函数功能:蜂鸣器报警函数
*入口参数:无
*出口参数:无
*作 者:
*日 期:
*****************************************************************************************/
void beep (void){
unsigned char data j;
unsigned int data i;
FNC=1;
for(j=5;j>0;j--){
for(i=15000;i>0;i--){ //22M
}
}
FNC=0;
}
/****************************************************************************************
*函数名称:init()
*函数功能:系统初始化模块
*入口参数:无
*出口参数:无
*作 者:
*日 期:
*****************************************************************************************/
void init(void){
PSW =0;
IP =1;
IE =0; //开 IT1,IT0
TCON =0;
TMOD =0x16; //t1 16 inter time, t0 exter 8reload
SCON =0xE0;
PCON =0x80;
P10 = 0;
FNC = 0;
//XQG = UP;
FQG =1;
TCON =0;
flashbit = 0;
serbit =0;
errbit =0;
onbat =0;
t1_500ms = 0;
sec5 = 0;
onqg = 0;
qg_state =0;
jiguangbit =0;
qg = 0;
LDW = ld_off; //LED hang
LEDW = led_off; // 540 lie
GDW = gd_off;
abc = 0; //abc为档位号
}
/****************************************************************************************
*函数名称:initserial()
*函数功能:串口初始化模块
*入口参数:无
*出口参数:无
*作 者:
*日 期:
*****************************************************************************************/
void initserial(void){
SCON = 0xe0; /* SCON: mode 1, 8-bit UART, enable rcvr */
T2CON = 0x30; /* TMOD: timer 2, mode 3, 16-bit reload */
RCAP2H = _th2; //57600 FA 115200 Fd 24M F2
RCAP2L = _tl2;
TH2 = _th2; //t2: bps=fosc/32 / (65536-x) RCAP2L=0xfa
TR2 = 1; /* TR1: timer 1 run */
REN = 1;
TI = 0; /* TI: set TI to send first char of UART */
ES = 1;
// EA = 1; //?
addres = TXADR;
addres &=0x0f;
addres |=0xc0;
}
/****************************************************************************************
*函数名称:sendchar(c)
*函数功能:发送字节
*入口参数:c
*出口参数:无
*作 者:
*日 期:
*****************************************************************************************/
void sendchar (unsigned char c) {
TI = 0;
SBUF = c;
while (!TI);
TI = 0;
}
/****************************************************************************************
*函数名称:delay_char(mstime)
*函数功能:延迟函数
*入口参数:mstime
*出口参数:无
*作 者:
*日 期:
*****************************************************************************************/
void delay_char(unsigned char data mstime)
{
unsigned char data i;
i=mstime;
while(--i){}
}
/****************************************************************************************
*函数名称: sendstring(lenth)
*函数功能: 字符串发送
*入口参数: lenth
*出口参数: 无
*作 者:
*日 期:
*****************************************************************************************/
void sendstring(unsigned char *p,unsigned char data lenth) // idata *p
{
unsigned char *ip;
unsigned char data i;
ip=p;
for(i=0;i<lenth;i++){
sendchar(*ip);
ip++;
}
}
/****************************************************************************************
*函数名称: getchar()
*函数功能: 串口接受字节模块
*入口参数: 无
*出口参数: c
*作 者:
*日 期:
*****************************************************************************************/
unsigned char getchar () {
unsigned int data c=1000;
while(!RI) {} // serbit=1
c = SBUF;
RI = 0;
return (c);
}
/****************************************************************************************
*函数名称: getstring()
*函数功能: 串口接受字符串函数
*入口参数: lenth
*出口参数: *p
*作 者:
*日 期:
*****************************************************************************************/
void getstring(unsigned char idata *p,unsigned char data lenth)
{
unsigned char idata *ip;
unsigned char data i;
ip=p;
for(i=0;i<lenth;i++){
*ip=getchar();
ip++;
if(serbit) break;
}
}
/****************************************************************************************
*函数名称: PSserialInt()
*函数功能: 串口中断
*入口参数: 无
*出口参数: 无
*作 者:
*日 期:
*****************************************************************************************/
void PSerialInt(void) interrupt 4
{
unsigned char c[2],i;
if(_testbit_(RI)&&_testbit_(RB8)){
c[0]=SBUF;
if(c[0]==addres){
P10 =1;
TB8 = 1;
sendchar(addres+1);
SM2 = 0;
TB8 = 0;
c[1]=getchar();
switch(c[1]){
case 0xf0: getstring(&GET[0],6);
if(GET[4]==0) onbat =1;
else onbat =0;
if(GET[5]!=0x55) serbit=1;
else {
abc = 0;
for(i=0;i<12;i++){
GET[i] = 0;
LD[i] = 0; }
}
break;
case 0xf1: sendstring(&TT[0],12);
break;
case 0xf2: abc = getchar();
getstring(&GET[0],12);
for(i=0;i<12;i++){
TEMP[i] = TT[i]; //TEMP[12] 分选前有电池的位
} //LD[12] 点亮的电池位
if(abc==0) { //TT[12] 当前有电池的位
for(i=0;i<12;i++){ //GET[12] 想要点亮的电池位,
LD[i] = GET[i]; //abc:档位号,abc=0时,测试灯的好坏
}
}
break;
case 0xf3:
qg = getchar(); //汽缸开启与关闭
if(tuopan_state==1) qg=0,serbit=1;//汽缸开关为本地状态,TA3=1为本地状态;
break;
}
if(serbit) sendchar(0x44);
else sendchar(0x88);
}
}
// else c[0]=SBUF;
if(TI) TI=0;
P10 = 0;
SM2 = 1;
serbit =0;
}
/****************************************************************************************
*函数名称:writeled(hang)
*函数功能:发光二极管点亮函数
*入口参数:hang
*出口参数:无
*作 者:
*日 期:
*****************************************************************************************/
void writeled(unsigned char data hang)
{
unsigned char data i;
LEDW = led_off; //lie 0-7
LDW = ld_off;
i = hang;
LDW = i;
if(onbat) {
LEDW = TT[i]; //TT[12]:当前有电池的位
}
else {
LEDW = LD[i]; //LD[12]:点亮的电池位
}
}
/****************************************************************************************
*函数名称: timego()
*函数功能: 定时器1中断函数
*入口参数: 无
*出口参数: 无
*作 者:
*日 期:
*****************************************************************************************/
void timego(void) interrupt 3
{ //定时 t1
TT[hang] = ~V1R; //红外线发接受管列读入,行为GDW,列为V1R
/*#ifdef onebyone
if(hang==1) {
nop;
}
#endif*/
if(++hang==12) hang= 0;
if(jiguangbit==0)
{
GDW = hang;
writeled(hang); //点亮相应的电池位
}
if(errbit) onbeep =1;
else onbeep =0,FNC =0;
if(FNC==1&&flashbit==0){ //电池取错蜂鸣器报警,LED闪烁
FNC=FNC;
}
if(++t1_500ms>=500)
{
flashbit=~flashbit;
t1_500ms=0; //托盘到位检测
if(flashbit&&onbeep) FNC=1;
else FNC=0;
if(++sec5>=6){
sec5 = 0;
errbit=0;
}
}
FQG = 1; //*********************
key_state = FQG;
if(key_state!=key) { //汽缸开关状态检测 &&tuopan_state==1
onqg=1;
}
tuopan_state = TXADR;
tuopan_state >>= 5;
if(onqg&&tuopan_state==1) {
FNC = 0;
LEDW = led_off;
LDW = ld_off;
if(key_state) { //0
XQG = DOWN;
qgtime = 0 ;
GDW = 0x90;
jiguangbit = 1;
qg_state = 1;
}
else {
XQG = UP;
qg_state = 0; //1
}
while(key!=key_state) //{FQG = 1,key = FQG;}
{
key=~key;
}
onqg = 0;
}
else if(onqg&&tuopan_state!=1){
onqg = 0;
}
if(qg!=0&&tuopan_state==0) {
FNC = 0;
LEDW = led_off;
LDW = ld_off;
if(qg==0x55) {
XQG = DOWN;
qgtime = 0 ;
GDW = 0x90;
jiguangbit = 1;
qg_state = 1;
}
else {
XQG = UP;
qg_state = 0;
}
qg = 0;
}
else if(qg!=0&&tuopan_state!=0){
qg=0;
}
while(jiguangbit)
{ //TEST JIGUANG GUAN
JIG = 1;
JIG = JIG;
if(JIG==1){
delay_char(250);
JIG = JIG; //JIG低电平正常,高电平错误
if(JIG&qg_state){
XQG = UP;
qg_state = 0; //
jiguangbit = 0;
GDW = 0x10; ///
errbit = 1;
}
}
}
if(qg_state)
{ qgtime++;
if(qgtime>=3000) {
qg_state = 0;
qgtime = 0;
jiguangbit = 0;
GDW = 0X10;
}
}
TL1 = _tl1;
TH1 = _th1;
}
/****************************************************************************************
*函数名称:getledbyte(pm)
*函数功能:电池错拿检测函数
*入口参数:pm
*出口参数:errbit,LD[M],
*作 者:
*日 期:
*****************************************************************************************/
void getledbyte(unsigned char data pm)
{
unsigned char data atemp,m,att;
m = pm;
atemp = (~TEMP[m])&TT[m]; //TEMP[12] 分选前有电池的位
att = (TEMP[m]&(~TT[m]))&(~GET[m]);
LD[m] = (TEMP[m]&TT[m])&GET[m]; //LD[i]:分选时点亮的电池位
if(atemp) {
errbit = 1;
if(flashbit) LD[m] |= atemp;
else LD[m] &= (~atemp);
}
if(att)
{ //att电池取错的位
errbit = 1;
if(flashbit) LD[m] |= att;
else LD[m] &= (~att);
}
}
/****************************************************************************************
*函数名称:main()
*函数功能:主函数
*入口参数:无
*出口参数:无
*作 者:
*日 期:
*****************************************************************************************/
void main(void)
{
unsigned char data i;
init();
initserial();
LDW = 12; //LED hang
LEDW = 0x0; // 540 lie
GDW = gd_off;
hang = 0;
GDW = hang;
beep();
IE = 0x98; //0x98
TCON = 0X40;
XQG = UP; //汽缸为开启状态
FQG = 1;
i = 0;
key = FQG;
key_state = FQG;
while(1){
if(abc != 0) getledbyte(i);
if(++i == 12)
{
i=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -