|
| 可以增加光耦隔離 |
| 可以,但要注意串口電平是否是相同邏輯電平,如不同,要使用電平轉換芯片MAX232等。 |
| 一般是可以的 具體你可以發一下兩個的型號 |
| ok 估計是程序的問題了 我再看看 |
|
輸出是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] : 校驗位 // cal[6] : 結束位 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); /*顯示模式設置 00111000 設置16*2顯示 5*7點陣 8位數據接口*/ write_com(0x0f); /*顯示開關及光標設置 00001DCB D=1,開顯示 D=0, 關顯示 C=1,顯示光標 C=0,不顯示光標 B=1,光標閃爍 B=0,光標不閃爍*/ write_com(0x06);//地址指針自動+1且光標+1,寫字符屏幕不會移動 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; //設定串口工作方式 PCON=0x00; //波特章不倍增 TMOD=0x20; //定時器1工作于8位自動重載橫式,用于產生波特率 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; //關閉串行中斷 RI = 0; //清除串行接受標志位 buf = SBUF; //從串口緩沖區取得數據 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與校驗 相同 &&最后一位是 OxFF 結束位 { for (i=0; i <=6; i++) //此處for循環是顯示出所有數據,即cal [7]中的數據 { SBUF=cal[i]; while(!TI); TI=0; } Vo=(cal[1]*256+cal[2])/2048*5; TV=3000* Vo; } } |
|
傳感器是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] : 校驗位 // cal[6] : 結束位 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); /*顯示模式設置 00111000 設置16*2顯示 5*7點陣 8位數據接口*/ write_com(0x0f); /*顯示開關及光標設置 00001DCB D=1,開顯示 D=0, 關顯示 C=1,顯示光標 C=0,不顯示光標 B=1,光標閃爍 B=0,光標不閃爍*/ write_com(0x06);//地址指針自動+1且光標+1,寫字符屏幕不會移動 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; //設定串口工作方式 PCON=0x00; //波特章不倍增 TMOD=0x20; //定時器1工作于8位自動重載橫式,用于產生波特率 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; //關閉串行中斷 RI = 0; //清除串行接受標志位 buf = SBUF; //從串口緩沖區取得數據 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與校驗 相同 &&最后一位是 OxFF 結束位 { for (i=0; i <=6; i++) //此處for循環是顯示出所有數據,即cal [7]中的數據 { SBUF=cal[i]; while(!TI); TI=0; } Vo=(cal[1]*256+cal[2])/2048*5; TV=3000* Vo; } } |
| 如果傳感器是TTL電平的就可以 |
| 不知道你是什么傳感器,輸入輸出電平是多少? |
| 電平一樣可以呀 |