/******************************************************************** 
                            汇诚科技 
 
实现功能:此版配套测试程序 
使用芯片:AT89S52 
晶振:11.0592MHZ 
波特率:9600 
编译环境:Keil 
作者:zhangxinchunleo 
网站:www.ourhc.cn 
淘宝店:汇诚科技 http://shop36330473.taobao.com 
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!      
 
*********************************************************************/ 
/******************************************************************** 
单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600. 
 
单片机接收PC机发送的十六进制码表如下: 
 
01、全开:PC发送0xFF; 单片机返回0XFF; 
02、全关:PC发送0X00; 单片机返回0X00; 
 
03、第一路开:PC发送0x01;单片机返回0X01; 
04、第二路开:PC发送0x02;单片机返回0X02; 
05、第三路开:PC发送0x03;单片机返回0X03; 
06、第四路开:PC发送0x04;单片机返回0X04; 
07、第五路开:PC发送0x05;单片机返回0X05; 
08、第六路开:PC发送0x06;单片机返回0X06; 
09、第七路开:PC发送0x07;单片机返回0X07; 
10、第八路开:PC发送0x08;单片机返回0X08; 
 
11、第一路关:PC发送0xFE;单片机返回0XFE; 
12、第二路关:PC发送0xFD;单片机返回0XFD; 
13、第三路关:PC发送0xFC;单片机返回0XFC; 
14、第四路关:PC发送0xFB;单片机返回0XFB; 
15、第五路关:PC发送0xFA;单片机返回0XFA; 
16、第六路关:PC发送0xF9;单片机返回0XF9; 
17、第七路关:PC发送0xF8;单片机返回0XF8; 
18、第八路关:PC发送0xF7;单片机返回0XF7; 
 
19、输入状态查询:PC发送0x55;单片机返回输出状态(返回值十六进制); 
20、输出状态查询:PC发送0xAA;单片机返回输出状态(返回值十六进制); 
21、输出取反指令:PC发送0X11;单片机返回0x11; 
 
*********************************************************************/ 
#include<reg52.h>   
#define uchar unsigned char//宏定义无符号字符型 
#define uint unsigned int  //宏定义无符号整型 
/******************************************************************** 
                            初始定义 
*********************************************************************/ 
uchar sj; //存储数据值 
bit write=0; //写24C08 的标志; 
uchar dat=0xee; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容 
/*定义八位出为单片机P2口*/ 
sbit K1=P2^0; 
sbit K2=P2^1; 
sbit K3=P2^2; 
sbit K4=P2^3; 
sbit K5=P2^4; 
sbit K6=P2^5; 
sbit K7=P2^6; 
sbit K8=P2^7; 
 
/*定义八位入为单片机P1口*/ 
sbit IN0=P1^0; 
sbit IN1=P1^1; 
sbit IN2=P1^2; 
sbit IN3=P1^3; 
sbit IN4=P1^4; 
sbit IN5=P1^5; 
sbit IN6=P1^6; 
sbit IN7=P1^7; 
/******************************************************************** 
                    24C08 读写驱动程序 
*********************************************************************/ 
sbit scl=P3^6; // 24c08 SCL 
sbit sda=P3^7; // 24c08 SDA 
 
void delay1(uchar x) 
{  
uint i; 
for(i=0;i<x;i++); 
; 
} 
void flash(){ ; ; } 
void x24c08_init() //24c08 初始化子程序 
{ 
scl=1;  
flash();  
sda=1;                      
flash(); 
} 
void start() //启动(I方C)总线 
{ 
sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash(); 
} 
void stop() //停止(I方C)总线 
{ 
sda=0; flash(); scl=1; flash(); sda=1; flash(); 
} 
void writex(uchar j) //写一个字节 
{  
uchar i,temp; 
temp=j; 
for (i=0;i<8;i++) 
{ 
temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash(); 
} 
scl=0; flash(); sda=1; flash(); 
} 
uchar readx() //读一个字节 
{ 
uchar i,j,k=0; 
scl=0; flash(); sda=1; 
for (i=0;i<8;i++) 
{ 
flash(); scl=1; flash(); 
if (sda==1) j=1; 
else j=0; 
k=(k<<1)|j; 
scl=0;} 
flash(); return(k); 
} 
void clock() //(I方C)线时钟 
{ 
unsigned char i=0; 
scl=1; flash(); 
while ((sda==1)&&(i<255))i++; 
scl=0; flash(); 
} 
/******************************************************************** 
                从24c08 的地址address 中读取一个字节数据 
*********************************************************************/ 
unsigned char x24c08_read(unsigned char address) 
{ 
unsigned char i; 
start(); writex(0xa0); 
clock(); writex(address); 
clock(); start(); 
writex(0xa1); clock(); 
i=readx(); stop(); 
delay1(10); 
return(i); 
} 
/******************************************************************** 
                向24c08 的address地址中写入一字节数据 
*********************************************************************/ 
void x24c08_write(unsigned char address,unsigned char info) 
{ 
EA=0; 
start(); writex(0xa0); 
clock(); writex(address); 
clock(); writex(info); 
clock(); stop(); 
EA=1; 
delay1(50); 
} 
/******************************************************************** 
                            延时函数 
*********************************************************************/ 
void delay(uchar t) 
{ 
  uchar i,j; 
   for(i=0;i<t;i++) 
   { 
            for(j=13;j>0;j--); 
         { ; 
         } 
   } 
} 
 
/******************************************************************** 
              功能:串口初始化,波特率9600,方式1 
*********************************************************************/ 
void Init_Com(void) 
{ 
TMOD = 0x20; 
PCON = 0x00; 
SCON = 0x50; 
TH1 = 0xFd; 
TL1 = 0xFd; 
TR1 = 1; 
} 
 
/******************************************************************** 
                            接收数据判断函数 
*********************************************************************/ 
chuankou() 
{ 
switch(dat) //接收数据判断 
{ 
uchar k; 
k=10; 
case 0xff: P2=0X00;delay(k);SBUF = dat;dat=0xee;write=1;break; //  全开 
case 0x00: P2=0XFF;delay(k);SBUF = dat;dat=0xee;write=1;break; //  全关 
 
case 0x01: K1=0;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第一路开 
case 0x02: K2=0;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第二路开 
case 0x03: K3=0;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第三路开 
case 0x04: K4=0;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第四路开 
case 0x05: K5=0;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第五路开 
case 0x06: K6=0;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第六路开 
case 0x07: K7=0;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第七路开 
case 0x08: K8=0;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第八路开 
 
case 0xFE: K1=1;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第一路关 
case 0xFD: K2=1;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第二路关 
case 0xFC: K3=1;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第三路关 
case 0xFB: K4=1;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第四路关 
case 0xFA: K5=1;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第五路关 
case 0xF9: K6=1;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第六路关 
case 0xF8: K7=1;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第七路关 
case 0xF7: K8=1;delay(k);SBUF = dat;dat=0xee;write=1;break;           //  第八路关 
 
case 0x55: SBUF = P1;delay(k);dat=0xee;break;           //  读输入口状态 
case 0xAA: SBUF = P2;delay(k);dat=0xee;write=1;break;           //  读输出口状态 
 
case 0x11: P2=~P2;delay(k);SBUF = dat;dat=0xee;write=1;break;  //  输出口取反 
 
default:break;                                           //  跳出 
} 
} 
/******************************************************************** 
                            按键函数 
*********************************************************************/ 
KEY() 
{ 
uchar k; 
k=200; 
if(IN0==0){delay(k);if(IN0==0){delay(k);K8=!K8;while(!IN0);delay(k);write=1;}} 
if(IN1==0){delay(k);if(IN1==0){delay(k);K7=!K7;while(!IN1);delay(k);write=1;}} 
if(IN2==0){delay(k);if(IN2==0){delay(k);K6=!K6;while(!IN2);delay(k);write=1;}} 
if(IN3==0){delay(k);if(IN3==0){delay(k);K5=!K5;while(!IN3);delay(k);write=1;}} 
if(IN4==0){delay(k);if(IN4==0){delay(k);K4=!K4;while(!IN4);delay(k);write=1;}} 
if(IN5==0){delay(k);if(IN5==0){delay(k);K3=!K3;while(!IN5);delay(k);write=1;}} 
if(IN6==0){delay(k);if(IN6==0){delay(k);K2=!K2;while(!IN6);delay(k);write=1;}} 
if(IN7==0){delay(k);if(IN7==0){delay(k);K1=!K1;while(!IN7);delay(k);write=1;}} 
} 
/******************************************************************** 
                            主函数 
*********************************************************************/ 
void main() 
{ 
Init_Com();//串口初始化 
x24c08_init(); //初始化24C08 
sj=x24c08_read(2);//读出保存的数据赋于dat 
P2=sj;//将存储的数据赋予P2口 
while(1) 
{ 
chuankou();         // 接收数据判断函数  
 
if ( RI ) //扫描判断是否接收到数据, 
{ 
dat = SBUF; //接收数据SBUF赋与dat 
RI=0; //RI 清零。 
}  
KEY(); //调用按键函数  
if(write==1) //判断计时器是否计时一秒 
{ 
write=0; //清零 
sj=P2;        //将P2口的值赋予dat 
x24c08_write(2,sj); //在24c08 的地址2 中写入数据dat 
}            
} 
} 
         
/******************************************************************** 
                              结束 
*********************************************************************/ 
 
 
 
 |