📄 caiji.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 + -