📄 yue1112212.c
字号:
//#include <reg51.h>
#include <at89x55.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h> //此文件中有_nop_()空操作函数
#define uchar unsigned char
#define uint unsigned int
uchar biao1,biao2,biao3;//biao3高斯与磁通的转换,biao1是AD采样,biao2是量程转换
uchar biao4=0;//biao4单位转换标志
uchar biao5;//biao输入上、下限的标志位
uchar srjs1, srjs2;
uchar xueren=0;//计确定键的次数
uchar m,n;//定义输入上、下限的范围位置
unsigned long out; //存放1674测量值变量
unsigned char code num[]={"0123456789 :.-"};
unsigned char code idea1[]={"Gauss Meter"};
unsigned char code idea2[]={"Magnaflux Meter"};
unsigned char code idea3[]={" 磁信号检测仪 "};
unsigned char code idea4[]={"指导老师:张 胜"};
unsigned char code idea5[]={"设计者: 郑魏悦"};
unsigned char code idea6[]={"学 号:03440126"};
unsigned char code shape[]={"Shape"};
unsigned char code poles[]={"poles"};
unsigned char code work[]={"work"};
unsigned char code range[]={"range "};
uchar sz1[8] ; //AD转换数据暂存
uchar sz2[8]; //上限输入数据暂存
uchar sz3[8]; //下限输入数据暂存
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
/*************************************HD_7279引脚定义************************/
sbit hd_7279cs=P1^3;
sbit hd_7279clk=P1^4;
sbit hd_7279data=P1^5;
sbit hd_7279key=P3^3;
//sbit hd_7279key=P1^6; // key 连接于P1.3
/*************************************AD1674引脚定义************************/
sbit AD1674RC=P2^5;
sbit AD1674A0=P2^6;
sbit AD1674TST=P3^2;
sbit AD1674CS=P2^7;
/*************************************LCD液晶脚定义***************************/
sbit lcdCS = P1^5; //片选 高电平有效 单片LCD使用时可固定高电平
sbit lcdSID = P1^6; //数据
sbit lcdSCLK = P1^7; //时钟
//sbit lcdPSB = P2^3;
//sbit lcdRST = P2^4;
/*********************************函数定义******************************/
//7279
void hd7279send_byte(uchar out_byte);
void keyin(void);
void ajcl(js);
void axszj(uchar js);
void long_delay(void);
void short_delay(void);
//12864
void Write_char(bit start, unsigned char ddata);
void Send_byte(unsigned char bbyte);
void Delaynms(unsigned int di);
void Lcd_init(void);
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_set_xy( unsigned char x, unsigned char y );
//AD1674
void qd1674(void);
//
void makerang(void) ;
void disp(void);
void panluan(void);
/*************************写路一字节************************************/
void hd7279send_byte(uchar out_byte)
{ uchar j;
hd_7279cs=0;
long_delay(); /*50uS引时*/
for(j=8;j>0;j--)
{ if(out_byte & 0x80)
{hd_7279data=1;}
else
{hd_7279data=0;}
hd_7279clk=1;
short_delay();
hd_7279clk=0;
short_delay();
out_byte=out_byte<<1;
}
hd_7279data=0;
}
/**************************读一字节**********************************/
uchar hd7279receive_byte(void)
{ uchar j,in_byte;
hd_7279data=1;
long_delay(); /*50uS引时*/
for(j=8;j>0;j--)
{ hd_7279clk=1;
short_delay();
in_byte=in_byte<<1;
if(hd_7279data)
{in_byte=in_byte|0x01;}
hd_7279clk=0;
short_delay();
}
hd_7279data=0;
return (in_byte);
}
//***长延时***
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++);
}
//***短延时***
void short_delay(void)
{
unsigned char i;
for (i=0;i<8;i++);
}
/******************************************************************************/
void Delaynms(unsigned int di) //延时
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<10;db++);
}
/*********************************AD1674转换****************************************/
void qd1674(void)
{
unsigned char out1,out2;
AD1674CS=0;
AD1674RC=0;
AD1674A0=1;
/*测忙*/
loop:
if(AD1674TST)goto loop;
/*读高8位*/
AD1674RC=1;
AD1674A0=0;
out1=P0;
out=out1&0x0f ;
out<<=8;
out+=out1;
/*读低4位*/
AD1674RC=1;
AD1674A0=1;
out2=P0;
out2=out2&0x0f;
out+=out2;
AD1674CS=1;
}
/******************************初始化LCD************************************************/
void Lcd_init(void)
{
Delaynms(10); //启动等待,等LCM讲入工作状态
lcdCS=1;
//Write_char(0,0x82) ;
Write_char(0,0x30) ; //8 位介面,基本指令集
Write_char(0,0x0c); //显示打开,光标关,反白关
Write_char(0,0x01); //清屏,将DDRAM的地址计数器归零
/*******************************************************/
LCD_Write_string(1,0,idea3);
LCD_Write_string(2,0,idea4);
LCD_Write_string(3,0,idea5);
LCD_Write_string(4,0,idea6);
}
/*******************************写指令或数据***********************************/
void Write_char(bit start, unsigned char ddata) //
{
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //写指令
else
start_data=0xfa; //写数据
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
Send_byte(start_data); //发送起始信号
Delaynms(5); //延时是必须的
Send_byte(Hdata); //发送高四位
Delaynms(1); //延时是必须的
Send_byte(Ldata); //发送低四位
Delaynms(1); //延时是必须的
}
/******************************************************************************/
void Send_byte(unsigned char bbyte) //发送一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
lcdSCLK=0; lcdSID=bbyte&0x80; //取出最高位
lcdSCLK=1;
bbyte<<=1; //左移
}
}
/******************************************************************************/
void Clr_Scr(void)//清屏函数
{
Write_char(0,0x01);
}
/******************************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{ //设置LCD显示的起始位置,X为行,Y为列
unsigned char address;
switch(x)
{
case 0: address = 0x80 + y; break;
case 1: address = 0x80 + y; break;
case 2: address = 0x90 + y; break;
case 3: address = 0x88 + y; break;
case 4: address = 0x98 + y; break;
default:address = 0x80 + y; break;
}
Write_char(0, address);
}
/******************************************************************************/
void LCD_Write_number(unsigned char s)// 数字显示函数
{
Write_char(1,num[s]);
Delaynms(1);
}
/******************************************************************************/
void Delay(int num)//延时函数
{
while(num--) ;
}
/******************************************************************************/
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
{ // 中英文字符串显示函数
LCD_set_xy( X, Y );
while (*s)
{
Write_char( 1, *s );
s ++;
Delaynms(1);
}
}
/****************************************************************************/
void Lcd_Mark1(void)//在预定的位置上写入汉字
{
Clr_Scr();//清屏
LCD_Write_string(1,0,idea1);//标题-高斯计-
LCD_Write_string(2,0,"B: ");
LCD_Write_string(3,0,range);//
LCD_Write_string(3,4,work);//
LCD_Write_string(3,6," off") ;
}
void Lcd_Mark2(void)//在预定的位置上写入汉字
{
Clr_Scr();//清屏
LCD_Write_string(1,0,idea2);//标题-磁通计-
LCD_Write_string(2,0,shape);
LCD_Write_string(2,4,poles);//
LCD_Write_string(3,0,"Q: ");
LCD_Write_string(4,0,range);//
LCD_Write_string(4,4,work);//
LCD_Write_string(4,6," off") ;
}
/***************************按键中断**********************************/
void int1_(void) interrupt 2
{ uchar js; uchar biao;
hd7279send_byte(0xa4);
hd7279send_byte(0x15);
js=hd7279receive_byte();
hd_7279cs=1;
if(js==11)
{
biao3=~biao3; //磁通计与高斯计的转换
Clr_Scr();//清屏
Delaynms(1000);
if (biao3==0)
{ Lcd_Mark1( );}
else
{ Lcd_Mark2( );}
Delaynms(1000);
biao=1;
}
if(biao)
{ ajcl(js);}
}
/********************************按键处理******************************************/
void ajcl(js)
{
switch(js)
{ case 0 : axszj(0);
break;
case 1 : axszj(1);
break;
case 2 : axszj(2);
break;
case 3 : axszj(3);
break;
case 4 : axszj(4);
break;
case 5 : axszj(5);
break;
case 6 : axszj(6);
break;
case 7 : axszj(7);
break;
case 8 : axszj(8);
break;
case 9 : axszj(9);
break;
case 10: axszj(12);
break;
case 12: if(biao3==0)
{
if(biao1==1) //测量开始关闭按键
{ biao1=0;
LCD_Write_string(3,6," off") ;
}
else
{ biao1=1;
LCD_Write_string(3,6," on ") ;
} //
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -