?? cdle-j20_main.c
字號:
/*----------------------------------------
CDLE-J20_Main.c
24個繼電器控制電路
用I/O口24線加三極管驅動24個繼電器
簡單版本V1.0
更加好的單片機版本和PC控制軟件和DLL動態庫
請訪問磁動力工作室http://www.cdle.net
Copyright 2003 http://www.cdle.net
All rights reserved.
明浩 E-mail: pnzwzw@163.com
pnzwzw@cdle.net
----------------------------------------*/
#include <AT89X51.h>
static unsigned char data CN[4];
static unsigned char data CT;
unsigned char TS[8] = {254,252,248,240,224,192,128,0};
void main(void)
{
void InitCom(unsigned char BaudRate);
void ComOutChar(unsigned char OutData);
void CSToOut(void);
void CNToOut(void);
unsigned int a;
CT = 0; //接收字符序列
CN[0] = 0;
CN[1] = 51;
CN[2] = 51;
CN[3] = 0;
InitCom(6); //設置波特率為9600 1-8波特率300-57600
EA = 1;
ES = 1; //開串口中斷
do
{
for (a=0; a<30000; a++)
P3_6 = 1;
for (a=0; a<30000; a++) //指示燈閃動
P3_6 = 0;
}
while(1);
}
//串口初始化 晶振為11.0592M 方式1 波特率300-57600
void InitCom(unsigned char BaudRate)
{
unsigned char THTL;
switch (BaudRate)
{
case 1: THTL = 64; break; //波特率300
case 2: THTL = 160; break; //600
case 3: THTL = 208; break; //1200
case 4: THTL = 232; break; //2400
case 5: THTL = 244; break; //4800
case 6: THTL = 250; break; //9600
case 7: THTL = 253; break; //19200
case 8: THTL = 255; break; //57600
default: THTL = 208;
}
SCON = 0x50; //串口方式1,允許接收
TMOD = 0x20; //定時器1定時方式2
TCON = 0x40; //設定時器1開始計數
TH1 = THTL;
TL1 = THTL;
PCON = 0x80; //波特率加倍控制,SMOD位
RI = 0; //清收發標志
TI = 0;
TR1 = 1; //啟動定時器
}
//向串口輸出一個字符(非中斷方式)
void ComOutChar(unsigned char OutData)
{
SBUF = OutData; //輸出字符
while(!TI); //空語句判斷字符是否發完
TI = 0; //清TI
}
//串口接收中斷
void ComInINT(void) interrupt 4 using 1
{
if (RI) //判斷是不是收完字符
{
if (CT>3)
{
CT = 0; //收完一組數據,序列指針清零
CN[0] = 0;
CN[1] = 51;
CN[2] = 51;
CN[3] = 0;
}
CN[CT] = SBUF;
CT++;
RI = 0; //RI清零
if (CN[0]==0x61 && CN[3]==0x61) //用aXXa的簡單方式保證接收的可靠性,可以滿足業余的要求
{ //a也可以為板下的ID號,在同一個串行口上可以掛上一塊以上的板
CSToOut(); //收到的數據格式正確時,調用控制輸出函數
} //要想更為可靠的工作則要用到數據檢驗和通訊協議
}
}
//根據全局變量輸出相應的控制信號
void CSToOut(void)
{
unsigned char data a;
unsigned int data b;
switch(CN[1]) //aXXa的格式定義是第一個X為端口,0為P0,1為P1,2為P2,3為關閉所用(同時要第2個X為3,XX=33)
{ //XX=44為測試用,大于4則為無效數據,
case 0: //第一個X小于3時,第二個X為要輸出的數據。
P0 = CN[2];
break;
case 1:
P1 = CN[2];
break;
case 2:
P2 = CN[2];
break;
case 3:
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
break;
case 4:
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
for (a=0; a<8; a++)
{
P0 = TS[a];
for (b=0; b<50000; b++);
}
P0 = 0xFF;
for (a=0; a<8; a++)
{
P1 = TS[a];
for (b=0; b<50000; b++);
}
P1 = 0xFF;
for (a=0; a<4; a++)
{
P2 = TS[a];
for (b=0; b<50000; b++);
}
P2 = 0xFF;
break;
}
CNToOut();
}
void CNToOut(void)
{
ComOutChar(CN[0]);
ComOutChar(CN[1]);
ComOutChar(CN[2]);
ComOutChar(CN[3]);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -