久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5823|回復: 4
打印 上一主題 下一主題
收起左側

兩個單片機之間的通訊和控制的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:69634 發(fā)表于 2015-3-28 22:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是STC12C5A60S2單片機連續(xù)測得8路模擬量,在本單片機中顯示通道號和數值(0-1024),并通過串口輸出下個單片機

#include"STC12C5A60S2.h"
#include"intrins.h"
unsigned char code LedChar[]={        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
unsigned char LedBuff[ ]={0xff,0xff,0xff,0xff,0xff        };                                                                          
unsigned int a = 0;
float AD_val = 0;
//------------------------------------------------------------------------------
void AD_init();
void serial_init();
void delay(unsigned int b);
float AD_work(unsigned char channel);
unsigned int AD_get(unsigned char channel);

void main()
{
          TMOD = 0x01;
        TH0 = 0xFC;
        TL0 = 0x67;
        TR0 = 1;
        EA = 1;
        ET0 = 1;

    AD_init();    //A/D轉換初始化
    serial_init();   //串口初始化
while(1)
{
        float b;
        unsigned char e, i,j=0;
        for(i=0;i<8;i++) //循環(huán)發(fā)送P1.0-P1.7的轉換數值
        {  b=AD_work(i);
               a=(unsigned int)b ;         
                LedBuff[0] = LedChar[a%10];
                        LedBuff[1] = LedChar[a/10%10];                       
                        LedBuff[2] = LedChar[a/100%10];
                        LedBuff[3] = LedChar[a/1000%10];
                        LedBuff[4] = LedChar[i];

                if(j==0)  { SBUF = i; while(!TI); TI=0;j++;}
                if(j==1)  {  SBUF = a; while(!TI); TI=0;j++;}
                if(j==2)  {  e = a>>8; SBUF = e;while(!TI);TI=0;j=0;}
            delay(2000); //延時約2s
        }
}
}
//------------------------------------------------------------------------------
unsigned int AD_get(unsigned char channel)
{
  ADC_CONTR=0x88|channel;    //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
  _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
  while(!(ADC_CONTR&0x10));    //等待轉換完成
  ADC_CONTR&=0xe7;      //關閉AD轉換,ADC_FLAG位由軟件清0
  return(ADC_RES*4+ADC_RESL);   //返回AD轉換完成的10位數據(16進制)
}
//------------------------------------------------------------------------------
float AD_work(unsigned char channel)
{
  float AD_val;     //定義處理后的數值AD_val為浮點數
  unsigned char i;
  for(i=0;i<100;i++)
  AD_val+=AD_get(channel); //轉換100次求平均值(提高精度)
  AD_val/=100;
  return AD_val;
}
//------------------------------------------------------------------------------
void delay(unsigned int b) //延時約1ms
{
        unsigned int i;
        while (--b!=0)
        for(i=600;i>0;i--);   //1T單片機i=600,若是12T單片機i=125
}

//------------------------------------------------------------------------------
void AD_init()
{
        P1ASF=0xff; //P1口全部作為模擬功能AD使用
        ADC_RES=0;   //清零轉換結果寄存器高8位
        ADC_RESL=0; //清零轉換結果寄存器低2位
        ADC_CONTR=0x80;//開啟AD電源
        delay(2);   //等待1ms,讓AD電源穩(wěn)定
}

          unsigned char j = 0;
           void InterruptTimer0()  interrupt 1                 
{
        TH0 = 0xFC;
        TL0 = 0x67;
        P0 = 0xFF;   
                           if(j == 0)                        {P2=7; j++;   P0=LedBuff[0];}  //數碼港顯示
                           else if(j == 1)                {P2=6; j++;   P0=LedBuff[1];}
                       else if(j == 2)                {P2=5; j++;   P0=LedBuff[2];}
                       else if(j == 3)                {P2=4; j++;   P0=LedBuff[3];}
                           else if(j == 4)                {P2=0; j=0;   P0=LedBuff[4];}
}
void serial_init()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd; //設置9600波特率
        SCON=0x50; //串口方式1,允許接收
        TR1=1;
}

void InterruptUART() interrupt 4
{   }


下面是90c516單片機,接受上單片機發(fā)來的數據和通道號,在1602液晶顯示

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit lcden=P0^5;
sbit lcdrw=P0^6;
sbit lcdrs=P0^7;
sbit jidianqi=P0^0;
uchar a,b, tab ;
uint tab1 ;

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void write_com(uchar com)
{
        lcdrs=0;
        P2=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void write_data(uchar date)
{
        lcdrs=1;
        P2=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init()
{

        lcden=0;
        write_com(0x38);
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80+0x03);
}
    /* 串口配置函數,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  //配置串口為模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1為模式2
    TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
    TL1 = TH1;     //初值等于重載值
    ET1 = 0;       //禁止T1中斷
    ES  = 1;       //使能串口中斷
    TR1 = 1;       //啟動T1
}

void UartRead(  )
{
          uchar j=0;
          if(j==0)  {   while(!RI);  tab=SBUF; RI=0; j++;}
          if(j==1)  {   while(!RI);  a=SBUF; RI=0;   j++;}
          if(j==2)  {   while(!RI);  b=SBUF;  RI=0;  j=0;}

          tab1=(b<<8)|((unsigned int)a);
}

void InterruptUART() interrupt 4
{
       if (RI)  //接收到新字節(jié)
    {
        RI = 0;  //清零接收中斷標志位
               
    }
    if (TI)  //字節(jié)發(fā)送完畢
    {
        TI = 0;   //清零發(fā)送中斷標志位
    }
}

uchar qian,bai,shi,ge;        //聲明兩個變量用來分解data1

void main()
{
        lcdrw=0;
        init();
        ConfigUART(9600);       
       
        while(1)

{

        UartRead( ) ;
        delay(20);
        write_com(0x80+0x03);
        write_data(tab+0x30);
        delay(20);

    qian= tab1/1000;
    bai=  tab1%1000/100;
    shi=  tab1%100/10;        //將十位分離出來
    ge=   tab1%10;        //將個位分離出來
    write_com(0x80+0x41);//要寫的地方,這里是第二行
    write_data(qian+0x30);
        delay(20);
    write_data(bai+0x30);
    delay(20);
    write_data(shi+0x30);//調用1602字庫,0x30+shi表示0-9數字,寫完后地址自動加一指針。
        delay(20);
    write_data(ge+0x30);
        delay(20);
        if(tab==0) {
                    if(tab1>500) {jidianqi=0;}
                                else         {jidianqi=1;}
                   }
  }               
}


問題是,控制繼電器太慢,循環(huán)一周后繼電器動作,現(xiàn)在要他tab1大于500數值(比仿50度溫度),立刻繼電器動作,通道號和數值循環(huán)不變,請問各位老師該如何做?



























分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:69634 發(fā)表于 2015-4-1 19:10 | 只看該作者
為什么沒有人回答,這道題怎么難嗎?
回復

使用道具 舉報

板凳
ID:69634 發(fā)表于 2015-4-5 22:37 | 只看該作者
沒有人回答,我自己改進了一下,效果不很理想。有時1602液晶顯示跑掉,通道號不變,繼電器反應快了

這是STC12C5A60S2單片機的

#include"STC12C5A60S2.h" //頭文件在STC公司主頁上下載
#include"intrins.h"
unsigned char code LedChar[]={        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f        };
unsigned char LedBuff[ ]={        0x3f, 0x3f,  0x3f, 0x3f        , 0x3f        };                                                                          
unsigned int g,  a = 0, n=0 ;
unsigned char d , m=0;
float AD_val = 0;
//------------------------------------------------------------------------------
void AD_init();
void serial_init();
void delay(unsigned int b);
float AD_work(unsigned char channel);
unsigned int AD_get(unsigned char channel);
void display(unsigned int g );
//------------------------------------------------------------------------------
void main()
{
        unsigned char j, e=0 ;
        float   b;
        unsigned int Led[]={ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
          TMOD = 0x01;
        TH0 = 0xFC;
        TL0 = 0x67;
        TR0 = 1;
        EA = 1;
        ET0 = 1;
AD_init();    //A/D轉換初始化
serial_init();   //串口初始化
while(1)
{
  for(d =0;d <8;d++) //循環(huán)發(fā)送P1.0-P1.7的轉換數值
   {            b=AD_work(d );
                    a=(unsigned int)b ;       
                                Led[d]        = a;
                            if(j==0)  { SBUF = d; while(!TI); TI=0; j++;}
                        if(j==1)  { SBUF = a; while(!TI); TI=0; j++;}
                        if(j==2)  { e = a>>8; SBUF = e;   while(!TI); TI=0; j=0; n++;}
                                  
                                if(n>=640) { n=0;  m=0; }
                       switch(m=n/80)
                                 {
                                        case 0:                                                
                                                g=        Led[0] ;                                                                        
                        display( g  ) ;
break;
                                        case 1:                                                                                         
                                                g=        Led[1] ;                                                                        
                                                display( g ) ;
break;
                                        case 2:                                                                                         
                                                g=        Led[2] ;                                                                        
                                                display( g ) ;                 
break;
                                        case 3:                                                                                         
                                                g=        Led[3] ;                                                                        
                                                display( g  ) ;
break;
                                        case 4:                                                                                         
                                                g=        Led[4] ;                                                                        
                        display( g ) ;
break;
                                        case 5:                                                                                         
                                                g=        Led[5] ;                                                                        
                        display( g  ) ;
break;
                                        case 6:                                                                                         
                                                g=        Led[6] ;                                                                        
                        display( g  );
break;
                                        case 7:
                                                 g=        Led[7] ;                                                                                
                        display( g  ) ;
break;
}
      }      
              }
}

void display(unsigned int g  )
{
        LedBuff[0] = LedChar[g%10];
        LedBuff[1] = LedChar[g/10%10];                       
        LedBuff[2] = LedChar[g/100%10];
        LedBuff[3] = LedChar[g/1000%10];
        LedBuff[4] = LedChar[m];
}
//------------------------------------------------------------------------------
unsigned int AD_get(unsigned char channel)
{
ADC_CONTR=0x88|channel;    //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
while(!(ADC_CONTR&0x10));    //等待轉換完成
ADC_CONTR&=0xe7;      //關閉AD轉換,ADC_FLAG位由軟件清0
return(ADC_RES*4+ADC_RESL);   //返回AD轉換完成的10位數據(16進制)
}
//------------------------------------------------------------------------------
float AD_work(unsigned char channel)
{
float AD_val;     //定義處理后的數值AD_val為浮點數
unsigned char i;
for(i=0;i<50;i++)
AD_val+=AD_get(channel); //轉換100次求平均值(提高精度)
AD_val/=50;
//AD_val=(AD_val*5)/1024; //AD的參考電壓是單片機上的5v,所以乘5即為實際電壓值
return AD_val;
}
//------------------------------------------------------------------------------
void delay(unsigned int b) //延時約1ms
{
unsigned int i;
while (--b!=0)
for(i=600;i>0;i--);   //1T單片機i=600,若是12T單片機i=125
}

//------------------------------------------------------------------------------
void AD_init()
{
P1ASF=0xff; //P1口全部作為模擬功能AD使用
ADC_RES=0;   //清零轉換結果寄存器高8位
ADC_RESL=0; //清零轉換結果寄存器低2位
ADC_CONTR=0x80;//開啟AD電源
delay(2);   //等待1ms,讓AD電源穩(wěn)定
}

unsigned char j = 0 ;
void InterruptTimer0()  interrupt 1                 
{
        TH0 = 0xFC;
        TL0 = 0x67;
        P0 = 0xFF;

                           if(j == 0)
                        {P2=7; j++; P0=LedBuff[0];}
                        else if(j == 1)
                        {P2=6; j++;   P0=LedBuff[1];}
                         else if(j == 2)
                        {P2=5; j++;  P0=LedBuff[2];}
                        else if(j == 3)
                        {P2=4; j++; P0=LedBuff[3];}
                                 else if(j == 4)
                        {P2=0; j=0; P0=LedBuff[4];}
}
void serial_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd; //設置9600波特率
SCON=0x50; //串口方式1,允許接收
TR1=1;
}
void InterruptUART() interrupt 4        {}



























回復

使用道具 舉報

地板
ID:69634 發(fā)表于 2015-4-5 22:42 | 只看該作者
這是90c516單片機的程序,接受上單片機STC12C5A60S2發(fā)來的數據和通道號,在1602液晶顯示,在單片機STC12C5A60S2顯示是正確的,在1602液晶顯示數據明顯離譜

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit lcden=P0^5;
sbit lcdrw=P0^6;
sbit lcdrs=P0^7;
sbit jidianqi=P0^0;
uchar a,b, tab,cnt=0 ;
uint tab1, num=0  ;
uint shuzu[]={ 0xff,0xffff,0x0fff,0x0800,0xff,0xff,0xff,0xff };

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void write_com(uchar com)
{
        lcdrs=0;
        P2=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void write_data(uchar date)
{
        lcdrs=1;
        P2=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init()
{
        lcden=0;
        write_com(0x38);
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80+0x03);
}
    /* 串口配置函數,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  //配置串口為模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1為模式2
    TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
    TL1 = TH1;     //初值等于重載值
    ET1 = 0;       //禁止T1中斷
    ES  = 1;       //使能串口中斷
    TR1 = 1;       //啟動T1
}

void UartRead(  )
{
          uchar j=0;
          if(j==0)  {   while(!RI);  tab=SBUF; RI=0; j++;}
          if(j==1)  {   while(!RI);  a=SBUF; RI=0;   j++;}
          if(j==2)  {   while(!RI);  b=SBUF;  RI=0;  j=0;}
          tab1=(b<<8)|((unsigned int)a);
          shuzu[tab]        = tab1;
}

void InterruptUART() interrupt 4 { }
void Display( )       
{       
        uchar  qian,bai,shi,ge ;        //聲明變量用來分解tab1       
    delay(20);
        write_com(0x80+0x03);
        write_data(cnt+0x30);
        delay(20);

    qian= shuzu[cnt]/1000;
    bai=  shuzu[cnt]%1000/100;
    shi=  shuzu[cnt]%100/10;        //將十位分離出來
    ge=   shuzu[cnt]%10;        //將個位分離出來
    write_com(0x80+0x41);//要寫的地方,這里是第二行
    write_data(qian+0x30);
        delay(20);
    write_data(bai+0x30);
    delay(20);
    write_data(shi+0x30);//調用1602字庫,0x30+shi表示0-9數字,寫完后地址自動加一指針。
        delay(20);
    write_data(ge+0x30);
        delay(20);
}
void InterruptTimer0()  interrupt 1                 
{
        TH0 = 0xFC;
        TL0 = 0x67;
        num++;
        if(num==1000) {num=0; Display( ); cnt++; }
        if(cnt>7)     {cnt=0;}
}
void main()
{
        TMOD = 0x01;
        TH0 = 0xFC;
        TL0 = 0x67;
        TR0 = 1;
        EA = 1;
        ET0 = 1;
        lcdrw=0;
        init();
        ConfigUART(9600);               
        while(1)
{
        UartRead( ) ;
        if(tab==1){
        if(shuzu[1]>500) {jidianqi=0;}
        else             {jidianqi=1;}       
                  }     
}               
}

回復

使用道具 舉報

5#
ID:69634 發(fā)表于 2015-4-5 22:44 | 只看該作者
各位老師能指點一二,在下感激不盡。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品久久久久久青青日本 | 一区二区三区四区在线 | 四虎永久免费黄色影片 | www.久| 男女羞羞视频在线免费观看 | 日本一区二区三区免费观看 | 特级毛片 | 国产精品黄色 | 四虎成人免费电影 | 久久久久久国产精品免费免费狐狸 | 久久99精品久久久 | 欧美在线观看一区 | 韩日一区二区三区 | 美女131mm久久爽爽免费 | 亚洲精品一二三区 | 日韩中文字幕av | 91一区二区在线观看 | 人人九九精 | 亚洲日本视频 | 99在线免费视频 | 成人免费一区二区三区视频网站 | 搞黄网站在线观看 | 亚洲精品在线视频 | 久久精品久久久久久 | 精品1区| 免费人成激情视频在线观看冫 | 亚洲一区二区中文字幕 | 亚洲成人www | 亚洲视频在线看 | 综合色播 | 免费观看a级毛片在线播放 黄网站免费入口 | 欧美一区二区三区在线视频 | 午夜大片| 精品国产不卡一区二区三区 | av在线播放免费 | 亚洲国产欧美一区 | 中文字幕在线播放不卡 | 欧美日韩精品专区 | 国产午夜精品视频 | 一级爱爱片| 91亚洲国产成人久久精品网站 |