熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
可以增加光耦隔離 |
可以,但要注意串口電平是否是相同邏輯電平,如不同,要使用電平轉(zhuǎn)換芯片MAX232等。 |
一般是可以的 具體你可以發(fā)一下兩個(gè)的型號(hào) |
ok 估計(jì)是程序的問題了 我再看看 |
輸出是TTL的電平,那同志們能看看我這程序是不是有什么問題? #include<reg52.h> #define uchar unsigned char #define uint unsigned int void senddata(uchar dat); uchar cal [7]= {0};// cal[0]:起始位 0xAA // cal[1] : Vout(H) // cal[2] : Vout(L) // cal[3] : Vref(H) // cal[4] : Vref(L) // cal[5] : 校驗(yàn)位 // cal[6] : 結(jié)束位 OxFF float Vo; int i=0; sbit rs=P1^0; sbit lcden=P2^5; sbit rw=P1^1; sbit voice=P2^3; sbit light=P2^2; uchar buf,sum,count; uchar num,TV,a,b,c; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { rs=0; rw=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) { rs=1; rw=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void init() { lcden=0; //使能端為低電平 write_com(0x38); /*顯示模式設(shè)置 00111000 設(shè)置16*2顯示 5*7點(diǎn)陣 8位數(shù)據(jù)接口*/ write_com(0x0f); /*顯示開關(guān)及光標(biāo)設(shè)置 00001DCB D=1,開顯示 D=0, 關(guān)顯示 C=1,顯示光標(biāo) C=0,不顯示光標(biāo) B=1,光標(biāo)閃爍 B=0,光標(biāo)不閃爍*/ write_com(0x06);//地址指針自動(dòng)+1且光標(biāo)+1,寫字符屏幕不會(huì)移動(dòng) write_com(0x01); write_com(0x80); write_data ('P'); write_com (0x81); write_data ('M'); write_com (0x82); write_data ('2'); write_com (0x83); write_data ('.'); write_com (0x84); write_data ('5'); write_com (0x85); write_data (':'); write_com (0xcb); write_data ('m'); write_com (0xcc); write_data ('g'); write_com (0xcd); write_data ('/'); write_com (0xce); write_data ('m'); write_com (0xcf); write_data ('3'); } void warn() { if (num>=200) { voice=0; light=0; } } void main() { init(); SCON=0x50; //設(shè)定串口工作方式 PCON=0x00; //波特章不倍增 TMOD=0x20; //定時(shí)器1工作于8位自動(dòng)重載橫式,用于產(chǎn)生波特率 EA=1; ES = 1; //允許串口中斷 TL0=0x80; TH0=0xFB; TR0=1; num=TV; a= TV /100+0x30; TV %=100; b= TV /10+0x30; TV %=10; c= TV +0x30; write_com (0x88); write_data (a); write_com (0x89); write_data (b); write_com (0x8a); write_data (c); //warn(); while(1); } void serial() interrupt 4 { ES = 0; //關(guān)閉串行中斷 RI = 0; //清除串行接受標(biāo)志位 buf = SBUF; //從串口緩沖區(qū)取得數(shù)據(jù) senddata(buf); ES = 1; //允許串口中斷 } void senddata(uchar dat) {if(dat==170) //判斷起始位 OxAA, (0xAA==l70〉 { i=0; cal[i]=dat; } else { i=i+1; cal[i]=dat; } if(i==6) { sum= cal[1]+cal[2]+cal[3]+cal[4];//sum=Vout(M)+Vout(L)+Vref(M)+Vref(L) } if (sum == cal [5] && cal[6]==255) //sum與校驗(yàn) 相同 &&最后一位是 OxFF 結(jié)束位 { for (i=0; i <=6; i++) //此處for循環(huán)是顯示出所有數(shù)據(jù),即cal [7]中的數(shù)據(jù) { SBUF=cal[i]; while(!TI); TI=0; } Vo=(cal[1]*256+cal[2])/2048*5; TV=3000* Vo; } } |
傳感器是TTL的電平嗯,那難道是我這程序有錯(cuò)誤?大家?guī)兔纯垂?br />
#include<reg52.h> #define uchar unsigned char #define uint unsigned int void senddata(uchar dat); uchar cal [7]= {0};// cal[0]:起始位 0xAA // cal[1] : Vout(H) // cal[2] : Vout(L) // cal[3] : Vref(H) // cal[4] : Vref(L) // cal[5] : 校驗(yàn)位 // cal[6] : 結(jié)束位 OxFF float Vo; int i=0; sbit rs=P1^0; sbit lcden=P2^5; sbit rw=P1^1; sbit voice=P2^3; sbit light=P2^2; uchar buf,sum,count; uchar num,TV,a,b,c; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { rs=0; rw=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) { rs=1; rw=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void init() { lcden=0; //使能端為低電平 write_com(0x38); /*顯示模式設(shè)置 00111000 設(shè)置16*2顯示 5*7點(diǎn)陣 8位數(shù)據(jù)接口*/ write_com(0x0f); /*顯示開關(guān)及光標(biāo)設(shè)置 00001DCB D=1,開顯示 D=0, 關(guān)顯示 C=1,顯示光標(biāo) C=0,不顯示光標(biāo) B=1,光標(biāo)閃爍 B=0,光標(biāo)不閃爍*/ write_com(0x06);//地址指針自動(dòng)+1且光標(biāo)+1,寫字符屏幕不會(huì)移動(dòng) write_com(0x01); write_com(0x80); write_data ('P'); write_com (0x81); write_data ('M'); write_com (0x82); write_data ('2'); write_com (0x83); write_data ('.'); write_com (0x84); write_data ('5'); write_com (0x85); write_data (':'); write_com (0xcb); write_data ('m'); write_com (0xcc); write_data ('g'); write_com (0xcd); write_data ('/'); write_com (0xce); write_data ('m'); write_com (0xcf); write_data ('3'); } void warn() { if (num>=200) { voice=0; light=0; } } void main() { init(); SCON=0x50; //設(shè)定串口工作方式 PCON=0x00; //波特章不倍增 TMOD=0x20; //定時(shí)器1工作于8位自動(dòng)重載橫式,用于產(chǎn)生波特率 EA=1; ES = 1; //允許串口中斷 TL0=0x80; TH0=0xFB; TR0=1; num=TV; a= TV /100+0x30; TV %=100; b= TV /10+0x30; TV %=10; c= TV +0x30; write_com (0x88); write_data (a); write_com (0x89); write_data (b); write_com (0x8a); write_data (c); //warn(); while(1); } void serial() interrupt 4 { ES = 0; //關(guān)閉串行中斷 RI = 0; //清除串行接受標(biāo)志位 buf = SBUF; //從串口緩沖區(qū)取得數(shù)據(jù) senddata(buf); ES = 1; //允許串口中斷 } void senddata(uchar dat) {if(dat==170) //判斷起始位 OxAA, (0xAA==l70〉 { i=0; cal[i]=dat; } else { i=i+1; cal[i]=dat; } if(i==6) { sum= cal[1]+cal[2]+cal[3]+cal[4];//sum=Vout(M)+Vout(L)+Vref(M)+Vref(L) } if (sum == cal [5] && cal[6]==255) //sum與校驗(yàn) 相同 &&最后一位是 OxFF 結(jié)束位 { for (i=0; i <=6; i++) //此處for循環(huán)是顯示出所有數(shù)據(jù),即cal [7]中的數(shù)據(jù) { SBUF=cal[i]; while(!TI); TI=0; } Vo=(cal[1]*256+cal[2])/2048*5; TV=3000* Vo; } } |
如果傳感器是TTL電平的就可以 |
不知道你是什么傳感器,輸入輸出電平是多少? |
電平一樣可以呀 |
Powered by 單片機(jī)教程網(wǎng)