小弟初学者,改了一下别人的程序。就是加了一个自动转
换量程的程序,没有语法错误,但是就是仿真不出结果,求指教!程序如下:
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define TRUE 1
#define FALSE 0
#define disp_dot 0x2e
#define disp_V 0x56
#define disp_W 0x57
#define data1602 P0 //定义LCD1602数据接口
uchar code disp_code[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
ulong voltage_data;
ulong ad;
void disp_data(void);
sbit rs1602 = P2^0;
sbit rw1602 = P2^1;
sbit e1602 = P2^2;
sbit SDI = P2^0;
sbit CONV = P2^5;
sbit SCK = P2^4;
sbit SDO = P2^3;
sbit RS_SWH_1=P3^7;
sbit RS_SWH_2=P3^6;
sbit LED=P3^5; //超量程标示
/*******************************************************************************
函数名称:delay(uchar n)
功能描述:延时
调用函数:
写入值 :n
返回值 :
*******************************************************************************/
void delay(uchar n)
{
uchar i,j;
for(i=n;i>0;i--)
for(j=250;j>0;j--);
}
/******************************************************************************
函数名称: write_1602(uchar wdata)
功能描述: LCD1602写入数据
调用函数: delay()
写入值 : wdata
返回值 :
******************************************************************************/
void write_1602(uchar wdata)
{
data1602 = wdata;
rs1602 = 1;
rw1602 = 0;
e1602 = 1;
delay(4);
e1602 = 0;
}
/******************************************************************************
函数名称: write_order(uchar odata)
功能描述: LCD1602写命令
调用函数: delay()
写入值 : odata
返回值 :
******************************************************************************/
void write_order(uchar odata)
{
data1602 = odata;
rs1602 = 0;
rw1602 = 0;
e1602 = 1;
delay(4);
e1602 = 0;
}
/******************************************************************************
函数名称: init_1602()
功能描述: LCD1602初始化
调用函数: write_order(uchar odata)
写入值 :
返回值 :
******************************************************************************/
void init_1602(void)
{
write_order(0x01); // 清屏幕
write_order(0x38); // 数据长度为8位,双行显示,5*7字符
write_order(0x0c); // 打开显示开关,光标不闪烁
write_order(0x06); // 地址计数递增,显示屏不移动
}
******************************************************************************
函数名称: position(uchar row,uchar colum)
功能描述: LCD1602写位置
调用函数: write_order()
写入值 : row,colum
返回值 :
******************************************************************************/
position(uchar row,uchar colum)
{
uchar pos;
if(row==1)
{
pos=0x80+colum;
}
else
{
pos=0xC0+colum;
}
write_order(pos);
}
/******************************************************************************
函数名称: write_byte(uchar *s)
功能描述: LCD1602字符串
调用函数: write_1602()
写入值 : *s
返回值 :
******************************************************************************/
write_byte(uchar *s)
{
for(;*s!='\0';s++)
{
write_1602(*s);
}
}
/******************************************************************************
函数名称: read_adc_ch0()
功能描述: 读LTC1865通道0的AD值
调用函数:
写入值 :
返回值 :
******************************************************************************/
void read_adc_ch0(void)
{
uchar j;
SDO = 1;
CONV = 1; // 开启AD转换
SCK = 1;
CONV = 0;
SCK = 0;
for(j=15;j>0;j--)
{
SCK = 0;
if(j == 15)
{
SDI = 1;
}
if(j == 14)
{
SDI = 0;
}
if(SDO==1)
{
voltage_data = voltage_data + 1;
}
voltage_data <<= 1;
SCK = 1;
}
CONV = 1;
SCK = 1;
}
/******************************************************************************
函数名称: disp_voltage()
功能描述: 显示电压
调用函数: read_adc_ch0(),write_1602(),write_order()
写入值 :
返回值 :
******************************************************************************/
void disp_voltage(void)
{
ad = 0;
ad=voltage_data;
if(ad>4)
{
if(RS_SWH_1==0&&RS_SWH_2==0)
{
LED=1;
}
else
{ RS_SWH_1=0;
RS_SWH_2=0;
}
}
else
{
if(ad>0.04)
{
if(ad>0.4)
{
disp_data();
}
else
{
RS_SWH_1=0;
RS_SWH_2=1;
}
}
else
{
if(ad>0.004)
{
RS_SWH_1=1;
RS_SWH_2=0;
}
else
{
RS_SWH_1=1;
RS_SWH_2=1;
}
}
}
read_adc_ch0();
voltage_data = (voltage_data*5000)/65535; // AD?????
if(RS_SWH_1==1)
{
if(RS_SWH_2==1)
{
voltage_data=voltage_data/10;
}
else
{
;
}
}
else
{
if(RS_SWH_2==1)
{
voltage_data=voltage_data*100;
}
else
{
voltage_data=voltage_data*10;
}
}
write_order(0x89);
write_1602(disp_code[voltage_data/1000]);
write_order(0x8b);
write_1602(disp_code[voltage_data%1000/100]);
write_order(0x8c);
write_1602(disp_code[voltage_data%1000%100/10]);
write_order(0x8d);
write_1602(disp_code[voltage_data%1000%100%10]);
}
/******************************************************************************
函数名称: disp_data()
功能描述: 显示电压电流
调用函数: write_1602(),position(),disp_voltage(),disp_current()
写入值 :
返回值 :
******************************************************************************/
void disp_data(void)
{
position(1,10);
write_1602(disp_dot);
position(1,15);
write_1602(disp_V);
disp_voltage();
}
/******************************************************************************
函数名称: main()
功能描述: 主函数
调用函数:
写入值 :
返回值 :
******************************************************************************/
void main(void)
{
RS_SWH_1=0;
RS_SWH_2=0;
LED=0;
init_1602();
position(1,0);
write_byte("VOLTAGE=");
while(1)
{
disp_data();
}
}
|