?? pc1490.c
字號:
_nop_ ();
_nop_ ();
_nop_ ();
}
void Port1A8255_write(uchar OpA1)
{
CS1_8255=0;
CS2_8255=1;
A0_8255=0; //寫1A口;
A1_8255=0;
PA8255=OpA1;
}
void Port1B8255_write(uchar OpB1)
{
CS1_8255=0;
CS2_8255=1;
A0_8255=1; //寫1B口;
A1_8255=0;
PB8255=OpB1;
}
uchar Port1C8255_read(void)
{
uchar PC1=0;
CS1_8255=0;
CS2_8255=1; //讀完1C口;
A0_8255=0;
A1_8255=1;
PC1 = 0xff&PC8255;
return PC1;
}
/*
void Port1C8255_write(uchar OpC1)
{
CS1_8255=0;
CS2_8255=1;
A0_8255=0; //寫1C口;
A1_8255=1;
PC8255=OpC1;
Timer100ms=3;
while(Timer100ms);
}
*/
void Port2A8255_write(uchar OpA2)
{
CS1_8255=1;
CS2_8255=0;
A0_8255=0; //寫2A口;
A1_8255=0;
PA8255=OpA2;
}
void Port2B8255_write(uchar OpB2)
{
CS1_8255=1;
CS2_8255=0;
A0_8255=1; //寫2B口;
A1_8255=0;
PB8255=OpB2;
}
uchar Port2C8255_read(void)
{
uchar PC2=0;
CS1_8255=1;
CS2_8255=0;
A0_8255=0; //讀完2C口。
A1_8255=1;
PC2 = 0xff&PC8255;
return PC2;
}
/*
void Port2C8255_write(uchar OpC2)
{
CS1_8255=1;
CS2_8255=0;
A0_8255=0; //寫2C口;
A1_8255=1;
PC8255=OpC2;
Timer100ms=5;
while(Timer100ms);
}
*/
/**************************************************************************/
/* */
/* TMP106read and write */
/**************************************************************************/
/***************************************************************************/
/* 函數原型: void ads_start (void) */
/* 功 能: 提供I2C總線工作時序中的起始位。 */
/***************************************************************************/
void ads_start (void) //在SCL高的情況下,SDA由高到低的變化造成START。
{
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
/**************************************************************************/
/* 函數原型: void ads_stop(void) */
/* 功 能: 提供I2C總線工作時序中的停止位。 */
/**************************************************************************/
void ads_stop(void) //在SCL高的情況下,SDA由低到高的變化造成STOP。
{
SDA=0;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
/*****************************************************************************/
/* 函數原型: uchar ack_check(void) */
/* 功 能: 提供I2C總線的時鐘信號, 并返回在時鐘電平為高期間SDA 信號線上狀*/
/* 態。本函數可用于數據發送, 也可用于數據接收。 */
/*****************************************************************************/
uchar ack_check(void) // 檢查應答信號
{
SCL=0;
SCL=1;
_nop_();
if (SDA )
{
ACK = 1;
}
else
{
ACK = 0;
}
SCL=0;
return(ACK); // 如果收到ACK應答則返回0, 否則返回1。
}
/****************************************************************************/
/* 函數原型: void ads_sendBYTE(uch data) */
/* 功 能: 向I2C總線發送8位數據。 */
/****************************************************************************/
void ads_sendBYTE(uchar snd_data) // 發送一個字節
{
uchar bitcount=8; // 發送8位數據。
do
{
if((snd_data&0x80)==0x80) // 從左到右選送D7,屏蔽D0~D6。
{
SDA=1; //寫 1
}
else
{
SDA=0; //寫 0
}
SCL=0; //在時鐘大于4u秒期間寫數據
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
snd_data=snd_data<<1; // 待送數據左移一位.
bitcount--;
}
while(bitcount);
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************************************************************************/
/* 函數原型: ads_reciveBYTE(void) */
/* 功 能: 從I2C總線上接收8位數據信號, 并將接收到8位數據作為一個字節 */
/* 返回, 不回送應答信號ACK。主函數在調用本函數之前應保證SDA信 */
/* 號線處于浮置狀態, 即使8052的Px.x腳置1。 */
/***************************************************************************/
uchar ads_reciveBYTE(void) //接受一個字節
{
uchar in_data=0;
uchar bitcount1=8;
do
{ SCL=0; //在時鐘大于4u秒期間讀數據
SCL=1;
_nop_();
_nop_();
if(SDA) //讀 1
{
in_data=in_data|0x01;
}
else //讀 0
{
in_data=in_data&0xfe;
}
SCL=0;
if(bitcount1-1)
{
in_data=in_data<<1;
}
bitcount1--;
}
while(bitcount1);
return(in_data);
}
/****************************************************************************/
/* 函數原型: void function send_Ack(void); */
/* 功 能: 向I2C總線發送一個應答信號ACK, 一般用于連續數據讀取時。 */
/****************************************************************************/
void send_ack(void) // 發送連續讀信號
{
SDA=0;
SCL=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void send_nack(void) // 發送不連續讀信號
{
SDA=1;
SCL=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
/****************************************************************************/
/* 函數原型: write_ads(uchar data) */
/* 功 能: 寫器件地址和配置字。 */
/****************************************************************************/
void write_ads(uchar snd_data) //寫器件地址和配置字
{
ads_start(); //開始寫
ads_sendBYTE(0x90); //寫器件地址(寫) 1001000x:x=0,write;x=1,read;
do
{
;
}while(ack_check()); //等待應答
ads_sendBYTE(snd_data); //寫配置字
do
{
;
}while(ack_check()); //等待應答
ads_stop(); //結束寫
}
/****************************************************************************/
/* 函數原型: read_ads(void) */
/* 功 能: 數據讀取。 */
/****************************************************************************/
void read_ads(void) //從ADS1100中讀出數據
{
// uchar adc_hi;
// uchar adc_lo;
// uchar adc_cfg;
ads_start(); //開始讀
ads_sendBYTE(0x91); //寫器件地址(讀)
do
{
;
}while(ack_check()); //等待應答
adc_hi = ads_reciveBYTE(); // 讀高8位
send_ack(); //連續讀
adc_lo = ads_reciveBYTE(); //讀低8位
send_ack(); //連續讀
adc_cfg = ads_reciveBYTE(); //讀配置字
send_nack();
ads_stop(); //結束讀
}
/*****************************************************************************/
/* SST58 CPU初始化配置 */
/*****************************************************************************/
/* 中斷配置:本系統僅使用串口中斷(高優先級),外部計數中斷T1和定時中斷0(低優先級),
/* BIT 7 6 5 4 3 2 1 0
/* IE: EA - ET2 ES ET1 EX1 ET0 EX0
/* 0 0 0 0 1 0 1 0 0x0Ah
/* BIT 7 6 5 4 3 2 1 0
/* IP: - - PT2 PS PT1 PX1 PT0 PX0
/* 0 0 0 0 1 0 0 0 0x08h
/* 設定串口模式為:8位波特率可編程單機模式,即模式1,置接收使能
/* BIT 7 6 5 4 3 2 1 0
/* SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI
/* 0 1 0 1 0 0 0 0 0x50h
/* BIT 7 6 5 4 3 2 1 0
/* TMOD: GAT C/T M1 M0 GATE C/T M1 M0
/* 0 1 0 1 0 0 0 1 0x51h
/* BIT 7 6 5 4 3 2 1 0
/* TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
/* 0 1 0 1 0 0 0 0 0x50h
/* BIT 7 6 5 4 3 2 1 0
/* T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T CP/RL2
/* 0 0 1 1 0 1 0 0 0x34h
/* BIT 7 6 5 4 3 2 1 0
/* T2MOD: - - - - - - T2OE DCEN
/* x x x x x x 0 0 0x00h
/*****************************************************************/
void Init()
{
uchar i,j;
for(i=0;i<200;i++) for(j=0;j<250;j++); //delay some time for stable
P0=0xFF; //I/O端口初始化
P1=0xFF; //
P2=0xFF; //
P3=0xFF; //
IE=0x0A; // TO 定時中斷,T1外部計數中斷,//串口中斷開。
IP=0x08; // T1 prior
// SCON=0x50; // 方式1,10bit發送,接收中斷使能。
TMOD=0x51; // T1為16位外部計數,T0為16位軟件重載定時,MODE1。
TH0=0xF7; // 2.5ms=0.0025=Tosc*12*(65536-T0)==>T0=65536-0.0025*Fosc/12=0xF700(Fosc=11.0592)
TL0=0x00; //T0用作2.5mm定時器,T0=0xF63C (Fosc=12Mhz) //10ms TH0==0xF7;TL0=0x00;
TH1=0x00; //T1用作外部計數測頻率。
TL1=0x00;
TCON=0x50;//0x50; //使能T0/T1。
PCON=0x00; //SMOD=0,波特率不加倍。
// T2CON=0x34; //波特率收發使用相同的發生率,開T2時鐘。
// T2MOD=0x00;
// RCAP2L=0xD9; //波特率9600,12M晶振,12時鐘模式。
// RCAP2H=0xFF;
// TL2=0xD9;
// TH2=0xFF; //T=Fosc/{n*[65536-(RCAP2H*RCAP2L)]},N=2 /6時鐘;N=4 //12時鐘,T2用作9600bps的波特率發生器
EA=1;
}
/*****************************************************************************/
/********************************************************************/
/* */
/* 主程序 */
/* */
/********************************************************************/
void main()
{ uchar i;
MsgOk=0x00;
w100msf=0;
w25msf=0;
Fre_val=0;
temp=0;
temp1=0;
T1flow=0;
Init();
Init1_8255(); /*8255 初始化 */
P0=LCDON; //Bklight=0; // On LCD backligh
Latch=1; //74HC373 enable
delay(255);
Latch=0; //74HC373 dis_enable
lcd_delay(10); //延時
lcd_init(); //初始化LCD
lcd_pos(0); //設置顯示位置為第一行的第1個字符
i = 0;
while(dis0[i] != '\0')
{ //顯示字符"Model:PC520-1-B"
lcd_wdat(dis0[i]);
i++;
}
lcd_pos(0x40); //設置顯示位置為第一行的第1個字符
i = 0;
while(dis1[i] != '\0')
{ //顯示字符"Start Testing..."
lcd_wdat(dis1[i]);
i++;
}
while(1)
{
if (!Start) //治具壓下
{ Timer2500us=10; //20
while(Timer2500us);
if (Start)
{ MsgOk=0x00;
w100msf=0;
Fre_val=0;
temp=0;
temp1=0;
T1flow=0;
P0=0xf6; //Power On/+12V
Latch=1; //74HC373 enable
delay(255);
Latch=0; //74HC373 dis_enable
Timer1s=2;
while(Timer1s);
/****************************************************************************/
/* */
/* 第一組:電壓測試, Voltage Test!!! */
/****************************************************************************/
Init2_8255();
Port2B8255_write(16); //T293
Init1_8255();
Port1B8255_write(0); //CD4514BC,4-16譯碼器控制CD4066第一通道ON。
Timer100ms=10; //,T8 test +11.5V
while(Timer100ms);
write_ads(0x8c);
read_ads();
temp1=adc_hi;
temp1=temp1<<8;
temp1+=adc_lo;
temp=(float)temp1/32768*2.048;
temp*=1.01; //1.9
temp*=1000;
if ((temp>=Limit[0])&&(temp<=Limit[1]))
{
lcd_pos(0x00); //設置顯示位置為第一行的第1個字符
i = 1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -