⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 caiji.c

📁 荣栅式数字千分表转换接口。数字千分表使用的是桂林广陆的表。配有实物图片说明
💻 C
字号:
/*往上位机中传输数据时,只传原始数据。
  采集上来的原始数据存放在0XF0~0XF2中,
  0XF0为高位,0XF1为低位,0XF2为符号位。

  处理后的数据存放在0XE0~0XE9 10个单元中,为原码的BCD码,符号位在0XEA中。 */

#include <AT89X52.H>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define PA_8255 XBYTE[0x00FF]     //8255_PA
#define PB_8255 XBYTE[0x80ff]     //8255_PB
#define PC_8255 XBYTE[0x40ff]     //8255_PC
#define CON_8255 XBYTE[0xDFFF]    //8255_CON
#define CON4052 P3_2              //4052使能端
#define key_cy P2_5               //采样开关
/************全局变量定义**************/
uchar int_flag;                     //中断标志
uchar ExpectData[10];             //计算结果存储区
uint XmtDat[5];                   //显示缓存

/*************函数说明********************/
void Send_Byte(uchar byte);
void Send_Data(void);
void Clear_Lcd(void);             //清空LCD
void Init_Lcd(void);              //LCD初始化
void Init(void);                  //系统初始化
void Init_232(void);              //232初始化
void delay(uint i);               //延时
void delay10ms(void);             //延时程序10ms
void delay10us(void);             //延时10us
uchar shift(uchar);               //移位程序
void Hex_Bcd(ulong Hex,uchar *);  //hex 2 bcd
key_press(void);                  //检测键盘子程序
void Caculate(void);              //计算
void PC_232(void);                //232传输程序
void display(void);               //显示


/************************************************/
/***********LCD显示子程序***************/
//#define DIPIN   0x01  //P1.0-->DI
//#define CLKPIN  0x02  //P1.1-->CLK
//各段
#define  a    0x04
#define  b    0x08
#define  c    0x40
#define  d    0x20
#define  e    0x10
#define  f    0x02
#define  g    0x01
#define  h    0x80
void Clear_Lcd(void);
uchar	Digit[10]={	a+b+c+d+e+f,	//0
			b+c,	//1
			a+b+d+e+g,	//2
			a+b+c+d+g,	//3
		        b+c+f+g,	//4
			a+c+d+f+g,	//5
			a+c+d+e+f+g,	//6
		        a+b+c,	        //7
			a+b+c+d+e+f+g,	//8
		        a+b+c+d+f+g	//9
		   };
uchar Hello[5]={                      //显示'Hello'
               b+c+e+f+g,
               a+d+e+f+g,
               d+e+f,
               d+e+f,
               a+b+c+d+e+f};
uchar zero[5]={
               a+b+c+d+e+f,
               a+b+c+d+e+f,
               a+b+c+d+e+f,
               a+b+c+d+e+f,
               a+b+c+d+e+f,
               };

uchar Over[5]={                  //显示'-OVER'
                g,
                a+b+c+d+e+f,
                b+c+d+e+f,
                a+d+e+f+g,
                a+b+c+f+e+g
                };

//-----------------------------------
//清空LCD显示
//----------------------------------
void Clear_Lcd(void)
{
   uchar i;
   for(i=0;i<5;i++)
   {
     Send_Byte(0xff);
   }
   delay10us();
   //return (0);
}
void Init_Lcd(void)
{
   P1_0|=1;                    //P1.0 out
   P1_1|=1;                    //P1.1 out
   Clear_Lcd();
}
void delay(uint i)   //延时
{
  uint j,k;
  for(j=0;j<i;j++)
    for(k=0;k<150;k++);
}

void delay10us(void)        //延时10us
{
  uchar k;
  for(k=0;k<3;k++){};
  return;
}

//--------------------------------------------------
//发送一字节数据
//--------------------------------------------------
void Send_Byte(uchar byte)
{
   uchar i;
   for(i=0;i<8;i++)
   {
     if((byte&0x01)==0x01)
        P1_0=1;                      //假如此位是1,P1.0 set 1
     else
        P1_0=0;                      //假如 0,P1.0 reset 0
     P1_1=1;                         //P1.1 SET 1
     _nop_;
     P1_1=0;                         //P1.1 RESET 0
     _nop_();
     P1_1=1;
     _nop_();
     byte=byte>>1;                         //SHIFT
   }

}
//----------------------------------
//发送一批数据
//----------------------------------
void Send_Data(void)
{
   uchar i;
   Clear_Lcd();
   for(i=0;i<5;i++)
   {
     Send_Byte(XmtDat[i]);
   }
   delay10us();
}
//----------------------------------
void display(void)                            //显示
{
 uchar i;
 uchar temp;
 //uint pp;			     //需要显示的第一位地址为0xe3
 _nop_();
 //pp=0xE3;
 if(DBYTE[0xE2]==0x00&&DBYTE[0xE1]==0x00&&DBYTE[0xE0]==0x00){
        //for(i=1;i<5;i++){
             XmtDat[1]=~(Digit[DBYTE[0XE3]]&0xff);
             XmtDat[2]=~(Digit[DBYTE[0XE4]]&0xff);
             XmtDat[3]=~(Digit[DBYTE[0XE5]]&0xff);
             XmtDat[4]=~(Digit[DBYTE[0XE6]]&0xff);

             //pp++;
             //}
        if(DBYTE[0xEA]==0x00)XmtDat[0]=0xff;
        else XmtDat[0]=~(Over[0]&0xff);
        Send_Data();
        delay(20);

 	}
 else{

        for(i=0;i<5;i++)
     	XmtDat[i]=~(Over[i]&0xff);          //Display "-over"
 	Send_Data();
 	delay(20);
 	return;
        }				     //是否显示溢出?
}
//-----------------------------------------
/*****************************************/


uchar shift(uchar dat)
{
dat=(dat>>4)|(dat<<4);
dat=((dat&0xcc)>>2)|((dat&0x33)<<2);
dat=((dat&0xaa)>>1)|((dat&0x55)<<1);
return dat;
}

void Hex_Bcd(ulong Hex,uchar *ExpectData)
{
    ulong data va;
    uchar data i;
    uchar idata DivBcd[10];
    va=1000000000;
    for(i=9;i;i--)
        {
        DivBcd[i]=0;
        while ((Hex>=va)&&(va>9))
            {
            Hex-=va;
            DivBcd[i]++;
            }
        va/=10;
        }
    DivBcd[0]=Hex;
    for(i=0;i<10;i++) ExpectData[i]=DivBcd[9-i];
 }
////////////////////////////////////////////


void Init(void){
CON_8255=0x9B;                     //PA,PB,PC为输入
key_cy=1;
EA=0;                              //disable interrupt
EX1=1;                             //enable interrupt1
IT1=1;                             //边沿触发
EX0=0;

TMOD=0x20;                               //定时器T1 方式2
TH1=0xfd;TL1=0xfd;                       //波特率9600
PCON&=0x00;                              //SMOD=0
SCON=0x50;                               //串行口工作在方式1,并允许接收
TR1=1;                                   //启动T1
ES=0;                           //中断0关闭
}

void delay10ms(void){                 //延时程序10ms
uchar i;
for(i=0;i<200;i++){}
}

key_press(void){                      //检测键盘子程序
if(key_cy==0) delay10ms();           //延时10ms
if(key_cy==0){
    delay10ms();                      //延时10ms
    return 1;
    }
else
    return 0;
}

void scom(void){                      //232传输程序
uchar idata buf[4];
uchar i;
int ain;
buf[0]=DBYTE[0xF0];
buf[1]=DBYTE[0xF1];
buf[2]=DBYTE[0xF2];
buf[3]=DBYTE[0xF3];

if(RI==1)
  {ain=SBUF;
   RI=0;
   SBUF=ain;
   while(TI==0);TI=0;
  }

   for(i=0;i<4;i++)
      {SBUF=buf[i];
       while(TI==0);TI=0;
      }
_nop_();
}//232传输


void Int1()interrupt 2 using 2{    //外部中断1
////////////////////////
     ulong shuju;
     uchar i;
     uchar j=0xE0;                      //BCD码的结果保存到以0xE0
     uchar fuhao;                       //开始的10个单元中

////////////////////////

EA=0;                              //关闭中断
CON4052=1;                         //关闭4052输入
               /************从8255中读取数据******************/
DBYTE[0xF0]=0x00;
DBYTE[0xF1]=0x00;
DBYTE[0xF2]=0x00;
DBYTE[0xF3]=0x00;
DBYTE[0xF2]=PA_8255;               //符号位
DBYTE[0xF2]=shift(DBYTE[0xF2]);
DBYTE[0xF0]=PB_8255;               //高位
DBYTE[0xF0]=shift(DBYTE[0xF0]);
DBYTE[0xF1]=PC_8255;               //低位
DBYTE[0xF1]=shift(DBYTE[0xF1]);
int_flag=1;                        //中断标志置位

//EA=1;                            //开中断
//CON4052=0;                       //打开4052
   _nop_();
   //scom();
   _nop_();

   ////////////////////////////////////////////
     for(i=0;i<11;i++,j++)
         DBYTE[j]=0x00;
     j=0xE0;
     shuju=DWORD[0x78];			//因为是字,所以为0XE0/2=0X78
     fuhao=DBYTE[0xF2];
     if((fuhao>0x00)&&(fuhao<0x0f)) return;//如果符号位不正确,退出计算
     DBYTE[0xEA]=DBYTE[0xF2];           //符号位保存在0xEA中
     if((fuhao>0x0f)&&(fuhao<=0xFf))shuju=0X0000FFFF&(~(shuju-1));   //求补码
     shuju*=248;
     Hex_Bcd(shuju,ExpectData);         //结果的转换
     for(i=0;i<10;i++,j++)
         DBYTE[j]=ExpectData[i];        //把结果存储到缓冲区中
     _nop_();

   ////////////////////////////////////////////

//   Caculate();
   display();
   scom();
//   EA=1;                            //开中断
   CON4052=1;
}

/************************************************/
void main(void)
{
uchar i;
Init_Lcd();                              //LCD初始化
Init();                                    //系统初始化

for(i=0;i<5;i++)
    XmtDat[i]=~(Hello[i]&0xff);     //Display "Hello"
Send_Data();
delay(1000);
for(i=0;i<5;i++)
    XmtDat[i]=~(zero[i]&0xff);     //Display "00000"
Send_Data();
int_flag=0;
CON4052=0;                             //打开4052
_nop_();
DBYTE[0xF3]=0x00;
//EA=1;
//while(1)
//{
// if(!P2_5)scom();
//}
while(1)
	{
      if(!P2_5)
      {
       delay10ms();
       if(!P2_5)   EA=1;			//开中断.开CD4052
   	}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -