?? 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 + -