课程设计任务及要求:
任务:用单片机的定时器/计数器测量外部脉冲的频率,并使用LCD1602显示结果。
要求:频率范围为1Hz~500KHz,精度为±1Hz。
LCD显示的单片机频率计
一 课题目标
本课题是用51系列单片机来实现频率计,并利用LCD1602液晶显示器来显示所测频率值。
二 课题分析
LCD频率计是利用十进制数字显示被测信号频率的数字测量仪器。根据定义,频率就是在1s内信号变化的周期数。在一个单片机系统中,对频率的测量就是要对外部信号的计数,每到1s,将计数所得的数值送到显示器上。在这里,我们重要是学习和掌握如何使用LCD1602液晶显示器来显示所测频率。这里要求实现对0~200kHz的信号频率进行准确测量,测量误差不超过±1Hz。频率计的功能是测出1s、对输入的脉冲计数和数字显示的硬件电路及相应的程序。实验原理图如下:
三 实验元件及器材:
一个AT89S52、一个发光二极管、一个1602液晶显示器、一个1K电阻、一个10K电阻、两个20pF电容、一个1uF电容、下载线插座、一个按键开关、一个晶振、若干导线。
四 硬件电路设计及描述:
五 软件设计流程及描述:
#include
#define uchar unsigned char
uchar disp[];
uchar T0count, T1count;
void display()
{
uchar i,j,k;
uchar code dispcode[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
for(i=0;i<8;i++)
{
P2=0;
P0=dispcode[disp[i]];
P2=k;
for(j=250;j>0;j--);
k=k>>1;
}
P2=0;
}
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xC0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define MSB 0x80
#define LSB 0x01
#define LCDIO P2
sbit LCD1602_RS=P1^1;
sbit LCD1602_RW=P1^2;
sbit LCD1602_EN=P1^3;
#define LCDIO_delay(void);
void LCD_en_command(uchar command);
void LCD_en_dat(uchar temp);
void LCD_set_xy(uchar x, uchar y);
void LCD_write_char(uchar x,uchary,uchar dat);
void LCD_write_string(uchar X,uchar Y,uchar *s);
void LCD_init(void);
void delay_nms(unsigned int n);
void LCD_delay(void)
{
unsigned char i;
for(i=LCD_DELAY_TIME;i>0;i--){;}
}
void LCD_en_command(unsigned char command)
{
LCDIO=command;
LCD1602_RS=LOW;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
void LCD_en_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
void LCD_set_xy(uchar x, uchar y)
{
unsigned char address;
if (y== LINE1)
address= LINE1_HEAD+x;
else
address= LINE2_HEAD+x;
LCD_en_command(address);
}
void LCD_write_char( uchar x,uchar y,uchar dat)
{
LCD_set_xy( x,y );
LCD_en_dat(dat);
}
void LCD_write_string(uchar X,uchar Y,uchar *s)
{
LCD_set_xy( X,Y );
while(*s)
{
LCD_en_dat(*s);
s++;
}
}
void LCD_init(void)
{
CLEARSCREEN;
LCD_en_command(DATA_MODE);
LCD_en_command(OPEN_SCREEN);
LCD_en_command(DISPLAY_ADDRESS);
CLEARSCREEN;
delay_nms(40);
}
void delay_nms(unsigned int n)
{
unsigned int i;
unsigned char j;
for(i=n;i>0;i--)
{for (j=250;j>0;j--);
for(j=250;j>0;j--); }
}
void main(void)
{
uchar string[]="0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09";
uchar i,k;
delay_nms(400);
LCD_init();
LCD_write_string(3,LINE1,"Char left");
while(1)
{
LCD_write_string(0,LINE2,string);
delay_nms(1000);
k=string[0];
for(i=0;i<16;i++)
{
string[i]=string[i+1];
}
string[i]=k;
}
}
void init()
{
T0count=0;
T1count=0;
TH0=0;
TL0=0;
}
void main()
{
init();
TMOD=0X15;
TH1=(65536-5*120000/12)/256;
TL1=(65536-5*120000/12)%256;
ET1=1;
ET0=1;
EA=1;
TR1=1;
TR0=1;
T2MOD=0X2;
RCAP2H=245;
RCAP2L=74;
TR2=1;
while(1)
{
display();
}
}
void time0()interrupt 1
{
T0count++;
}
void time1()interrupt 3
{
TH1=(65536-5*120000/12)/256;
TL1=(65536-5*120000/12)%256;
if(T1count==19)
{
calc();
init();
}
else T1count++;
}
五 源程序及代码:
六 思考与讨论:
通过这次单片机的实训,使我们增进了对单片机的感性认识,使我们掌握了频率计的内部功能模块的应用,了解和掌握了单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。进一步加强综合应用能力及单片机应用系统开发和设计能力的训练。
上一篇:AT89S52抢答器程序
下一篇:AT89S52交通灯程序
推荐阅读最新更新时间:2024-03-16 15:16
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- 骏龙科技&ADI有奖直播:适用于视频、转换器、通信的千兆数字隔离器
- 有奖直播【如何在几分钟之内完成高效可靠的USB PD电源设计——PI Expert™分步教程】(9:30开始入场)
- #每日好读书#说一说你看过的那些好书
- 我是大侦探之:寻找遗落的TI电源拼图
- 下载有礼:看“智””造“热”侦探 FLIR ETS320 红外热像仪如何纠错!
- Keysight教你如何提高测试精度,答对问题还有礼品相送,速速参与!
- 【有奖问答】MOSFET,选型我在行!
- 2020-2021年安森美和安富利物联网创新设计大赛
- 先到先得双重有礼 成为体验FLUKE新品的先锋者
- 2020-2021年安森美和安富利物联网创新设计大赛