⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdle-j20_main.c

📁 51单片机及C语言入门源代码
💻 C
字号:
/*----------------------------------------
CDLE-J20_Main.c

20个继电器控制电路
	用I/O口20线加三极管驱动20个继电器


Copyright 2003 http://cdle.yeha.net 
               http://cdle.126.com
All rights reserved.		
		明浩 E-mail: pnzwzw@163.com
----------------------------------------*/

#include <AT89X51.h>

static unsigned char data CN[4];
static unsigned char data CT;
unsigned char code TS[8] = {1,2,4,8,16,32,64,128};

void main(void)
{
	void InitCom(unsigned char BaudRate);
	void ComOutChar(unsigned char OutData);
	void CSToOut(void);
	void CNToOut(void);
	unsigned int a;
	
	P0 = 0;
	P1 = 0;	
	P2 = 0; //IO口清零
	CT = 0; //接收字符序列
	CN[1] = 0;
  CN[2] = 51;
	CN[3] = 51;
	CN[4] = 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的简单方式保证接收的可靠性,可以满足要求
				{
					CSToOut();		//收到的数据格式正确时,调用控制输出函数							
				}
		}
}

//根据全局变量输出相应的控制信号
void CSToOut(void)
{
	unsigned char data a;
	unsigned int data b;
	switch(CN[1])  //aXXa的格式定义是第一个X为端口0为P2,1为P0,2为P1,3为关闭所用(同时要第2个X为3,XX=33)
		{           //XX=44为测试用,大于4则为无效数据,
			case 0:					//第一个X小于3时,第二个X为要输出的数据。
				P2 = CN[2];
				break;
			case 1:
				P0 = CN[2];
				break;
			case 2:
				P1 = CN[2];	
				break;
			case 3:
				P0 = 0;
				P1 = 0;
				P2 = 0;
				break;
			case 4:
				for (a=0; a<8; a++)
					{
						P2 = TS[a];
						for (b=0; b<50000; b++);
					}
				P2 = 0;
				for (a=0; a<8; a++)
					{
						P0 = TS[a];
						for (b=0; b<50000; b++);
					}
				P0 = 0;
				for (a=0; a<4; a++)
					{
						P1 = TS[a];
						for (b=0; b<50000; b++);
					}
				P1 = 0;
				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 + -