?? test.c
字號:
/*====================================================
設計項目:電動調節閥的校驗裝置的測試
單片機: AT89S52
連接方式:RS-232C
開發環境:Keil C
設 計 人:祝亮平
======================================================*/
#include <reg51.h>
#include <stdio.h>
//#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
uint Timer_Pro_Flag=0; //0為顯示處理,1為時序采集處理
sbit TEST_CAP_VOL_CRLT=P1^0;//用于控制外部繼電器
sbit PWM_Pin=P3^7; //PWM輸出
sbit IrDA_in_Pin=P1^0; //紅外脈沖輸入檢測腳
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7; // 設定I/O口各個腳位
bit PWMFlag=0;
uchar OLD_TH0,OLD_TL0;
#define MAXCMD_LENGTH 7
#define AD_VOL_PER 1.04058 //正常采集時的電壓校準值
#define AD_Loop_PickVol_PER 1.04058 //CD4051循環采集時的電壓校準值
sbit WDTRST=0xA6; //At89S5x看門狗寄存器
sbit ADCLK=P2^0;
sbit ADOUT=P2^1;
sbit ADCS=P2^2;
//--------------------------
/************CD4051---8選1模擬開關芯片*****************/
/*
|------------------------------------------------------|
| 4 2 1 |
|-----------------------------------------------|------|
|端口 | INH C B A | | |
|------ 7 6 5 4 3 2 1 0 | 正值 | 取反 |
| 通道 |--------------------------------|-------|------|
|------|...............|8 4 2 1 | | |
|------|---------------|----------------|-------|------|
| 0 |0 0 0 0 0 0 0 0 | 0x00 | 0xff |
| 1 |0 0 0 0 0 0 1 0 | 0x02 | 0xf7 |
| 2 |0 0 0 0 0 1 0 0 | 0x04 | 0xfb |
| 3 |0 0 0 0 0 1 1 0 | 0x06 | 0xf3 |
| 4 |0 0 0 0 1 0 0 0 | 0x08 | 0xfd |
| 5 |0 0 0 0 1 0 1 0 | 0x0A | 0xf8 |
| 6 |0 0 0 0 1 1 0 0 | 0x0C | 0xf9 |
| 7 |0 0 0 0 1 1 1 0 | 0x0e | 0xf1 |
|---------------------------------------|-------|------|
*/
uchar CD4051_NUM[]={0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0e}; //0~7編碼
sbit CD4051_A=P1^1;
sbit CD4051_B=P1^2;
sbit CD4051_C=P1^3;
sbit CD4051_INH=P1^4; //CD4051_INH為1時,,所有通導都不導通
bit CD4051_Vol_Conver_Flag=0; //0時為正常采集,1為CD4051循環采集
//--------------------------
//LED顯示
//--------------------------
uchar LedCount=0;
uchar LED_BIT[5]; //用于顯示的每一位數據碼的內容
uchar LED_NUM[]={0x00,0x10,0x20,0x40,0x80}; //選擇顯示位
//--------------------------------------------------------
void SendByte(unsigned char word)
{
TI=0;
SBUF=word;
while(TI==0);
TI=0;
}
uchar ComBuf[MAXCMD_LENGTH]; //用于保存串口的數據
/*---少量延時---*/
void delay(uint t)
{
uint i=0;
for(;i<=t;i++);
}
void Pluckdelay(uint t)
{
uint i=0,j;
for(;i<=t;i++)
for(j=1;j<=1000;j++);
}
/*=================================
ComBuf[5]加入CheckSUM校驗碼
算法:0x01+not(字節1+字節2+...+字節N)
=================================*/
void SetCheckSUM()
{
ComBuf[5]=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]);
}
/*=============================================================
檢測上位機發送來的ComBuf[5]checksum校驗碼和計算后的是否相等
正確則返回:1
錯誤則返回:0
==============================================================*/
bit ISCheckSUM()
{
uchar crc;
crc=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]);
if(ComBuf[5]==crc)
return 1;
else
{
ComBuf[1]=crc;//如果錯誤,則返回計算后得到的CHECKSUM校驗碼
ComBuf[2]=ComBuf[5];//返回原來上位機發送來的CHECKSUM校驗碼
return 0;
}
}
/*-----------------------------------
* *
* 等待接收上位機發來的指令 *
* *
-------------------------------------*/
void WaitComm()
{
uchar n=0;
RI=0;
while (1)
{
while(!RI);//等接收數據
//-----------------
ComBuf[n]=SBUF;
RI=0;
// SBUF=ComBuf[n];
if (ComBuf[n]==0x7e) break;//接收到結束符則退出
if (n>=MAXCMD_LENGTH)
n=0;//接收10個字節,如果還沒有接收到0x7e結束符,就重新記錄
else
n++;
}
}
/*-------------------------------
* *
* 發送combuf數據至上位機 *
* *
--------------------------------*/
void SendByteArray()
{
unsigned i;
SetCheckSUM();//加入ComBuf[5]的checkSUM校驗碼
ComBuf[4]=P0;//取讀本模塊地址
ComBuf[6]=0x7e;//結束符
for(i=0;i<=MAXCMD_LENGTH-1;i++)
{
SendByte(ComBuf[i]);
}
}
/*-------------------------------
* *
* 送端口狀態至上位機 *
* *
--------------------------------*/
void GetP0()
{
switch(ComBuf[2])
{
case 0x00: ComBuf[3]=P0_0; break;
case 0x01: ComBuf[3]=P0_1; break;
case 0x02: ComBuf[3]=P0_2; break;
case 0x03: ComBuf[3]=P0_3; break;
case 0x04: ComBuf[3]=P0_4; break;
case 0x05: ComBuf[3]=P0_5; break;
case 0x06: ComBuf[3]=P0_6; break;
case 0x07: ComBuf[3]=P0_7; break;
default:
ComBuf[3]=P0; //為8時...則以上傳整個port狀態
}
}
//--------------------
void GetP1()
{
switch(ComBuf[2])
{
case 0x00: ComBuf[3]=P1_0; break;
case 0x01: ComBuf[3]=P1_1; break;
case 0x02: ComBuf[3]=P1_2; break;
case 0x03: ComBuf[3]=P1_3; break;
case 0x04: ComBuf[3]=P1_4; break;
case 0x05: ComBuf[3]=P1_5; break;
case 0x06: ComBuf[3]=P1_6; break;
case 0x07: ComBuf[3]=P1_7; break;
default:
ComBuf[3]=P1; //為8時...則以上傳整個port狀態
}
}
//----------------------------------
void GetP2()
{
switch(ComBuf[2])
{
case 0x00: ComBuf[3]=P2_0; break;
case 0x01: ComBuf[3]=P2_1; break;
case 0x02: ComBuf[3]=P2_2; break;
case 0x03: ComBuf[3]=P2_3; break;
case 0x04: ComBuf[3]=P2_4; break;
case 0x05: ComBuf[3]=P2_5; break;
case 0x06: ComBuf[3]=P2_6; break;
case 0x07: ComBuf[3]=P2_7; break;
default:
ComBuf[3]=P2; //為8時...則以上傳整個port狀態
}
}
//---------------------------------
void GetP3()
{
switch(ComBuf[2])
{
case 0x00: ComBuf[3]=P3_0; break;
case 0x01: ComBuf[3]=P3_1; break;
case 0x02: ComBuf[3]=P3_2; break;
case 0x03: ComBuf[3]=P3_3; break;
case 0x04: ComBuf[3]=P3_4; break;
case 0x05: ComBuf[3]=P3_5; break;
case 0x06: ComBuf[3]=P3_6; break;
case 0x07: ComBuf[3]=P3_7; break;
default:
ComBuf[3]=P3; //為8時...則以上傳整個port狀態
}
}
//-------發送AT89S5x的指定端口狀態到上位機--------
void SendPortData()
{
switch (ComBuf[1]) /*Port號*/
{
case 0x00: GetP0(); break;
case 0x01: GetP1(); break;
case 0x02: GetP2(); break;
case 0x03: GetP3(); break;
}
/*--------------------*/
SendByteArray();//發送數據
}
/*-------------------------------
* *
* 各個端口的狀態設定 *
* *
--------------------------------*/
void SetP0()
{
switch(ComBuf[2])
{
case 0x00: P0_0=ComBuf[3]; break;
case 0x01: P0_1=ComBuf[3]; break;
case 0x02: P0_2=ComBuf[3]; break;
case 0x03: P0_3=ComBuf[3]; break;
case 0x04: P0_4=ComBuf[3]; break;
case 0x05: P0_5=ComBuf[3]; break;
case 0x06: P0_6=ComBuf[3]; break;
case 0x07: P0_7=ComBuf[3]; break;
default:
P0=ComBuf[3];//為8時...則設置整個port狀態
}
}
//=================================
void SetP1()
{
switch(ComBuf[2])
{
case 0x00: P1_0=ComBuf[3]; break;
case 0x01: P1_1=ComBuf[3]; break;
case 0x02: P1_2=ComBuf[3]; break;
case 0x03: P1_3=ComBuf[3]; break;
case 0x04: P1_4=ComBuf[3]; break;
case 0x05: P1_5=ComBuf[3]; break;
case 0x06: P1_6=ComBuf[3]; break;
case 0x07: P1_7=ComBuf[3]; break;
default:
P1=ComBuf[3];//為8時...則設置整個port狀態
}
}
//=================================
void SetP2()
{
switch(ComBuf[2])
{
case 0x00: P2_0=ComBuf[3]; break;
case 0x01: P2_1=ComBuf[3]; break;
case 0x02: P2_2=ComBuf[3]; break;
case 0x03: P2_3=ComBuf[3]; break;
case 0x04: P2_4=ComBuf[3]; break;
case 0x05: P2_5=ComBuf[3]; break;
case 0x06: P2_6=ComBuf[3]; break;
case 0x07: P2_7=ComBuf[3]; break;
default:
P2=ComBuf[3];//為8時...則設置整個port狀態
}
}
//=================================
void SetP3()
{
switch(ComBuf[2])
{
case 0x00: P3_0=ComBuf[3]; break;
case 0x01: P3_1=ComBuf[3]; break;
case 0x02: P3_2=ComBuf[3]; break;
case 0x03: P3_3=ComBuf[3]; break;
case 0x04: P3_4=ComBuf[3]; break;
case 0x05: P3_5=ComBuf[3]; break;
case 0x06: P3_6=ComBuf[3]; break;
case 0x07: P3_7=ComBuf[3]; break;
default:
P3=ComBuf[3]; //為8時...則設置整個port狀態
}
}
/*=================================
WritePortData()
按上位機傳來的格式進行端口的設置
=================================*/
void WritePortData()
{
switch (ComBuf[1])/*Port號*/
{
case 0x00: SetP0(); break;
case 0x01: SetP1(); break;
case 0x02: SetP2(); break;
case 0x03: SetP3(); break;
}
}
/*----------------------------------
* SetEA() *
* *
* 中斷允許設定,(EA寄存器) *
* ComBuf[1]==>0x00為EA設定 *
* 0x01為讀取EA值 *
------------------------------------*/
void SetEA()
{
if (ComBuf[1]==0x00)
EA=ComBuf[3];
else
{
ComBuf[3]=EA;
SendByteArray();//發送數據
}
}
/*---------------------------------------------------------------
* *
* float型轉為2位char型,并發送至串行 *
* void Convert_AD_VOL_ValueToChar() *
* *
---------------------------------------------------------------*/
void Convert_AD_VOL_ValueToChar(uint vol)
{
float temp_float_vol;
unsigned int temp;
uchar AD_Hight,AD_Low;
temp_float_vol=vol*0.0048*AD_VOL_PER;
temp=temp_float_vol*100;
AD_Hight=temp /100; //取個位數
AD_Low=temp-AD_Hight*100; //取2位小數
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -