📄 shu_ma.c
字号:
/*******************************************************************************************************
* 标题: 基于蓝海微芯LJD-SY-XA+单片机开发系统的远程无线监控系统的DA及AD采集和数码显示的部分 *
* 文件: shu_ma.C *
* 日期: 2006-8-14(第五次修改) *
* 版本: 5.0 *
* 作者: 宇文工作室 *
* QQ: 412455719 *
* Emai: zhuyu20-16@163.com *
********************************************************************************************************/
#include <reg52.h>
#include <absacc.h>
#define CH451_DIG0 0x0800 //数码管位0显示
#define CH451_DIG1 0x0900 //数码管位1显示
#define CH451_DIG2 0x0a00 //数码管位2显示
#define CH451_DIG3 0x0b00 //数码管位3显示
#define CH451_DIG4 0x0c00 //数码管位4显示
#define CH451_DIG5 0x0d00 //数码管位5显示
#define CH451_DIG6 0x0e00 //数码管位6显示
#define CH451_DIG7 0x0f00 //数码管位7显示
#define Vrefin 2.048 //DA的参考电压
unsigned int a=1023;
void chang_data();
float CH[8]=0; //存储12位的原始数据
//存储12位的应显示的电流数据(4--20mA)
//共阴的数码管用
unsigned char Data_shi_wei[8],Data_ge_wei[8],Data_shi_fen_wei[8],Data_bai_fen_wei[8];//分别存放十位,个位,十分位,百分位数码显示的数据
sbit ch451_dclk=P1^1; //串行数据时钟上升延激活
sbit ch451_din=P1^0; // 串行数据输出,接CH451的数据输入
sbit ch451_load=P1^2; //串行命令加载,上升延激活
sbit tlc5615_sclk=P1^6 ; //时钟上升沿激活
sbit tlc5615_din=P1^5; //接tlc5615的数据输入
sbit tlc5615_cs=P1^7; //tlc5615的片选,兼有load功能
sbit xin_hao=P1^3; //一位高低电信号
//------------------------------------------------------------------------------------------------------------
//用四片451串联的级联方式控制八片四位的数码管
//输出命令子程序
//定义一无符号整型变量存储12位的命令字。
void ch451_init()
{
//P1=0x60;
ch451_din=0; //先低后高,选择4线输入
ch451_din=1;
}
void ch451_write(unsigned int command0,unsigned int command1,unsigned int command2,unsigned int command3)
{
//command0, command1, command2, command3
//分别是451芯片1,2,3,4的控制命令
//分别是451芯片1,2,3,4的控制命令
unsigned char i;
ch451_load=0; //命令开始
ch451_dclk=0;
for(i=0;i<48;i++)
{
switch(i/12)
{
case 0: ch451_din=command3&1;ch451_dclk=1;ch451_dclk=0;
command3>>=1;ch451_dclk=0; break;
case 1: ch451_din=command2&1;ch451_dclk=1;ch451_dclk=0;
command2>>=1;ch451_dclk=0; break;
case 2: ch451_din=command1&1;ch451_dclk=1;ch451_dclk=0;
command1>>=1; ch451_dclk=0;break;
case 3: ch451_din=command0&1;ch451_dclk=1;ch451_dclk=0;
command0>>=1;ch451_dclk=0; break;
default : break;
}
}
ch451_load=1;
}
//--------------------------------------------------------------------------------------------------------------
//*************************************************
//延时程序
void delay(unsigned char n){ //在12P下延时10毫秒
unsigned char i,j,k;
for(i=0;i<n;i++)
for(j=0;j<40;j++)
for(k=0;k<120;k++);
}
//************************************************
//max197:
//maxD(0---7)--AD(0---7)--B(0---7)--A(0---7)--P0(0---7)
//direct: dir=0 B-->A,dir=1 A-->B
/*D2 D1 D0
0 0 0 --ch0
0 0 1 --ch1
0 1 0 --ch2
0 1 1 --ch3
1 0 0 --ch4
1 0 1 --ch5
1 1 0 --ch6
1 1 1 --ch7
*/
void max_set_data_get()
{
unsigned char i;
unsigned char ad_command;
unsigned char p0_XL,p0_XH;
//取第i路数据
for(i=0;i<6;i++)
{
ad_command=0x40+i;
XBYTE[0x8600]=ad_command;
delay(10);
p0_XL=XBYTE[0x8600];
p0_XH=XBYTE[0x8601];
CH[i]= (p0_XH&0x0f)*256+ p0_XL;
}
}
//---------------------------------------------------------------------------------------------------------------
//关于data转换的说明
//AD端 显示的 i=(5-v)/R0=v/0.25 (mA) //v是A端的电压
//v=CH[i]
//DA端的工作原理: A端电压 V0=2*Vrefin*(十位数字量)/1024 //Vrefin=2.048V ,那个数字量<1023
////DA端 显示的 i=(2.88*V+3.6)/0.9
//DA端 显示的 i=switch():分段函数表示
void change_data()
{
// int a=1023; //任意给的值,测试DA用的
unsigned char i=0;
int x,y,z=0; char b;
for(i=0;i<8;i++)
{ if(i<=5)
{
CH[i]=CH[i]*4.096*1.2207/4096;
CH[i]=CH[i]/0.25; //显示电流数据(4--20mA)
}
else if(i==6)
{
CH[i]=2*Vrefin*a/1024;
b=(char)(CH[i]*10);
b%=100;
switch(b)
{
case 0: CH[i]=0;break; //低于4毫安,显示零
case 1: CH[i]=0 ;break; //低于4毫安,显示零
case 2: CH[i]=0 ;break; //低于4毫安,显示零
case 3: CH[i]=CH[i]*10+0.6 ;break; //通过大量实验数据统计出的公式 V:(0.3---0.4) mA:(3.9---4.5) V*10+0.6
case 4: CH[i]=CH[i]*10+0.7 ;break; //通过大量实验数据统计出的公式 V:(0.4---0.5) mA:(4.6---5.7) V*10+0.7
case 5: CH[i]=CH[i]*10+0.8 ;break; //通过大量实验数据统计出的公式 V:(0.5---0.6) mA:(5.8---6.9) V*10+0.8
case 6: CH[i]=CH[i]*10+1.3 ;break; //通过大量实验数据统计出的公式 V:(0.6---0.7) mA:(7.0---8.5) V*10+1.3
case 7: CH[i]=CH[i]*10+1.8 ;break; //通过大量实验数据统计出的公式 V:(0.7---0.8) mA:(8.6---10.3) V*10+1.8
case 8: CH[i]=CH[i]*10+3.1 ;break; //通过大量实验数据统计出的公式 V:(0.8---0.9) mA:(10.4---12.5) V*10+3.1
case 9: CH[i]=CH[i]*10+3.9 ;break; //通过大量实验数据统计出的公式 V:(0.9---1.0) mA:(12.6---14.2) V*10+3.9
case 10: CH[i]=CH[i]*10+4.5 ;break; //通过大量实验数据统计出的公式 V:(1.0---1.1) mA:(14.3---15.8) V*10+4.5
case 11: CH[i]=CH[i]*10+4.9 ;break; //通过大量实验数据统计出的公式 V:(1.1---1.2) mA:(15.9---16.9) V*10+4.9
case 12: CH[i]=CH[i]*10+5.1 ;break; //通过大量实验数据统计出的公式 V:(1.2---1.3) mA:(17.0---18.1) V*10+5.1
case 13: CH[i]=CH[i]*10+5.2 ;break; //通过大量实验数据统计出的公式 V:(1.3---1.4) mA:(18.2---19.1) V*10+5.2
case 14: CH[i]=CH[i]*10+5.3 ;break; //通过大量实验数据统计出的公式 V:(1.4---1.5) mA:(19.2---20.3) V*10+5.3
case 15: CH[i]=CH[i]*10+5.5 ;break; //通过大量实验数据统计出的公式 V:(1.5---1.6) mA:(20.4---21.5) V*10+5.5
case 16: CH[i]=CH[i]*10+5.6 ;break; //通过大量实验数据统计出的公式 V:(1.6---1.7) mA:(21.6---22.3) V*10+5.6
case 17: CH[i]=CH[i]*10+5.6 ;break; //通过大量实验数据统计出的公式 V:(1.7---1.8) mA:(22.6---23.5) V*10+5.6
case 18: CH[i]=23.5 ;break; //通过大量实验数据的结论:此时已达到最大值 V:(1.8---....) mA:23.5
default :CH[i]=23.5 ;break;
}//switch
}//else if
else
{ xin_hao=1;//
if(xin_hao==1)
CH[i]=1.0;
else
CH[i]=0.0;
}
Data_shi_wei[i]=CH[i]/10;
x=CH[i];
Data_ge_wei[i]=x%10+0x80;//各个位后带小数点
y=CH[i]*10;
Data_shi_fen_wei[i]=y%10;
z=CH[i]*100;
Data_bai_fen_wei[i]=z%10;
}//for
}//change_data()
//----------------------------------------------------------------------------------------------------------------
//tlc5615
//p1.5----din,p1.6----sclk,p1.7---cs
void tlc5615_set_data_get(unsigned int command)
{ //定义一无符号整型变量存储10位的命令字。
unsigned char i;
tlc5615_cs=0;
command<<=6;
for(i=0;i<12;i++){ //送入12位数据,高位在前,最低的两位是零
tlc5615_sclk=0;
tlc5615_din=command&0x8000;
tlc5615_sclk=1;
command<<=1;
}
tlc5615_cs=1; //load 12位数据
}
void main(void)
{
ch451_init();
ch451_write(0x401,0x401,0x401,0x401);
ch451_write(0x580,0x580,0x580,0x580); //测试送入命令
//开始显示有效数据,数码管定义为:从右往左依次为百分位,十分位,各位(要显示小数点),十位
//第一路,第二路数据显示用command0,第三路,第四路数据显示用command1
//第五路,第六路数据显示用command2,第七路,第八路数据显示用command3
//P2=0x00;
while(1)
{
max_set_data_get();//AD数据采集
// int a=1023; //预定给的值,测试DA用的
tlc5615_set_data_get(a); //DA数据采集
change_data();
ch451_write(CH451_DIG0|Data_shi_fen_wei[0],CH451_DIG0|Data_shi_fen_wei[2],
CH451_DIG0|Data_shi_fen_wei[4],CH451_DIG0|Data_shi_fen_wei[6]);
//delay(1);
ch451_write(CH451_DIG1|Data_shi_fen_wei[0],CH451_DIG1|Data_shi_fen_wei[2],
CH451_DIG1|Data_shi_fen_wei[4],CH451_DIG1|Data_bai_fen_wei[6]);
//delay(1);
ch451_write(CH451_DIG2|Data_ge_wei[0],CH451_DIG2|Data_ge_wei[2],
CH451_DIG2|Data_ge_wei[4],CH451_DIG2|Data_ge_wei[6]);
//delay(1);
ch451_write(CH451_DIG3|Data_shi_wei[0],CH451_DIG3|Data_shi_wei[2],
CH451_DIG3|Data_shi_wei[4],CH451_DIG3|Data_shi_wei[6]);
//delay(1);
//下一列
ch451_write(CH451_DIG4|Data_bai_fen_wei[1],CH451_DIG4|Data_bai_fen_wei[3],
CH451_DIG4|Data_bai_fen_wei[5],CH451_DIG4|Data_bai_fen_wei[7]);
//delay(1);
ch451_write(CH451_DIG5|Data_shi_fen_wei[1],CH451_DIG5|Data_shi_fen_wei[3],
CH451_DIG5|Data_shi_fen_wei[5],CH451_DIG5|Data_shi_fen_wei[7]);
//delay(1);
ch451_write(CH451_DIG6|Data_ge_wei[1],CH451_DIG6|Data_ge_wei[3],
CH451_DIG6|Data_ge_wei[5],CH451_DIG6|Data_ge_wei[7]);
//delay(1);
ch451_write(CH451_DIG7|Data_shi_wei[1],CH451_DIG7|Data_shi_wei[3],
CH451_DIG7|Data_shi_wei[5],CH451_DIG7|Data_shi_wei[7]);
//delay(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -