📄 main.c
字号:
#include<AT89X51.H>
//#include <stdio.h>
//#include <absacc.h>
#define uchar unsigned char
#define TEST P3_6
#define Lamp P1_0
#define Select_Comm1 P1_1
#define Select_Comm2 P1_2
#define Select_Comm3 P1_3
#define Select_Comm4 P1_4
#define Select_Comm5 P1_5
#define Select_Comm6 P1_6
#define Select_Comm7 P1_7
#define DELAY_VALUE 300
#define scl P3_4
#define sda P3_5
uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info); //向24c02的address地址中写入一字节数据info
void x24c02_init(); //24c02初始化子程序
void delay1(uchar x);
void initial(void); //串口和系统初始化子程序
void delay(short i);//延时子程序
unsigned char Rcv_buffer[6],Snd_buffer[6];//定义接收发送缓冲区全局变量
//void flash();
//void x24c01_init();
//void start();
//void stop();
//void writex(uchar j);
//uchar readx();
//void clock();
uchar c,a;
unsigned short b;
/***************************主程序*******************************/
main(){
initial();//系统初始化
while(1){
while(1)
{
Lamp^=0x01;
delay(DELAY_VALUE);
for(b=1;b<300;++b)
{
if(TEST) break;
delay(2);
Lamp=1;
}
if(b==300) break;//连续按键超过3秒到下面测试程序执行
}
// Lamp=0;
a=0;b=0;c=1;
while(!TEST)
{
Lamp^=0x01;
delay(20);
}
// while(!TEST);//待待按键抬起
Lamp=0;
while(1)//进入测试循环
{
while((!TEST)&&(c<9))
{
delay(2);
if(TEST) break;
Lamp^=0x01;
c++;//测试次数
while(!TEST);//待待按键抬起
delay(50);
}
if(c==9)
{
P1_1=1;
delay(DELAY_VALUE);
delay(DELAY_VALUE);
delay(DELAY_VALUE);
delay(DELAY_VALUE);
P1_1=0;
break;
}
for(a=0;a<60;++a)
{
if(!TEST)break;
for(b=0;b<=30000;++b)if(!TEST) break;
}
if(a==60) break;
}
}
}
/*****************************************************************/
/*************************初始化程序*****************************/
void initial(void)
{
uchar data c=0;
IP=0x10;//定义串口为高优先级中断
SCON=0x50;//设置成串口1方式
TMOD=0x20;//波特率发生器T1工作在模式2上
TH1=0xFD;//预置初值(按照波特率9600BPS预置初值)
TL1=0xFD;
EA=1;//允许中断
ES=1;//允许串行中断
TR1=1;//启动定时器T1
//以上完成串口9600通讯初始化设置
Snd_buffer[0]=0x01;
Snd_buffer[1]=0x09;
Snd_buffer[2]=0x00;
Snd_buffer[3]=0x00;
Snd_buffer[4]=0x00;
Snd_buffer[5]=0x00;
x24c02_init();//初始化24C02
c=x24c02_read(0x01);//从24c02中读一个字节
//x24c02_write(a,b);//写一个字节数到24C02;a为器件内部地址b为要写入的数
delay1(200);
Snd_buffer[2]=c;
if(c&0x80) Select_Comm1=0;else Select_Comm1=1;//根据读入24C02内部存储的数值确定开关初始状态
if(c&0x40) Select_Comm2=0;else Select_Comm2=1;
if(c&0x20) Select_Comm3=0;else Select_Comm3=1;
if(c&0x10) Select_Comm4=0;else Select_Comm4=1;
if(c&0x08) Select_Comm5=0;else Select_Comm5=1;
if(c&0x04) Select_Comm6=0;else Select_Comm6=1;
if(c&0x02) Select_Comm7=0;else Select_Comm7=1;
}
/****************************************************************/
void delay(short i)
{
int j=0;
int k=0;
k=i*DELAY_VALUE;
while(j<k)
{
j++;
}
}
void Rcv_INT(void)interrupt 4
{
unsigned char i;
RI=0;
while(1)
{
if((SBUF^0xFE)!=0)break;//如果数据头不为FE则退出中断
ES=0;//关串口中断
while(1)
{
for(i=0;i<6;i++)
{while(RI==0);
RI=0;
Rcv_buffer[i]=SBUF;
}
if(Rcv_buffer[0]!=0x01)break;//解码器地址不正确退出
if(Rcv_buffer[5]!=(Rcv_buffer[0]+Rcv_buffer[1]+Rcv_buffer[2]+Rcv_buffer[3]+Rcv_buffer[4]))break;//校验位不等退出
switch(Rcv_buffer[1]){
case 0x01:if(Rcv_buffer[2]==1){Select_Comm1=0;Snd_buffer[2]|=0x80;}else{Select_Comm1=1;Snd_buffer[2]&=0x7F;}break;
case 0x02:if(Rcv_buffer[2]==1){Select_Comm2=0;Snd_buffer[2]|=0x40;}else{Select_Comm2=1;Snd_buffer[2]&=0xBF;}break;
case 0x03:if(Rcv_buffer[2]==1){Select_Comm3=0;Snd_buffer[2]|=0x20;}else{Select_Comm3=1;Snd_buffer[2]&=0xDF;}break;
case 0x04:if(Rcv_buffer[2]==1){Select_Comm4=0;Snd_buffer[2]|=0x10;}else{Select_Comm4=1;Snd_buffer[2]&=0xEF;}break;
case 0x05:if(Rcv_buffer[2]==1){Select_Comm5=0;Snd_buffer[2]|=0x08;}else{Select_Comm5=1;Snd_buffer[2]&=0xF7;}break;
case 0x06:if(Rcv_buffer[2]==1){Select_Comm6=0;Snd_buffer[2]|=0x04;}else{Select_Comm6=1;Snd_buffer[2]&=0xFB;}break;
case 0x07:if(Rcv_buffer[2]==1){Select_Comm7=0;Snd_buffer[2]|=0x02;}else{Select_Comm7=1;Snd_buffer[2]&=0xFD;}break;
case 0x09:if(Rcv_buffer[2]==1){
SBUF=0xFE;//发送起始符
while(TI==0);
TI=0;
for(i=0;i<6;i++){
if(i==5)SBUF=(Snd_buffer[0]+Snd_buffer[1]+Snd_buffer[2]+Snd_buffer[3]+Snd_buffer[4]);else SBUF=Snd_buffer[i];
while(TI==0);
TI=0;
}
}break;//如果收到命令为获取状态则向主机发送当前状态
default:break;
}//switch语句结束
if (Rcv_buffer[1]!=0x09)
{
x24c02_write(0x01,Snd_buffer[2]);//写入当前开关状态到24C02的0x01地址
delay1(200);//延时
}
break;
}
ES=1;//允许串口中断
break;
}
}
/************************以下为IIC程序包**************************/
void delay1(uchar x)
{
unsigned int i;
for(i=0;i<x;i++);
//DOG=~DOG;
}
void flash()
{
//uchar u;
// DOG=~DOG;
// WDIRST=0x1E;
// WDIRST=0xE1;
}
void x24c02_init()
{
scl=1; flash(); sda=1; flash();
}
void start()
{
sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
}
void stop()
{
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()
{
uchar i=0;
scl=1; flash();
while ((sda==1)&&(i<255))i++;
scl=0; flash();
}
uchar x24c02_read(uchar address)
{
uchar i;
start(); writex(0xa0);
clock(); writex(address);
clock(); start();
writex(0xa1); clock();
i=readx(); stop();
delay1(10);
return(i);
}
void x24c02_write(uchar address,uchar info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -