关闭

举报

  • 提交
    首页 > 城乡供需 > 日常供需 > 车找人 > 正文
    购物车
    0

    姬家寨牌C51单片机工业控制板

    姬学瑞     2018-09-01 09:55:11     浏览:4    回复:0    点赞:0
    发帖人:姬学瑞
    级 别
    贡献值
    免费发布 注册会员 点击查看电话号码

    《姬家寨牌C51单片机工业控制板》

    硬件设计:姬学瑞;软件编程:姬学瑞;

    版权所有,侵权必究!姬家寨村电子科技研究所研制!

    /********************************************************************

                          姬家寨村电子科技

     

    实现功能:此版配套测试程序

    使用芯片:AT89S52

    晶振:11.0592MHZ

    波特率:9600

    编译环境:Keil

    作者:姬学瑞

    【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!    

     

    *********************************************************************/

    /********************************************************************

    单片机与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() //启动(IC)总线

    {

    sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();

    }

    void stop() //停止(IC)总线

    {

    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() //(IC)线时钟

    {

    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

    }       

    }

    }

          

    /********************************************************************

                                  结束

    *********************************************************************/


    打赏捐赠
    0
    !我要举报这篇文章
    声明 本文由村网通注册会员上传并发布,村网通仅提供信息发布平台。文章仅代表作者个人观点,不代表村网通立场。本文如涉及侵权请及时联系我们,我们将在24小时内予以删除!