文档视界 最新最全的文档下载
当前位置:文档视界 › 单片机设计 按键顺序控制加减计数(1602 液晶显示) 程序

单片机设计 按键顺序控制加减计数(1602 液晶显示) 程序

单片机设计 按键顺序控制加减计数(1602 液晶显示) 程序
单片机设计 按键顺序控制加减计数(1602 液晶显示) 程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define LCD_IO P2

sbit KK1 = P3^2; //按键输入;

sbit KK2 = P3^3; //按键输入;

sbit LCD_RS = P3^5;

sbit LCD_RW = P3^6;

sbit LCD_EN = P3^7;

uchar code LCD_line1[] = " The Counter";

int idata mydata=0;

/************************************************************** * 名称: Delay_1ms()

* 功能: 延时子程序,延时时间为1ms * x

* 输入: x (延时一毫秒的个数)

* 输出: 无

***************************************************************/ void Delay_1ms(uint x)

{

uchar i, j;

for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);

}

/************************************************************** * 名称: lcd_bz( )

* 功能: 测试忙碌子程序

* 输入: 无

* 输出: result

***************************************************************/ bit lcd_bz()

{

bit result;

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

_nop_();

_nop_();

_nop_();

_nop_();

result=(bit)(P3&0x80);

LCD_EN = 0;

return result;

}

/**************************************************************

* 名称: W_LCD_Com( )

* 功能: 写指令子程序

* 输入: com

* 输出: 无

***************************************************************/

void W_LCD_Com(uchar com)

{

while(lcd_bz());

LCD_RS = 0; LCD_RW=0; LCD_EN = 0; // LCD_RS和R/W同时为低电平时,可以写入指令

LCD_IO = com; Delay_1ms(5); //下面用EN输入一个高脉冲

LCD_EN = 1; Delay_1ms(5); LCD_EN = 0;

}

/**************************************************************

* 名称: W_LCD_Dat( )

* 功能: 写数据子程序

* 输入: dat

* 输出: 无

***************************************************************/

void W_LCD_Dat(uchar dat)

{

while(lcd_bz());

LCD_RS = 1; LCD_RW=0;LCD_EN = 0; // LCD_RS为高,LCD_RW为低时,可以写入数据LCD_IO = dat; Delay_1ms(5); //下面用EN输入一个高脉冲

LCD_EN = 1; Delay_1ms(5); LCD_EN = 0;

}

/**************************************************************

* 名称: W_LCD_STR( )

* 功能: 写字符串子程序

* 输入: *s

* 输出: 无

***************************************************************/

void W_LCD_STR(uchar *s)

{

while(*s > 0) {W_LCD_Dat(*s); s++;}

}

/**************************************************************

* 名称: LCD_cursor( )

* 功能: 设置光标位置子程序

* 输入: pos

* 输出: 无

***************************************************************/

void LCD_cursor(uchar pos) //LCD光标定位到处{

W_LCD_Com(pos+0x80); //第一行地址是0x80

}

/**************************************************************

* 名称: initial( )

* 功能: 初始化子程序

* 输入: 无

* 输出: 无

* 指令:#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一#define LCD_DISPLAY_ON 0x0C //显示开

#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示

***************************************************************/

void initial()

{

W_LCD_Com(0x06|0x04);

W_LCD_Com(0x0c|0x08);

W_LCD_Com(0x38);

W_LCD_STR(LCD_line1);

}

/**************************************************************

* 名称: Main()

* 功能: 主函数

***************************************************************/

void main()

{

bit flag;

uchar temp;

uchar pos;

Delay_1ms(10) ;

initial();

while(1){

pos=0x4f;

if(mydata>255)

mydata=0;

else if(mydata<0)

mydata=255;

if(mydata>127) //把mydata当做-128~127的有符号数来显示

{

flag=1;

temp=256-mydata;

}

else {temp=mydata;flag=0;}

LCD_cursor(pos);

W_LCD_Dat((temp%10)+'0');

pos--;//光标左移(其实光标不显示,只是为了输出高位)Delay_1ms(10);

if(temp/100 || temp/10)

{

LCD_cursor(pos);

W_LCD_Dat((temp/10)%10+'0');

pos--;

}

Delay_1ms(10);

if(temp/100)

{

LCD_cursor(pos);

W_LCD_Dat((temp/100)%10+'0');

pos--;

}

if(flag)

{

LCD_cursor(pos);

W_LCD_Dat('-');//负号

}

else

{ LCD_cursor(pos);

W_LCD_Dat(' ');//清除负号(空格代替)

}

if(!KK1)

{

while(KK2);

while(!KK2);

mydata++;

}

else if(!KK2)

{

while(KK1);

while(!KK1);

mydata--;

}

}

}

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

按键实现0~9999计数器 单片机

按键调节数码管显示 功能:通过按键加减数码管所显示的数字 按下k1加1,最大加到9999 按下k2减1,最小减到0 按下k3清零复位 C语言程序 //---------------------------------------------------------------------- //名称:按键调节数码管显示 //---------------------------------------------------------------------- //功能:通过按键加减数码管所显示的数字 // 按下k1加1,最大加到9999 // 按下k2减1,最小减到0 // 按下k3清零复位 //---------------------------------------------------------------------- //姓名:陈润源 //地点:内江职业技术学院 //时间:2019年4月6日21:40:41 //---------------------------------------------------------------------- #include #define uchar unsigned char #define uint unsigned int sbit k1 = P1^0; //加 sbit k2 = P1^1; //减

sbit k3 = P1^2; //复位 void key(void); void display(void); uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //数组 char m=99,n=98; //显示初值,m,n的值决定开机显示数值 //**************************************** //延时程序 //**************************************** void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } //*********************************************** //显示程序 //*********************************************** void display(void) { P2=0X08; P0=table[m%10]; //显示个位 delayms(5); P2=0X04; P0=table[m/10]; //显示十位 delayms(5); P2=0X02; P0=table[n%10]; //显示百位 delayms(5); P2=0X01; P0=table[n/10]; //显示千位 delayms(5); } //*************************************************** //按键处理 //*************************************************** void key() { if(k1==0) //检测按键是否被按下 { //延时消抖 delayms(10); if(k1==0) //再次检测是否真正按下按键 { m++; //m自加一 if(m>=100) //如果m加到100则n加一 (限制m的取值范围) 个位、十位最大显示99 {

单片机定时器与计数器的工作方式解析

单片机定时器与计数器的工作方式解析 1 工作方式0 定时器/计数器的工作方式0称之为13位定时/计数方式。它由TL(1/0)的低5位和TH (0/1)的8位组成13位的计数器,此时TL(1/0)的高3位未用。 我们用这个图来讨论几个问题: M1M0:定时/计数器一共有四种工作方式,就是用M1M0来控制的,2位正好是四种组合。C/T:前面我们说过,定时/计数器即可作定时用也可用计数用,到底作什么用,由我们根据需要自行决定,也说是决定权在我们??编程者。如果C/T为0就是用作定时器(开关往上打),如果C/T为1就是用作计数器(开关往下打)。顺便提一下:一个定时/计数器同一时刻要么作定时用,要么作计数用,不能同时用的,这是个极普通的常识,几乎没有教材会提这一点,但很多开始学习者却会有此困惑。 GATE:看图,当我们选择了定时或计数工作方式后,定时/计数脉冲却不一定能到达计数器端,中间还有一个开关,显然这个开关不合上,计数脉冲就没法过去,那么开关什么时候过去呢?有两种情况 GATE=0,分析一下逻辑,GATE非后是1,进入或门,或门总是输出1,和或门的另一个输入端INT1无关,在这种情况下,开关的打开、合上只取决于TR1,只要TR1是1,开关就合上,计数脉冲得以畅通无阻,而如果TR1等于0则开关打开,计数脉冲无法通过,因此定时/计数是否工作,只取决于TR1。 GATE=1,在此种情况下,计数脉冲通路上的开关不仅要由TR1来控制,而且还要受到INT1管脚的控制,只有TR1为1,且INT1管脚也是高电平,开关才合上,计数脉冲才得以通过。这个特性能用来测量一个信号的高电平的宽度,想想看,怎么测? 为什么在这种模式下只用13位呢?干吗不用16位,这是为了和51机的前辈48系列兼容而设的一种工作式,如果你觉得用得不顺手,那就干脆用第二种工作方式。 2 工作方式1

单片机实验之定时器计数器应用实验二

一、实验目的 1、掌握定时器/计数器计数功能的使用方法。 2、掌握定时器/计数器的中断、查询使用方法。 3、掌握Proteus软件与Keil软件的使用方法。 4、掌握单片机系统的硬件和软件设计方法。 二、设计要求 1、用Proteus软件画出电路原理图,单片机的定时器/计数器以查询方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数,每计满100个脉冲,则取反P1.0口线状态,在P 1.0口线上接示波器观察波形。 2、用Proteus软件画出电路原理图,单片机的定时器/计数器以中断方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数,每计满200个脉冲,则取反P1.0口线状态,在P 1.0口线上接示波器观察波形。 三、电路原理图 六、实验总结 通过本实验弄清楚了定时/计数器计数功能的初始化设定(TMOD,初值的计算,被计数信号的输入点等等),掌握了查询和中断工作方式的应用。 七、思考题 1、利用定时器0,在P1.0口线上产生周期为200微秒的连续方波,利用定时器1,对 P1.0口线上波形进行计数,满50个,则取反P1.1口线状态,在P 1.1口线上接示波器观察波形。 答:程序见程序清单。

四、实验程序流程框图和程序清单。 1、定时器/计数器以查询方式工作,对外部连续周期性脉冲信号进行计数,每计满100个脉冲,则取反P1.0口线状态。 汇编程序: ORG 0000H START: LJMP MAIN ORG 0100H MAIN: MOV IE, #00H MOV TMOD, #60H MOV TH1, #9CH MOV TL1, #9CH SETB TR1 LOOP: JNB TF1, LOOP CLR TF1 CPL P1.0 AJMP LOOP END C语言程序: #include sbit Y=P1^0; void main() { EA=0; ET1=0; TMOD=0x60; TH1=0x9C; TL1=0x9C; while(1) { TR1=1; while(!TF1); TF1=0; Y=!Y; } } 开始 TMOD初始化 计数初值初始化 中断初始化 启动定时器 计数溢出 清计数溢出标志 Y N P1.0口线取反

lcd1602按键显示程序

#include<> #include<> //包含_nop_()函数定义的头文件 typedef unsigned int uint ; typedef unsigned char uchar ; sbit RS=P2^0; //寄存器选择位,将RS位定义为引脚 sbit RW=P2^1; //读写选择位,将RW位定义为引脚 sbit E=P2^2; //使能信号位,将E位定义为引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为引脚 " uchar keyscan(); void delay1ms(); void delay(unsigned char n); unsigned char BusyTest(void); void WriteInstruction (unsigned char dictate); void WriteAddress(unsigned char x); … void WriteData(unsigned char y); void LcdInitiate(void); void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } ! void delay(unsigned char n) { unsigned char i; for(i=0;i

单片机频率计数器课程设计

课程设计报告 课程名称:单片机课程设计 题目:基于单片机的频率计数器设计 学院:环境与化学工程系:过程装备与测控工程 专业: 班级: 学号: 学生姓名: 起讫日期: 指导教师:

摘要 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字,显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信号以及其他各种单位时间内变化的物理量。本课程设计主要设计一个简易的频率计,来实现信号在0-9999HZ范围内周期变化的方波频率的测定。 该文主要介绍了基于STC89C52 单片机频率计的设计方案和实现方法,该系统主要由硬件和软件两部分组成,其中重点给出了具体硬件电路图和软件流程图以及具体工作原理。硬件部分通过洞洞板的布线设计帮助,可以确保焊接时尽量少的飞线和出错。软件通过keil μvision编译及调试,其中在P1.7口编入了一个5500HZ的方波,用以仿真调试该频率计的软硬件功能是否能够实现输出频率的功能。另外,本设计多增加了一个按键功能,通过一个按键来控制定时计数器的开始和关闭。该频率计还带有3*3的矩阵键盘,可以作为扩展应用区,通过编程实现。本设计中用的是LED共阴数码管,输出频率时采用的事动态显示的方法。 关键词:频率计;单片机;动态显示

目录 一、频率计数器的设计任务和要求 (1) 1.1 频率计数器的设计任务 (1) 1.2 设计要求及发挥部分 (1) 二、方案的总体设计 (1) 2.1 方案的设计 (1) 2.2 方案的整体框图 (2) 2.3 方案的说明 (2) 三、硬件设计 (2) 3.1 单片机的最小系统 (2) 3.1.1 上电复位电路 (2) 3.1.2 晶振电路 (3) 3.2 LED数码管显示电路 (3) 3.3 整体电路 (4) 四、软件设计 (4) 4.1 程序流程图 (5) 4.2 初始化子函数 (5) 4.3 延时子函数 (5) 4.4 中断子函数 (5) 五、系统的调试和说明 (6) 5.1 C程序的说明 (6) 5.2 C程序编译的结果 (6) 5.3 实物图 (7) 六、设计总结与心得体会 (8) 6.1设计总结 (8) 6.2 设计心得 (9) 七、参考文献 (9) 附录 (10)

单片机一个按键的多次击键组合判别技巧

《一个按键的多次击键组合判别技巧》大话篇 小匠自从上次在旧社区发表了一篇《<程序编写规范倡议书>大话篇》后,好久没有发表"高"论了.急坏了一帮MM,以为小匠退隐江湖了。 (斑竹在旁问道:“MM”不是“Mie Mie”,而是“Ma Ma”吧?) 论坛内外谣言四起,有人说小匠改行了,不做程序匠,改做泥水匠了;还有人说小匠上阿富汗反恐怖去了;其实非也,只因新板论坛启用后,小匠一直用不惯...... (斑竹在旁笑道:是“用不来”吧?) 今天,小匠再次隆重登坛献演。贴一个小程序段..... (斑竹道:我看是“蹬痰现眼”吧?) (程序匠人贴完帖子,下到后台,一边洗着手上残余的浆糊,一边哼着小曲:“如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠,……”) (一黑客悄悄贴近匠人,将一个废弃的浆糊桶扣到匠人头上......)

(匠人忙问:“斑竹,谁把灯给关了?”) (众人哈哈大笑!......) 一个按键的多次击键组合判别技巧 有时在设计中,往往要用一个按键来输入多种信息。如:单击/双击/三击、短击/长击、还有各种组合击键方式。可以用以下程序来做。如果按键闭合时间<500MS,判断为一次短击(0); 如果按键闭合时间>500MS,判断为一次长击(1); 两次击键时间间隔应<700MS,如果按键释放后700MS内无键按下,则结束读键。 读键完毕返回一个键号值KEY_NUM。其意义如下: KEY_NUM 意义 00000000 无键按下过 00000001 无意义 00000010 单次短击 00000011 单次长击 00000100 短击+ 短击 00000101 短击+ 长击 00000110 长击+ 短击 00000111 长击+ 长击

实验三+单片机定时计数器实验

实验三单片机定时/计数器实验 1、实验目的 1、学习计数器的使用方法。 2、学习计数器程序的编写。 3、学习定时器的使用方法。 4、学习定时器程序的编写。 5、熟悉汇编语言 2、实验说明 1、8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。将其数值按二进制数在P1口驱动LED灯上显示出来。 2、用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转 3、实验仪器和条件 计算机 伟福实验箱( lab2000P ) 4、实验内容 1、 8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。将其数值按二进制数在P1口驱动LED灯上显示出来。

2、外部事件计数脉冲由P3.4引入定时器T0。单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变。这就要求被 采样电平至少维持一个完整的机器周期,以保证电平在变化之前即被采样。同时这 就决定了输入波形的频率不能超过机器周期频率。 3、用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转 4、定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。TMOD用于设置定时器/计数器的工作方式0-3,并确定用于定时还是用于计数。TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。 5、在例程的中断服务程序中,因为中断定时常数的设置对中断程序的运行起 到关键作用,所以在置数前要先关对应的中断,置数完之后再打开相应的中断。 五、思考题 1、使用其他方式实现本实验功能; 2、改为门控方式外部启动计数; 3、如果改为定时间隔为200us,如何改动程序; 4、使用其他方式实现本实验功能,例如使用方式1,定时间隔为10ms,如何改动程序。 六、源程序修改原理及其仿真结果 思考题一:使用其他方式实现本实验功能 方法一: mov TMOD, #00000100b ; 方式0,记数器

手机拨号矩阵键盘控制lcd1602

手机拨号矩阵键盘控制lcd1602 #include #include #define uint unsigned int #define uchar unsigned char sbit RS=P2^0; sbit RW=P2^1; sbit EP=P2^2; uchar num[12]={"0123456789*#"}; void delay(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=115;j>0;j--); } uchar busy_check()//忙碌 { uchar result; RS=0; RW=1; EP=1; _nop_(); _nop_(); _nop_(); result=P0&0x80;

EP=0; return result; } void cmd(uchar x)//指令{ while(busy_check()); RS=0; RW=0; EP=0; _nop_(); _nop_(); _nop_(); P0=x; _nop_(); _nop_(); _nop_(); EP=1; _nop_(); _nop_(); _nop_(); EP=0; } void date(uchar y)//数据{ while(busy_check()); RS=1; RW=0; EP=0; _nop_(); _nop_(); _nop_(); P0=y; _nop_(); _nop_(); _nop_(); EP=1; _nop_(); _nop_(); _nop_(); EP=0; } void init()//初始化 {

LCD1602按键盘输入显示

名称:LCD1602 论坛:https://www.docsj.com/doc/468849124.html, 编写:shifang 日期:2009.5 修改:无 内容:通过矩阵键盘输入,依次显示0-F16中字符 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include sbit RS = P2^4; //定义端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 #define KeyPort P1 unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//转换成液晶显示的字符 /*------------------------------------------------ uS延时函数,含有输入参数unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数,含有输入参数unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编

基于单片机的光电计数器课程设计

计控学院 College of computer and control engineering Qiqihar university 电气工程课程设计报告题目:基于单片机的光电计数器 系别电气工程系 专业班级电气123班 学生姓名宋恺 学号2012024073 指导教师李艳东 提交日期 2015年6月 24日 成绩

电气工程课程设计报告 摘要 光电计数器是利用光电元件制成的自动计数装置。其工作原理是从光源发出的一束平行光照射在光电元件(如光电管、光敏电阻等)上,每当这束光被遮挡一次时,光电元件的工作状态就改变一次,通过放大器可使计数器记下被遮挡的次数。光电计数器的应用范围非常广泛,常用于记录成品数量,例如绕线机线圈匝数的检测、点钞机纸币张数的检测、复印机纸张数量的检测,或展览会参观者人数。 光电计数器与机械计数器相比,具有可靠性高、体积小、技术频率高、能和计算机链接实现自动控制等优点。本文即介绍基于MCS-51单片机的光电技术器。 关键词:单片机;光电计数器;数码显示;自动报警

齐齐哈尔大学计控学院电气工程系课程设计报告 目录 1 设计目的及意义 (1) 2 设计内容 (1) 2.1 系统整体设计 (1) 2.1.1 实验方案 (1) 2.1.2 光电计数器结构框图 (2) 图1 光电计数器结构框图 (2) 2.2系统硬件设计 (2) 2.2.1稳压直流电源电路 (2) 2.2.2发射接收电路 (3) 2.2.3显示电路 (3) 2.2.4报警电路 (4) 2.2.5硬件系统 (4) 2.3系统软件设计 (6) 3 结论7 4 参考文献 (8)

单片机课程设计--1602LCD显示电话拨号键盘按键

单片机课程设计--1602LCD显示电话拨号键盘按键琼州学院电子信息工程学院 课程设计报告 课程名称: 单片机课程设计 设计题目:1602LCD显示电话拨号键盘按键 专业: 通信工程 班级: 2010级1班 学生姓名: *** 学号: 起止日期: 2013年4月,2013年6月 指导教师: 指导教师评语: 最终成绩: 指导教师签名: 年月日成项目权重成绩 绩1、设计过程中的学习态度 0.2 评2、课程设计的质量及答辩 0.5 定 3、设计报告书规范程度 0.3 4、总成绩 目录 1.设计目的 ..................................................... 2 2.设计要求 ..................................................... 2 3.设计方案 .. (2) 3.1单片机最小系统 (2) 3.2输入按键系统 (3) 3.3 1602LCD显示系统 (3)

3.4设计原理图 ............................................... 6 4. 分析与编程 (7) 4.1系统流程图 (7) 4.2 LCD显示程序流程图 (7) 4.3 设计程序 ................................................ 8 5.仿真 ........................................................ 14 6.在实现过程中遇到的问题及排除措施 ............................ 15 7.设计心得体会 ................................................ 16 参考文 献 (16) 1602LCD显示电话拨号键盘按键 摘要:本设计以89C51单片机为核心,设计1602LCD显示电话拨号键盘按键, 对按键输入系统,LCD1602的引脚功能、控制命令、读写时序进行了分析。在keil 中进行编程,在proteus软件中进行了仿真。 关键字:单片机;1602LCD显示屏;键盘系统 1 1.设计目的 单片机原理与应用课程设计是单片机原理与应用专业课程的实践性教学环节,通过该教学环节,要求达到以下目的: (1)培养学生工程设计能力和综合分析问题、解决问题的能力,能根据工程需求,利用Proteus环境等构建原理图,利用Keil等环境编写调试单片机功能程序,最终构建工程的硬件平台和软件平台,达到预定功能,实现单片机具体应用; (2)熟悉在Proteus环境中的ISIS模块原理图绘制,掌握仿真的基本方法; (3)掌握Keil C编程及C51编程语言和汇编语言开发; (4)掌握单片机片内资源编程,能熟练应用相关片内资源合理配置相关寄存器;

lcd1602液晶封装函数

//端口定义 #define DBPort P0 //LCD数据端口 sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sbit Lcdbf = P0^7; //LCD忙标志Busy Flag void delay(unsigned int t) //延时 { while(t--); } void LCD_Wait(void) //读忙状态 { LcdRs=0; LcdRw=1; LcdEn=1;delay(10);LcdEn=0; //下降沿 while(Lcdbf) { LcdEn=0;LcdEn=1; //仿真才需要此语句,实际硬件中不需要} } void LCD_Write(bit style, unsigned char input) //写数据1/命令0 { LcdRs=style; LcdRw=0; DBPort=input; LcdEn=1;delay(10);LcdEn=0; LCD_Wait(); } void LCD_Initial(void) //初始化LCD { LCD_Write(0,0x38); //8位数据端口,2行显示,5*7点阵 delay(300); LCD_Write(0,0x0c); //显示模式 LCD_Write(0,0x01); //清屏 LCD_Write(0,0x06); //输入模式 } void GotoXY(unsigned char x, unsigned char y) //移动光标到指定位置{ if(y==0) LCD_Write(0,0x80|x);

单片机设计 按键顺序控制加减计数(1602 液晶显示) 程序

#include #include #define uchar unsigned char #define uint unsigned int #define LCD_IO P2 sbit KK1 = P3^2; //按键输入; sbit KK2 = P3^3; //按键输入; sbit LCD_RS = P3^5; sbit LCD_RW = P3^6; sbit LCD_EN = P3^7; uchar code LCD_line1[] = " The Counter"; int idata mydata=0; /************************************************************** * 名称: Delay_1ms() * 功能: 延时子程序,延时时间为1ms * x * 输入: x (延时一毫秒的个数) * 输出: 无 ***************************************************************/ void Delay_1ms(uint x) { uchar i, j; for(i = 0; i < x; i++) for(j = 0; j <= 148; j++); } /************************************************************** * 名称: lcd_bz( ) * 功能: 测试忙碌子程序 * 输入: 无 * 输出: result ***************************************************************/ bit lcd_bz() { bit result; LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P3&0x80); LCD_EN = 0; return result; }

51单片机控制1602LCD显示程序

LCD显示电路 #include sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 #define Lcd_Data P0 #include #include //包含_nop_()函数定义的头文件 unsigned char code string1[ ]= {0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符 void Lcd_delay1ms() // 函数功能:延时1ms //注:不同单片机不同晶振需要对此函数进行修改 { unsigned char i,j; for(i=0;i<90;i++) for(j=0;j<33;j++); } void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n { unsigned int i; for(i=0;i

/***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ bit Lcd_BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void Lcd_WriteCom (unsigned char dictate) { while(Lcd_BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x

单片机定时器计数器实验报告

单片机定时器计数器实验报告 篇一:单片机计数器实验报告 计数器实验报告 ㈠实验目的 1. 学习单片机内部定时/计数器的使用和编程方法; 2. 进一步掌握中断处理程序的编程方法。 ㈡实验器材 1. 2. 3. 4. 5. G6W仿真器一台 MCS—51实验板一台 PC机一台电源一台信号发生器一台 ㈢实验内容及要求 8051内部定时计数器,按计数器模式和方式1工作,对 P3.4(T0)引脚进行计数,使用8051的T1作定时器,50ms 中断一次,看T0内每50ms来了多少脉冲,将计数值送显(通过LED发光二极管8421码来表示),1秒后再次测试。 ㈣实验说明 1. 本实验中内部计数器其计数器的作用,外部事件计数器脉冲由P3.4引入 定时器T0。单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变,这就要求被采样电平至少维持一个完整的机器周期,以保证电

平在变化之前即被采样,同时这就决定了输入波形的频率不能超过机器周期频率。 2. 计数脉冲由信号发生器输入(从T0端接入)。 3. 计数值通过发光二极管显示,要求:显示两位,十位用L4~L1的8421 码表示,个位用L8~L5的8421码表示 4. 将脉搏检查模块接入电路中,对脉搏进行计数,计算出每分钟脉搏跳动 次数并显示 ㈤实验框图(见下页) 程序源代码 ORG 00000H LJMP MAIN ORG 001BH AJMP MAIN1 MAIN: MOV SP,#60H MOV TMOD,#15H MOV 20H,#14H MOV TL1,#0B0H MOV TH1,#3CHMOV TL0,#00H ;T0的中断入口地址 ;设置T1做定时器,T0做计数器,都于方式1工作 ;装入中断次数 ;装入计数值低8位 ;装入计数值高8位 MOV TH0,#00H SETB TR1 ;启动定时器T1 SETB TR0 ;启动计数器T0 SETB ET1 ;允许T1中断 SETB EA ;允许CPU中断 SJMP $;

LCD1602显示屏地驱动设置及例程

LCD1602显示屏的驱动设置及例程 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD1602的型号是HJ1602A,是绘晶科 技公司的产品,它有16条引脚。如图1所示: 图1 再来一张它的背面的,如图2所示: 引脚号符号引脚说明引脚号符号引脚说明 1 VSS 电源地9 D 2 数据端口 2 VDD 电源正极10 D 3 数据端口 3 VO 偏压信号11 D 4 数据端口 4 RS 命令/数据12 D 5 数据端口 5 RW 读/写13 D 6 数据端口 6 E 使能14 D 7 数据端口 7 D0 数据端口15 A 背光正极

图3

图4 二.基本操作 LCD1602的基本操作分为四种: 1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。 2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。 3. 写命令:输入RS=0,RW=0,E=高脉冲。输出:无。 4. 写数据:输入RS=1,RW=0,E=高脉冲。输出:无。 读操作时序图(如图5): 图5 写操作时序图(如图6):

图6 时序时间参数(如图7): 图7 三.DDRAM、CGROM和CGRAM DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下(如图8): 图8 DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。同样LCD1602共有80个字节的显存,即DDRAM。但L CD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不

单片机课设频率计数器

_ 等级: 课程名称单片机原理及应用 课题名称频率计数器 专业电子信息工程 班级1302 学号201301030218 姓名许聪 指导老师寻大勇等

2016年3月25日 电气信息学院 课程设计任务书 课题名称频率计数器 姓名许聪专业电子信息班级1302 学号18 指导老师寻大勇 课程设计时间2016年3月14日-2016年3月25日 教研室意见意见:审核人: 一、任务及要求 设计任务: 本课题以单片机为核心,设计和制作一个频率计数器,来完成对输入的信号进行频率计数,计数的频率结果能够显示出来。要求能够对0-250KHz的信号频率进行准确计数,计数误差不超过±1HZ。 设计要求: (1)确定系统设计方案; (2)进行系统的硬件设计; (3)完成应用程序设计; (4) 应用系统的硬件和软件的调试。 二、进度安排 第一周: 周一:集中布置课程设计任务和相关事宜,查资料确定系统总体方案。

周二~周三:完成硬件设计和电路连接 周四~周日:完成软件设计 第二周: 周一~周三:程序调试 周四~周五:设计报告撰写。周五进行答辩和设计结果检查。 三、参考资料 1、王迎旭等.单片机原理及及应用. 2版.机械工业出版社,2012 2、胡汉才.单片机原理及其接口技术.3版.清华大学出版社,2010. 3、戴灿金.51单片机及其C语言程序设计开发实例.清华大学出版社,2010 目录 第1章设计任务及要求 (1) 1.1设计任务 (1) 1.2设计要求 (1) 第2章系统方案设计 (1) 2.1 基本设计原理 (1) 2.2 方案整体框图 (2) 第3章系统硬件电路设计 (2) 3.1 复位电路 (2) 3.2晶振电路 (3) 3.3 LED数码管显示电路 (3) 第4章系统软件设计 (4) 4.1 主程序流程图 (4) 4.2 初始化模块 (5) 4.3 信号频率测量模块 (5) 4.4 数码管显示模块 (5)

LCD1602-51单片机汇编程序

1602汇编程序,51单片机汇编程序,仅需修改引脚定义即可。晶振大小12M,程序测试完全正确。内部包含写数据、写命令(包括读忙和不读忙)、初始化等子函数。调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。 ;端口引脚定义区 LCD_RS BIT P2.4 ;1602数据命令选择端口 LCD_RW BIT P2.5 ;1602读写选择端口 LCD_EN BIT P2.6 ;1602使能端口 LCD_DATA EQU P0 ;1602数据端口 ;变量声明区 ALL_FLAG EQU 20H ;标志位 LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位 LCD_DAT EQU 30H ;1602数据命令字 DELAYED EQU 31H ;延时字 /***************************************** 1602读命令函数,高位存至LCD_LAG中 *****************************************/ LCD_R_DATA: MOV LCD_DATA,#0FFH LCD_BUSY: CLR LCD_RS SETB L CD_RW NOP SETB L CD_EN NOP MOV Acc,LCD_DATA MOV C,Acc.7 MOV LCD_FLAG,C CLR LCD_EN NOP JB LCD_FLAG,LCD_BUSY RET /***************************************** 1602写数据函数,数据存在LCD_DAT *****************************************/ LCD_W_DATA: LCALL LCD_R_DATA SETB L CD_RS CLR LCD_RW NOP MOV LCD_DATA,LCD_DAT

基于MCS51系列单片机实现键盘按键与数字动态显示计数器课程设计..

毕业设计论文 摘要 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而51单片机是各单片机中最为典型和最有代表性的一种。本实验是基于MCS51系列单片机所设计的,可以实现键盘按键与数字动态显示并可以用音乐倒数的计数器。本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个计数器,包括以下功能:输出时间,按下键就开始计时,并将时间显示在LCD1602显示器上。当倒计数为0时,蜂鸣器就发出音乐声响等等。该计数器系统主要由计数器模块、LCD显示器模块、蜂鸣器模块、键盘模块、复位模块等部分组成。 关键词:AT89C51、键盘、LCD1602显示、蜂鸣器

目录 摘要............................................................... I 1 项目概述和要求 (1) 1.1 单片机基础知识 (1) 1.2 单片机的发展趋势 (1) 1.3 项目设计任务与要求 (3) 2 系统设计 (4) 2.1 框图设计 (4) 2.2部分硬件方案论述 (4) 2.3电路原理图 (4) 2.4元件清单 (5) 2.4.1AT89C51芯片 (5) 2.4.2字符型LCD1602 (6) 2.4.3按键控制模块 (8) 2.4.4其它元件 (8) 3软件设计 (9) 3.1 程序流程图 (9) 3.2 程序关键问题的部分代码 (11) 4 系统的仿真与调试 (16) 4.1 硬件调试 (16) 4.2 软件调试 (16) 4.3 软硬件调试 (16) 5总结 (17) 参考文献 (18)

相关文档
相关文档 最新文档