📄 8952+1602_51.txt
字号:
C语言源代码
//=======================================================
//******** 小波电子工作室 All rights reserved******
//******** 个人主页:http://hi.baidu.com/niejinbo **
//******** 文 件 名: lcd_freq_0715_2.c ************
//******** 功能概要: LCD显示简易频率计 ********
//******** MCU: STC89C52 晶振:11.0592Mhz **********
//******** 设 计 者: 聂金波 ************
//******** 完成日期: 2008-07-15 ************
//******** 当前版本: 0715_2 ************
//******** 改进说明: 暂无 ************
//=========================================================
//**********头文件区************
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<intrins.h>
//*********宏定义方便使用*******
#define uchar unsigned char
#define uint unsigned int
//*********定义变量区***********
sbit dula=P2^6; //数码管段选
sbit wela=P2^7; //数码管位选
sbit lcden=P3^4; //LCD使能信号
sbit lcdrs=P3^5; //LCD数据/命令选择信号
sbit K5=P3^7; //按键
uchar count,k,key;
uchar tab_freq[]={0,0,0,10,0,0,11,12,13};
uchar tab_nofreq[]={14,14,0,10,0,0,11,12,13};
uchar code tab[]="0123456789.Khz";
uchar code tab_1[]="Freq:";
uchar code tab_time[]="2008-07-15-pm";
//===========================================================
//*********函数声明区***********
void int_time1(); //定时器0
void int_count0(); //计数器1
void trans_count(); //转换为10进制
void lcd_dis(); //lcd显示函数
void lcd_init(); //LCD初始化函数
void write_com(uchar); //写命令函数
void write_data(uchar); //写数据函数
void delay(uint); //延时函数
void freq_key();
//=================================================================
//*********主函数开始***********
void main()
{
TMOD=0x11; //T0为计数模式:方式1 T1为定时模式:方式1
TH0=0; //T0计数初始值
TL0=0;
TH1=0x4c; //T1定时初始值
TL1=0x00; //50MS
EA=1;
ET1=1; //允许T1定时中断
ET0=1; //允许T0计数中断
lcd_init();
write_com(1);
while(1)
{
freq_key();
trans_count();
lcd_dis();
}
}
//=================================================================
//*********T0计数函数开始**************
void int_count0() interrupt 1
{
k++;
}
//*********T1定时中断函数开始***********
void int_time1() interrupt 3
{
TH1=0x4c;
TL1=0x00; //50MS
count++;
if(count>=20)
{
count=0;
TR0=0; //到1秒T0停止计数
TR1=0; //T1停止定时
}
}
//*********数据转换函数开始**************
void trans_count()
{
unsigned long int z;
z=k*65536+TH0*256+TL0;
if(z>1000000) //最大量程为999999
{z=999999;}
tab_freq[0]=z/100000; //十万位
tab_freq[1]=(z-tab_freq[0]*100000)/10000; //万位
tab_freq[2]=(z-tab_freq[0]*100000-tab_freq[1]*10000)/1000; //千位
tab_freq[4]=(z-tab_freq[0]*100000-tab_freq[1]*10000-tab_freq[2]*1000)/100; //十位
tab_freq[5]=(z-tab_freq[0]*10000-tab_freq[1]*1000-tab_freq[2]*100)%10; //个位; //各位舍去为0
}
//====================================================================================
//*********lcd显示函数开始******
void lcd_dis()
{
uchar i,t;
for(i=0;i<5;i++)
{
write_data(tab_1[i]); //显示"Freq:"
}
write_com(0x80+5);
for(i=0;i<9;i++)
{
t=tab_freq[i];
write_data(tab[t]); //显示频率值
}
write_com(0x80+0x40);
for(i=0;i<13;i++)
{
write_data(tab_time[i]);
}
write_com(0x80);
}
//====================================================================================
//*********LCD初始化函数开始****
void lcd_init()
{
dula=0;
wela=0; // 关闭数码管显示
lcden=0;
write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口
write_com(0x0c); //开显示,显示光标,光标闪烁
write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动
write_com(0x80); //设置光标指针
}
//*********写命令函数开始*******
void write_com(uchar com)
{
lcdrs=0; //低电平写命令
P0=com; //写入命令
delay(3); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//*********写数据函数开始*******
void write_data(uchar dat)
{
lcdrs=1; //低电平写数据
P0=dat; //写入命令
delay(3); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//*********延时函数开始*********
void delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
//=========================================================
//*********按键函数开始***************
void freq_key()
{
if(K5==0)
{
delay(3);
if(K5==0)
{
key++;
while(K5==0);
if(key==1)
{
TR0=1;
TR1=1;
}
else //确保启动一次只计数1次
{
TR0=0;
TR1=0;
}
}
}
}
Proteus仿真图
测试单片机内部时钟频率为921.83KHZ(11.0592M/12=0.9216M)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -