久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
兩個單片機之間的通訊和控制的問題
[打印本頁]
作者:
888zhjzhj
時間:
2015-3-28 22:22
標(biāo)題:
兩個單片機之間的通訊和控制的問題
這是STC12C5A60S2單片機連續(xù)測得8路模擬量,在本單片機中顯示通道號和數(shù)值(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轉(zhuǎn)換初始化
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的轉(zhuǎn)換數(shù)值
{ 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轉(zhuǎn)換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要經(jīng)過4個CPU時鐘的延時,其值才能夠保證被設(shè)置進ADC_CONTR 寄存器
while(!(ADC_CONTR&0x10)); //等待轉(zhuǎn)換完成
ADC_CONTR&=0xe7; //關(guān)閉AD轉(zhuǎn)換,ADC_FLAG位由軟件清0
return(ADC_RES*4+ADC_RESL); //返回AD轉(zhuǎn)換完成的10位數(shù)據(jù)(16進制)
}
//------------------------------------------------------------------------------
float AD_work(unsigned char channel)
{
float AD_val; //定義處理后的數(shù)值A(chǔ)D_val為浮點數(shù)
unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(channel); //轉(zhuǎn)換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; //清零轉(zhuǎn)換結(jié)果寄存器高8位
ADC_RESL=0; //清零轉(zhuǎn)換結(jié)果寄存器低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];} //數(shù)碼港顯示
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; //設(shè)置9600波特率
SCON=0x50; //串口方式1,允許接收
TR1=1;
}
void InterruptUART() interrupt 4
{ }
下面是90c516單片機,接受上單片機發(fā)來的數(shù)據(jù)和通道號,在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);
}
/* 串口配置函數(shù),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; //清零接收中斷標(biāo)志位
}
if (TI) //字節(jié)發(fā)送完畢
{
TI = 0; //清零發(fā)送中斷標(biāo)志位
}
}
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);//調(diào)用1602字庫,0x30+shi表示0-9數(shù)字,寫完后地址自動加一指針。
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數(shù)值(比仿50度溫度),立刻繼電器動作,通道號和數(shù)值循環(huán)不變,請問各位老師該如何做?
作者:
888zhjzhj
時間:
2015-4-1 19:10
為什么沒有人回答,這道題怎么難嗎?
作者:
888zhjzhj
時間:
2015-4-5 22:37
沒有人回答,我自己改進了一下,效果不很理想。有時1602液晶顯示跑掉,通道號不變,繼電器反應(yīng)快了
這是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轉(zhuǎn)換初始化
serial_init(); //串口初始化
while(1)
{
for(d =0;d <8;d++) //循環(huán)發(fā)送P1.0-P1.7的轉(zhuǎn)換數(shù)值
{ 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轉(zhuǎn)換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要經(jīng)過4個CPU時鐘的延時,其值才能夠保證被設(shè)置進ADC_CONTR 寄存器
while(!(ADC_CONTR&0x10)); //等待轉(zhuǎn)換完成
ADC_CONTR&=0xe7; //關(guān)閉AD轉(zhuǎn)換,ADC_FLAG位由軟件清0
return(ADC_RES*4+ADC_RESL); //返回AD轉(zhuǎn)換完成的10位數(shù)據(jù)(16進制)
}
//------------------------------------------------------------------------------
float AD_work(unsigned char channel)
{
float AD_val; //定義處理后的數(shù)值A(chǔ)D_val為浮點數(shù)
unsigned char i;
for(i=0;i<50;i++)
AD_val+=AD_get(channel); //轉(zhuǎn)換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; //清零轉(zhuǎn)換結(jié)果寄存器高8位
ADC_RESL=0; //清零轉(zhuǎn)換結(jié)果寄存器低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; //設(shè)置9600波特率
SCON=0x50; //串口方式1,允許接收
TR1=1;
}
void InterruptUART() interrupt 4 {}
作者:
888zhjzhj
時間:
2015-4-5 22:42
這是90c516單片機的程序,接受上單片機STC12C5A60S2發(fā)來的數(shù)據(jù)和通道號,在1602液晶顯示,在單片機STC12C5A60S2顯示是正確的,在1602液晶顯示數(shù)據(jù)明顯離譜
#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);
}
/* 串口配置函數(shù),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);//調(diào)用1602字庫,0x30+shi表示0-9數(shù)字,寫完后地址自動加一指針。
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;}
}
}
}
作者:
888zhjzhj
時間:
2015-4-5 22:44
各位老師能指點一二,在下感激不盡。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
99视频入口
|
成人国产精品久久久
|
久久久99国产精品免费
|
亚洲三区在线播放
|
久久精品a
|
国产一区不卡
|
国产成人精品一区二区三区视频
|
国产一区二区欧美
|
精彩视频一区二区三区
|
欧美在线视频网
|
日韩在线免费
|
国产精品亚洲片在线播放
|
欧美一级黄色免费
|
精品少妇一区二区三区日产乱码
|
国产精品欧美一区二区三区不卡
|
高清久久
|
亚洲欧美在线观看
|
av在线免费观看网址
|
欧美三级电影在线播放
|
毛片在线看片
|
久久久久久久久久久福利观看
|
zzzwww在线看片免费
|
国内精品视频在线
|
亚洲福利
|
久久精彩视频
|
久久在线
|
中文精品视频
|
午夜久久久久久久久久一区二区
|
丝袜 亚洲 另类 欧美 综合
|
久久伊人免费视频
|
日韩视频精品
|
九九综合
|
草久久免费视频
|
91福利在线导航
|
久久精品一区二区三区四区
|
97久久精品午夜一区二区
|
自拍偷拍精品
|
日韩一区二区在线观看视频
|
精品视频一区在线
|
欧美一级在线观看
|
久久伊人精品
|