?? lc振蕩頻率.c
字號:
#include<reg52.h>
#include<ABSACC.h>
#include<INTRINS.H>
#define Uint unsigned int
#define Uchar unsigned char
sbit R = P3^7;
sbit W = P3^6;
sbit IoClk = P1^0;
sbit Address = P1^1;
sbit DO = P1^2;
sbit CS = P1^3;
sbit DataDA = P1^4;
sbit ClkDA = P1^5;
sbit LOAD = P1^6;
sbit LDAC = P1^7;
#define Lcd1602WdataPort 0x8101
#define Lcd1602CmdPort 0x8100
#define Lcd1602StatusPort 0x8102
#define Busy 0x80
void LcdReset( void );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdWriteData( Uchar dataW );
void ShowChar(Uchar pos,Uchar c);
void ShowString(Uchar line,char *pr);
void count(void);
void xianshi(float a);
void xianshiVpp(Uint data1);
void WriteDa(Uchar Dat,Uchar CH);
Uint ReadAd(Uchar NextCH);
void Delay400Ms(void);
void Delay5Ms(void);
Uchar tf=0,k=1;
Uchar c[]={'0','1','2','3','4','5','6','7','8','9'};
Uint b[10];
Uchar flag=0;
Uchar da[6]={0x00,0xff,0x00,0xff,0x00,0xff};
main()
{ Uchar i,i1=0;
Uint advalue,j=5;
Uchar code str1[]="f= KHz";
Uchar code str2[]="Vpp= mV ";
float rate;
Delay400Ms();
LcdReset();
IE=0x84;
TCON=0x00;
for( ; ; )
{ XBYTE[0xf8f0]=0;
if(flag==0&&k)
{ count();
for(i=0;i<10;i++)
{ rate+=b[i];}
rate=rate*100;
advalue=ReadAd(0);
ShowString(0,str1);
ShowString(1,str2);
xianshi(rate);
xianshiVpp(advalue);
}
else if(flag!=0)
{ switch(flag)
{ case 1: {WriteDa(da[i1++],0x00);if(i1==6)i1=0;flag=0;k=1;EA=1;}break;
case 2: {WriteDa(da[j--],0x00);if(j<0)j=5;flag=0;k=1;EA=1;}break;
default:break;
}
}
}
}
time0() interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tf=1;
}
time1() interrupt 3 using 1 { }
void count(void)
{ Uchar i;
TMOD=0X59;
TH0=(65536-10000)/256;TL0=(65536-10000)%256;
TH1=0X00;TL1=0X00;
TR0=1;TR1=1;PT0=1;ET0=1;ET1=1;EA=1;
for(i=0;i<10;i++)
{ while(tf!=1);
TR0=0;TR1=0;
b[i]=TH1*256+TL1;
TH1=0X00;TL1=0X00;
TR0=1;TR1=1;
}
TR0=0;TR1=0;k=0;
}
void xianshi(float a)
{ Uchar j,n=0x02,n2=3;
Uint i;
float n1=100;
a/=1000;
if(a<100){n1/=10;n2=2;}
else if(a>=221)a=a-2;
else if(a>=106&&a<221)a=a-1;
for(j=0;j<n2;j++)
{ i=(Uint)(a/n1);
a=a-i*n1;
n1/=10;
Delay5Ms();
ShowChar(n,c[i]);
n++;
}
}
void xianshiVpp(Uint data1)
{ Uint array;
Uchar g8w,d8w,j,n4=5,m=0x16;
float v,n3=10000;
g8w=data1&0xff00;
g8w>>=8;
d8w=data1&0x00ff;
v=((g8w*256+d8w)*0.0024)*10000;
if(v<10000){n3/=10000;n4=4;}
for(j=0;j<n4;j++)
{ array=(Uint)(v/n3);
v=v-array*n3;
n3/=10;
Delay5Ms();
ShowChar(m,c[array]);
m++;
}
}
void LcdReset( void ) {
LcdWriteCommand( 0x38, 0); // 顯示模式設置(不檢測忙信號)
Delay5Ms();
LcdWriteCommand( 0x38, 0); // 共三次
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();
LcdWriteCommand( 0x38, 1); // 顯示模式設置(以后均檢測忙信號 參數--"1")
LcdWriteCommand( 0x08, 1); // 顯示關閉
LcdWriteCommand( 0x01, 1); // 顯示清屏
LcdWriteCommand( 0x06, 1); // 顯示光標移動設置
LcdWriteCommand( 0x0c, 1); // 顯示開及光標設置
}
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
Uchar i;
W = 1;R = 1;
if (AttribC)
{
P0=0xff;
while( (i=XBYTE[Lcd1602StatusPort]) & Busy ); // 檢測忙信號?
}
XBYTE[Lcd1602CmdPort] = CMD;
}
void LcdWriteData( Uchar dataW ) {
Uchar i;
W = 1;R = 1;
while( (i=XBYTE[Lcd1602StatusPort]) & Busy ); // 檢測忙信號
XBYTE[Lcd1602WdataPort] = dataW;
}
void ShowChar(Uchar pos,Uchar c)
{ Uchar p;
if(pos>=0x10)
p=pos+0xb0;
else
p=pos+0x80;
LcdWriteCommand(p,1);
LcdWriteData(c);
}
Int1_process() interrupt 2 using 0
{ Uchar w=0;
w=~(XBYTE[0xf8f0]|0xf0);
if(w==0x08)flag=1;
else if(w==0x04)flag=2;
else flag=0;
Delay5Ms();
XBYTE[0xf8f0]=0;
k=1;
EA = 0;
}
Uint ReadAd(Uchar NextCH)
{
Uchar i;
Uint AdVal = 0;
IoClk = 0;
CS = 0;
for(i=0;i<10;i++)
{
if(i<4)
{
NextCH<<=1;
Address=CY;
}
_nop_();
IoClk = 1;
AdVal<<=1;
if(DO)
AdVal++;
_nop_();
IoClk = 0;
}
CS = 1;
return(AdVal);
}
void WriteDa(Uchar Dat,Uchar CH)
{
Uchar i;
LDAC = 0;
ClkDA = 0;
i=Dat;
for(i=0;i<11;i++)
{
ClkDA = 1;
if(i<3)
{
CH<<=1;
DataDA = CY;
}
else
{ Dat <<=1;
DataDA = CY;
}
_nop_();
ClkDA = 0;
}
_nop_();
LOAD = 0;
_nop_();
LOAD = 1;
_nop_();
ClkDA = 1;
_nop_();
ClkDA = 0;
Delay5Ms();
}
void ShowString(Uchar line,char *ptr)
{ Uchar l,i;
l=line<<4;
for(i=0;i<16;i++)
ShowChar(l++,*(ptr+i));
}
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
//j=7269; //400Ms
j=1817; //100Ms
while(j--);
}
}
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -