找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2816|回复: 0
打印 上一主题 下一主题
收起左侧

开关量输入,pc端和单片机相连

[复制链接]
跳转到指定楼层
楼主
ID:215989 发表于 2017-6-30 06:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sw_0=P3^3;//开关端口定义  switch
sbit sw_1=P3^4;
sbit sw_2=P3^5;
sbit sw_3=P3^6;
//sbit PS0=P2^4;
//sbit PS1=P2^5;
//sbit PS2=P2^6;
//sbit PS3=P2^7;
sfr P_data=0x80;
sbit P_K_L=P2^2;
uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};         //字段转换表
uchar rec[50];         //不能超过50
uchar code error[]={0x40,0x30,0x46,0x2a,0x2a,0x37,0x36,0x0d};        //数据不正确
uchar send[]={0x40,0x30,0x46,0x30,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x0d};          //正确的数据
uchar i;
uchar t;
uint sw_in(void);        //开关量输入采集
void display(uint);
void delay(uint);
uint dth(uint);                   //16~10
uchar ath(uchar,uchar);         //ASCII~16
uint hta(uchar);         //16~ASCII
void uart(void);
void main(void)
{
   uint a,b,c,t;
   TMOD=0x20;
   TL1=0xfd;
   TH1=0xfd;
   SCON=0x50;
   TR1=1;                   //为1是定时器T1开始计数;0时不计数。
   IE=0x90;
   while(1)
   {
      c=sw_in();
          t=dth(c);
          a=hta(t>>8);
          send[5]=a>>8;
          send[6]=(uchar)a;
          a=hta(t);
          send[7]=a>>8;
          send[8]=(uchar)a;
          b=0;
          for(a=1;a<9;a++)
          b^=send[a];
          b=hta(b);
          send[9]=b>>8;
          send[10]=(uchar)b;
          for(a=0;a<100;a++)
             display(c);
   }
}
//数码管显示函数没写
uint dth(uint a)
{
   uint b,c;
   b=a%16;
   if(b>9)
     c=b+6;
   else
     c=b;
   a=a/16;
   b=a%16;
   if(b>9)
     c+=(b+6)*10;
   else
     c=c+b*100;
   a=a/16;
   b=a%16;
   if(b>9)
     c+=(b+6)*1000;
   else
     c=c+b*1000;
   return c;
}
void delay(uint delay_time)
{
   for(delay_time=20;delay_time>0;delay_time--)
   {}
}
uchar ath(uchar a,uchar b)
{
   if(a<0x40)
      a-=0x30;
   else if(a<0x47)
      a-=0x37;
          else if(a<67)
             a-=0x57;
   if(b<0x40)
      b=-0x30;
   else if(b<0x47)
      b-=0x37;
          else if(b<67)
             b-=0x57;
        return((a<<4)+b);
}
uint hta(uchar a)
{
   uint b;
   b=a>>4;
   a&=0x0f;
   if(a<0x0a)
      a+=0x30;
   else
      a+=0x37;
   if(b<0x0a)
      b+=0x30;
   else
      b+=0x37;
   b=((b<<8)+a);
   return b;

}
void uart(void) interrupt 4           //检查过了
{
   uchar a,b;
   if(RI)
   {
      a=SBUF;
          RI=0;
          if(a==0x40)//
             i=0;
          rec[i]=a;
          i++;
          if(a==0x0d)//
          {
             if(ath(rec[1],rec[2])==15)
                 {
                    b=0;
                        for(a=1;a<i-3;a++)
                        b^=rec[a];
                        if(b==ath(rec[i-3],rec[i-2]))
                        {
                           if((ath(rec[3],rec[4])&0x01)==0)          //
                           {
                              for(a=0;a<12;a++)           //
                                  {
                                     SBUF=send[a];
                                         while(TI!=1);
                                         TI=0;
                                  }
                           }
                        }
                        else   //
                        {
                           for(a=0;a<8;a++)         //
                           {
                              SBUF=error[a];
                                  while(TI!=1);
                                  TI=0;
                           }
                        }
                 }
          }
   }
   else
   {
      TI=0;
   }
}
开关量输入,pc端和单片机相连

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表