|
#include
#include
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit KG = P3^0;//档位选择
sbit K = P3^2;//门控信号
sbit RES = P3^3;
sbit LCM_E = P3^5;
sbit LCM_RW = P3^6;
sbit LCM_RS = P3^7;
sbit rs = P3^7; //
sbit rw = P3^6;
sbit ep = P3^5; //这三个改成控制端口
void Delays() //1秒延时
{
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
delay(BYTE ms)
{ // 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P1 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P1 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P1 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
void sampling(ulong *freTempPtr)
{
ulong temp;
RES = 0;//使4040可计数
TR0 =1;//启动计数器0
K = 1;//开门控信号
Delays();//1S
K = 0;//关门控信号
_nop_ (); //精确延时
_nop_ ();
_nop_ ();
TR0=0;
*freTempPtr = 0;
*freTempPtr = TH0;//单片机芯片16位计数器的高8位
*freTempPtr = (*freTempPtr)<<20;
temp = TL0;
temp = temp<<12;
*freTempPtr += temp;//读单片机芯片16位计数器
temp = P2 && 0x0F;
temp =temp << 8;
*freTempPtr += temp;
*freTempPtr += P0;
RES = 1;
}
void BchangASII(ulong y,uchar *BCD)
{
*BCD = y/1000000000+0x30; y = y%1000000000; BCD++;
*BCD = y/100000000+0x30; y = y%100000000; BCD++;
*BCD = y/10000000+0x30; y = y%10000000; BCD++;
*BCD = y/1000000+0x30; y = y%1000000; BCD++;
*BCD = y/100000+0x30; y = y%100000; BCD++;
*BCD = y/10000+0x30; y = y%10000; BCD++;
*BCD = y/1000+0x30; y = y%1000; BCD++;
*BCD = y/100+0x30; y = y%100; BCD++;
*BCD = y/10+0x30; BCD++;
*BCD = y%10+0x30;
}
void initialize(void)
{
RES = 1;
TMOD = 0x05;//定时/计数器0,方式1,计数
P0 = 0xFF;
P2 = 0xFF;
TH0 = 0x00;
TL0 =0x00;//设置计数初值
delay(100); //启动等待,等lcd讲入工作状态
lcd_init(); //lcd初始化
delay(5); //延时片刻(可不要)
}
main()
{
uchar result1[16]="Freq: ";
uchar result2[16]="Unit: Hz ";
uchar *p1,*p2,i;
ulong fre,*frePtr;
frePtr = &fre;
initialize(); // 初始化操作
p1=&result1;
p2=&result2;
while(1)
{
sampling(frePtr);
if(KG) //150MHZ-1.1GHZ处理
{
fre = fre * 64;
}
BchangASII(fre,&result1[5]);
lcd_pos(0); // 设置显示位置为第1行的第1个字符
i = 0;
for(i=0;i<16;i++)
lcd_wdat(*(p1+i));
lcd_pos(0x40); // 设置显示位置为第2行第1个字符
i = 0;
for(i=0;i<9;i++)
lcd_wdat(*(p2+i));
}
}
这是我写的程序,但采集不到外部的频率值啊,难道采集频率的子程序错了吗????我不接外部信号发生器,LCD上就有数值显示,接上外部信号发生器后还是同样的值啊,怎么回事啊????而且显示的数值一直会自动加1或者常常自动加16。
|
|