如何把接受过来的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接受/发送缓冲器
}
}
|