51单片机按键实现00-99加减(自己整理的)
- 格式:doc
- 大小:59.50 KB
- 文档页数:2
实验报告课程名称:单片机原理及应用实验项目:外面中止编程及调试实验专业班级:姓名:学号:实验室号:实验组号:实验时间:批阅时间:指导教师:成绩:1.实验名称外面中止编程及调试实验2.实验目的掌握 Keil uVision3 环境下程序的编写、编译、排错和调试方法。
掌握单步、断点、自动追踪/ 单步、全速履行等各样履行方法。
认识汇编语言的编程方法。
认识中止办理程序的编写方法。
3.实验内容采纳外面中止编写程序,用按键 S1和 S2控制两个数码管从00到 99加计数循环显示( S1加延时去抖,S2不加,比较实验现象)。
在实验板上编程实现,INT0中止读入—开关的状态,且在数码管DS1和DS2 显示,编码表以下所示:4.实验步骤或程序1、设置 STC-ISP,将单片机与其连结。
2、在 Keil上新建工程,并设置对应STC单片机的选项3、右键单击Target,设置Debug选项。
4、增添并编译所编写程序5、点击仿真按钮进入仿真界面程序ORG 0000HLJMP MAINORG 0003HAJMP IN0ORG 0013HAJMP IN1ORG 0100H MAIN:SETB IT0SETB EX0SETB IT1SETB EX1INN:CJNE R0,#9,INN0CJNE R1,#9,INN1MOV R0,#0MOV R1,#0RETIINN1:MOV R0,#0INC R1RETIINN0:INC R0RETIDEL:MOV R6,#20心得领会及建议在此次的单片机上机实验中,我对Keil uVision 3 编译软件更为认识了。
学会了单步、断点、自动追踪 / 单步、全速履行等各样履行方法,能够对程序进行改正,而且能够简单的编写程序,并对编写的程序进行编译与检查。
无建议。
目录前言 (2)一. 总体设计 (3)二.硬件设计 (4)三.软件设计 (6)四.使用Keil进行程序调试,Proteus进行仿真运 (9)五.结束语 (9)六.参考文献 (10)前言单片机的应用介绍单片机全称叫单片微型计算机(Single Chip Microcomputer),是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: 1.在智能仪器仪表上的应用 ,例如精密的测量设备 2.在工业控制中的应用用单片机可以构成形式多样的控制系统、数据采集系统。
例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
3.在家用电器中的应用可从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
一、设计目的1.学习基本理论在实践中综合运用的初步经验,掌握电路设计的基本方法、设计步骤,培养综合设计与调试能力。
2.掌握汇编语言程序设计方法。
3培养实践技能,提高分析和解决实际问题的能力二、设计要求1.上电时,数码管显示为00。
10.00-99计数器1.实验任务利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.7管脚接一个轻触开关,作为手动计数的按钮,用单片机的P2.0-P2.7接一个共阴数码管,作为00-99计数的个位数显示,用单片机的P0.0-P0.7接一个共阴数码管,作为00-99计数的十位数显示;硬件电路图如图19所示。
2.电路原理图图4.10.13.系统板上硬件连线(1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
(2.把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a-h端口上;(3.把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区域中的SP1端口上;4.程序设计内容(1.单片机对按键的识别的过程处理(2.单片机对正确识别的按键进行计数,计数满时,又从零开始计数;(3.单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。
如何拆开十位和个位我们可以把所计得的数值对10求余,即可个位数字,对10整除,即可得到十位数字了。
(4.通过查表方式,分别显示出个位和十位数字。
5.程序框图图4.10.26.汇编源程序Count EQU 30HSP1 BIT P3.7ORG 0START: MOV Count,#00HNEXT: MOV A,CountMOV B,#10DIV ABMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,AMOV A,BMOVC A,@A+DPTRMOV P2,AWT: JNB SP1,WTWAIT: JB SP1,WAITLCALL DELY10MSJB SP1,WAITINC CountMOV A,CountCJNE A,#100,NEXTLJMP STARTDELY10MS: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END7.C语言源程序#include <A T89X51.H>unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Count;void delay10ms(void){unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}void main(void){Count=0;P0=table[Count/10];P2=table[Count%10];while(1){if(P3_7==0){delay10ms();if(P3_7==0){Count++;if(Count==100){Count=0;}P0=table[Count/10];P2=table[Count%10];while(P3_7==0);}}}}开动脑筋,运用多种方法,不断优化自己的程序。
计数器设计 一、实习目的与要求1、设计的目的(1)掌握51系列单片机的基本硬件结构及工作原理。
(2)掌握51系列单片机的汇编语言及基本程序设计方法。
(3)学习并掌握使用51系列单片机开发控制系统的基本步骤及方法。
(4)掌握51系列单片机键盘显示电路的编程方法。
2、设计要求(1)设计十进制0~99的计数器,采用按键计数,数码管显示。
(2)采用按键产生计数值:按下按键,计数值增加1; (3)采用2位数码管显示,计数初值为0;(4)当计数达到99时,再次按下按键,计数值从1开始增加; (5)设计一个按键,用于清空计数值。
二、 总体设计方案1、计数器的基本原理利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.2管脚接一个轻触开关,作为手动计数的按钮。
再利用AT89S51单片机的复位键进行清零处理。
同时51单片机的P1.0-P1.7接共阴数码管的位选,作为0-99计数选择的位置。
用单片机的P0.0-P0.7接共阴数码管的段选,作为00-99计数的显示,总体结构框图如图1-1所示。
图1-12、模块电路分析(1) STC89C51单片机:它是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦1000次的Flash 只读程序存储器,器件采用ATMEL 公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及STC8951引脚结构,芯片内集成了通用8位中央处理器和ISP Flash 存储单元,功电源 键盘AT89S51 单片机数码管显示能强大的微型计算机的STC8951可为许多嵌入式控制应用系统提供高性价比的解方案。
STC8951具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,128bytes 的随机存取数据存储器(RAM),32个外部双向输入输出(I/O)口,5个中断优先级,2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信,片内时钟振荡器。
实现的功能:按下key1键数字加1,按下key2键数字减1,按下key3键数字归零。
并且满足,在不松开按键时,数字会按一定时间间隔持续递增或递减。
数码管显示程序:void display(uchar shu){uchar bai,shi,ge;bai=shu/100;shi=shu/10%10;Ge=shu%10;P2=0x7f;P0=table[ge];delay(5);P2=0xbf;P0=table[shi];delay(5);P2=0xdf;P0=table[bai];delay(5);}这里是利用传送函数,在传送过程中我们传送的是一个值,这个值的百、十、个位,我们在子函数中进行分解。
再通过数组将段码、位码,传送到相应的I/O。
此外还要注意的一点是:这里是动态扫描,不能忘了原理,是一位一位的显示,只是太快了,看不出来,所以在每一个数码管亮之间一定要有10毫秒的延时!!!键盘子程序:void keyscan(){P1=0xff; // P1口赋初值,key_code=P1;//将P1口的状态赋予一个变量,便于以后的检测。
if(key_code!=0xff)//如果条件满足说明有按键被按下。
{for(i=0;i<30;i++)display(shu);//这小段子程序有两个作用:1、不断的扫描显示子程序。
这样就会避免一种现象:按键被按下时,所有的数码管会闪烁,加了这小段程序后给人的感觉是各个数码管是独立的,互不影响,它加他的,我前面几位该不变就不变。
2、还起到延时作用。
switch(key_code)//利用switch可以是程序事半功倍,又好读,应该借鉴。
{case 0xfe://注意格式的书写if(shu<255)shu++;break;//不要忘了case 0xfd:if(shu>0)shu--;break;case 0xfb:shu=0;}key_code=0xff;//这句程序得格外注意,容易丢,为下一次判断Key_code做准备。
51单片机不加锁存器数码管动态显示0-999使用STC89C52RC单片机,数码管为共阳数码管PNP驱动,P3.4-P3.6控制位选,P0口控制段选信号,图中P8接到有上拉电阻的P0口,P9接到P3.4-P3.6,附上图和程序!#include <reg52.h>sbit wei1=P3^6; /*百位*/sbit wei2=P3^4; /*个位*/sbit wei3=P3^5; /*十位*/unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};void delay(int z);unsigned char i=0; //动态扫描的索引unsigned int cnt=0; //记录T0 中断次数void main(){unsigned long sec=0; //记录经过的秒数EA=1; //使能总中断TMOD=0x01; //设置T0 为模式1TH0=0xB8; //为T0 赋初值0xFC67,定时1msTL0=0x00;ET0=1; //使能T0 中断TR0=1; //启动T0while (1){if (cnt>=1000) //判断T0 溢出是否达到1000 次{cnt=0; //达到1000 次后计数值清零sec++; //秒计数自加1}wei1=0;P0=LedChar[sec%10];wei1=1;delay(5);wei2=0;P0=LedChar[sec/10%10];wei2=1;delay(5);wei3=0;P0=LedChar[sec/100%10];wei3=1;delay(5);if(sec>999){sec=0;}}}void delay(int z){int x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}/* 定时器0 中断服务函数*/ void InterruptTimer0() interrupt 1 {TH0 = 0xFC; //重新加载初值TL0 = 0x67;cnt++; //中断次数计数值加1 }。
#include<stc12c5a60s2.h> //STC51单片机头文件#define uchar unsigned char#define uint unsigned intuint key;uchar code numbercode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f}; //用于设置(共阴极)数码管的段选信号,从0~9共10个数值void delay(uint x) //延时{uchar t;while(x--) for(t=0;t<250;t++);}void display(uchar key) //数码管显示{P2=0x06; //在第7个数码管上显示个位P0=numbercode[key]|0x80;delay(10);}void display1(uchar key) //数码管显示{P2=0x00; //在第1个数码管上显示aP0=numbercode[key];delay(10);}void display2(uchar key) //数码管显示{P2=0x05; //在第6个数码管上显示十位P0=numbercode[key];delay(10);}void display3(uchar key) //数码管显示{P2=0x02; //在第3个数码管上显示bP0=numbercode[key];delay(10);}void display4(uchar key) //数码管显示{P2=0x07; //在第8个数码管上显示小数P0=numbercode[key];delay(10);}void main(){uchar key,temp,a,b;int k,k2,k1,k3,k4;while(1){P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xbe:key=0;a=1+a;if(a>9)a=0;break;case 0x7e:key=1;b=1+b;if(b>9)b=0;break;default:break;}delay(1000);}}P1=0xfd ;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;if(temp==0xed){key=4;k=a+b; delay(1000);if(k>=10){ k2=k/10;k1=k%10;k3=0;}if((k>=0)&&(k<10)){k2=0; k1=k;k3=0;}}if(temp==0xdd){key=5;k=a-b;delay(1000);if((k>=0)&&(k<10)){ k2=0; k1=k;k3=0;}if(k<0){P2=0x04;P0=0x40;delay(100);k2=0;k1=-k;k3=0;}}if(temp==0xbd){key=6;k=a*b; delay(1000);if(k>=10){ k2=k/10;k1=k%10;k3=0;}if((k>=0)&&(k<10)){ k2=0; k1=k;k3=0;}}if(temp==0x7d){key=7;k=a/b;k4=a%b; delay(1000);if(k<1){k1=0;k2=0;k3=(a*10)/b;}if((k>=0)&&(k<10)){k1=k;k2=0;if(k4!=0){k3=(a*10)/b;}if(k4==0){k3=0;}}}}display(k1); //个位display2(k2); //十位display1(a); //数1display3(b); //数2display4(k3);}}}。
上面一个按键加,下面一个减
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar i=0,j=0,k=0;
/*void delay_ms(uint x)
{
uchar t;
while(x--)
for(t=0;t<240;t++)
;
}*/
void EX_INT0() interrupt 0
{
i++;
if(i==10)
{
i=0;
k=1;
}
}
void main()
{
P0=0x00;
P1=0x00;
EA=1;
EX0=1;
IT0=1;
while(1)
{
P0=~d_c[i];
P2=~d_c[j];
//i=(i+1)%10;
if(i==0&&k==1)
{
j++;
k=0;
if(j==10)
j=0;
}
//delay_ms(450);
}
}