如何把接受過來的AD值在從機lcd顯示呢??求指點!!!!!!
主機單片機程序:
#include<reg52.h>
#include<intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
void delay4us()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
sbit RS485E=P3^7; //定義485的使能腳
sbit CLK = P3^6; //時鐘
sbit CS = P3^5; //片選
sbit DIN = P3^4; //輸入
sbit DOUT = P3^3; //輸出
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
uchar disp[]="0.00V";
uchar code line1[]="NOW VOL:";
void delayms(uint ms){
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
bit LCD_BUSY_CHECK(){
bit result;
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_E=1;
delay4us();
result=(bit)(P0&0x80);
LCD1602_E=0;
return result;
}
void lcdwrc(uchar cmd)
{
while(LCD_BUSY_CHECK());
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_E=0;
_nop_();_nop_();
P0=cmd;
delay4us();
LCD1602_E=1;
delay4us();
LCD1602_E=0;
}
void set_disp_pos(uchar pos)
{
lcdwrc(pos|0x80);
}
void lcdwrd(uchar dat)
{
while(LCD_BUSY_CHECK());
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_E=0;
P0=dat;
delay4us();
LCD1602_E=1;
delay4us();
LCD1602_E=0;
}
void LCD_init()
{
lcdwrc(0x38);
delayms(1);
lcdwrc(0x0c);
delayms(1);
lcdwrc(0x06);
delayms(1);
lcdwrc(0x01);
delayms(1);
}
void SPI_Write(uchar moshi)
{ //寫模式函數
uint i;
CS = 0;
for(i = 0; i < 8; i++){
CLK = 0;
DIN = moshi>>7;
CLK = 1;
moshi <<= 1;
}
CLK = 0;
}
uint GetValue()
{ //讀取DOUT管腳,得到最終數字量函數
uint i, ans = 0;
for(i = 0; i < 12; i++){
CLK = 0;
ans <<= 1;
ans |= DOUT;
CLK = 1;
}
CLK = 0;
return ans;
}
uint Read_AD_Data(uchar moshi)
{ //讀取最終的數字量函數
uint i, ans;
SPI_Write(moshi);
for(i = 0; i < 5; i++);
CLK = 1;
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
ans = GetValue();
CS = 1;
return ans;
}
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main()
{
uchar i;
uint j;
uint d,temp,count=50;
LCD_init();
delayms(10);
SCON = 0x50; //REN=1允許串行接受狀態,串口工作模式1
TMOD|= 0x20; //定時器工作方式2
PCON|= 0x80;
TH1 = 0xFD; //baud*2 /* reload value 19200、數據位8、停止位1。效驗位無
TR1 = 1;
ES = 1; //開串口中斷
EA = 1; // 開總中斷
while(1){
if(count == 50)
{ //每50下讀取轉換值,避免數字跳動太快
temp = Read_AD_Data(0xE4);
count = 0;
}
count++;
RS485E=1; //RS5485E=0為接收狀態 RS5485E=1為發送狀態 // max485(半雙工通信) RE/DE定義 RE=0為接受狀態 DE=1為發送狀態(參考MAX485芯片管腳)
for(j=0;j<5;j++){
SBUF=disp[j];
} //發送數據
delay(40);
d=(double)temp*0.122;
disp[0]=d/100+'0';
disp[1]='.';
disp[2]=d%100/10+'0';
disp[3]=d%100%10+'0';
set_disp_pos(0x01);
i=0;
while(line1[i]!='\0')
lcdwrd(line1[i++]);
set_disp_pos(0x46);
i=0;
while(disp[i]!='\0')
lcdwrd(disp[i++]);
}
}
從機程序:
#include<reg51.h>
#include <stdio.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//--定義全局變量--//
unsigned int ReData;
sbit RS485E=P3^7; //定義485的使能腳
unsigned int ReData;
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
uchar disp[]="0.00V";
uchar code line1[]="NOW VOL:";
void delay4us()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delayms(uint ms){
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
bit LCD_BUSY_CHECK(){
bit result;
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_E=1;
delay4us();
result=(bit)(P0&0x80);
LCD1602_E=0;
return result;
}
void lcdwrc(uchar cmd)
{
while(LCD_BUSY_CHECK());
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_E=0;
_nop_();_nop_();
P0=cmd;
delay4us();
LCD1602_E=1;
delay4us();
LCD1602_E=0;
}
void set_disp_pos(uchar pos)
{
lcdwrc(pos|0x80);
}
void lcdwrd(uchar dat)
{
while(LCD_BUSY_CHECK());
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_E=0;
P0=dat;
delay4us();
LCD1602_E=1;
delay4us();
LCD1602_E=0;
}
void LCD_init()
{
lcdwrc(0x38);
delayms(1);
lcdwrc(0x0c);
delayms(1);
lcdwrc(0x06);
delayms(1);
lcdwrc(0x01);
delayms(1);
}
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main(void)
{
uchar i;
SCON = 0x50; //REN=1允許串行接受狀態,串口工作模式1
TMOD|= 0x20; //定時器工作方式2
PCON|= 0x80;
TH1 = 0xFD; //baud*2 /* reload value 19200、數據位8、停止位1。效驗位無
TR1 = 1;
ES = 1; //開串口中斷
EA = 1; // 開總中斷
LCD_init();
delayms(10);
while(1)
{
set_disp_pos(0x01);
i=0;
while(line1[i]!='\0')
lcdwrd(line1[i++]);
set_disp_pos(0x46);
i=0;
while(disp[i]!='\0')
lcdwrd(ReData);
RS485E=0; // RS5485E=0為接收狀態 RS5485E=1為發送狀態
delay(20);
}
}
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中斷標志
{
RI = 0; //清除RI接受中斷標志
ReData = SBUF; //SUBF接受/發送緩沖器
}
}
|