用51单片机、8255、138、373等实现数码管显示按键数值的程序.(DOC)

合集下载

51单片机数码管显示计算器程序

51单片机数码管显示计算器程序

定义位变量 定义液主函数 *51 单片机数码管显示计算器程序计算器程序#include<reg52.h>#include <intrins.h>#include<string.h> #include <math.h>#include <stdio.h>#define uchar unsigned char #define uint unsigned int ucharkey,sym,sumsz[13],adders=0; // 定义变量float sum,number1=0,number2=0; // 定义变量 bit flag=0; //标志位 sbit lcdrs=P2A 5; // 定义液晶的读 10 口 sbit lcdwr=P2W; // 晶的写I0 口 sbit lcden=P2A7; // 定义液晶的使能I0 口 uchar lcd_s[]={'0','1','2','3','4','5','6','7','8','9','+','-','*',0xfd,'.','='};//void keyscan(); // 函数声明void delayms(uchar z);void write_com(uchar com); void write_data(uchar dat); void init(); void delay(int z); bit buzz(); void yuans();void clear();/***********************void main()init(); // 液晶初始化while(1) // 循环函数keyscan(); // 调用键盘扫描函数键盘扫面*************************/ void keyscan()uchar temp=0;P1=0xfe; // 第1 次判断函数temp=P1;temp=temp&0xf0;if(temp!=0xf0)delayms(15);temp=P1;temp=temp&0xf0;if(temp!=0xf0){ temp=P1;adders++; // 确定按键按下,执行if 函数switch(temp)case 0xee:key=1;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;// 显示字符1,并记入相加的变量case 0xde:key=2;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;// 显示字符2,并记入相加的变量case 0xbe:key=3;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;// 显示字符3,并记入相加的变量case 0x7e: key=10;write_data(lcd_s[key]);sym='+';flag=1; break;// 示‘+'号,并将sym付‘ +'}while((P1&0xf0)!=0xf0); // 等待按键释放}}P1=0xfd; // 第2 次判断temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(15);temp=P1;temp=temp&0xf0;if(temp!=0xf0){ temp=P1;adders++; // 确定按键按下,执行if 函数switch(temp){case 0xed:key=4;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;// 显示字符4,并记入相加的变量case 0xdd:key=5;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;// 显示字符5,并记入相加的变量case 0xbd:key=6;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break; // 显示字符6,并记入相加的变量case 0x7d: key=11;write_data(lcd_s[key]);sym='-';flag=1; break;//示‘-'号,并将sym付‘-'}while((P1&0xf0)!=0xf0);}}P1=0xfb; // 第3 次判断temp=P1;temp=temp&0xf0;if(temp!=0xf0)delayms(15);temp=P1;temp=temp&0xf0;if(temp!=0xf0){ temp=P1;adders++; // 确定按键按下,执行if 函数switch(temp){case 0xeb:key=7;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;// 显示字符7,并记入相加的变量case 0xdb:key=8;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;// 显示字符8,并记入相加的变量case 0xbb:key=9;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break; // 显示字符9,并记入相加的变量case 0x7b: key=12;write_data(lcd_s[key]);sym='*';flag=1; break;//示‘ * '号,并将sym付‘ *'}while((P1&0xf0)!=0xf0); // 等待按键释放}P1=0xf7; // 第4 次判断temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(15);temp=P1;temp=temp&0xf0;if(temp!=0xf0){ temp=P1;adders++; // 确定按键按下,执行if 函数switch(temp){case 0xe7: key=0;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} elsenumber2=number2*10+key;break;// 显示字符0,并记入相加的变量case 0xd7: key=14;clear(); break;// 调用清零函数case 0xb7: key=15;yuans();flag=1;adders--;break;// 调用运算函数case 0x77: key=13;write_data(lcd_s[key]);sym='/';flag=1; break;//示‘/ '号,并将sym付‘ /'}液晶写数据程序 { while((P1&0xf0)!=0xf0); // 等待按键释放液晶****************************/void write_com(uchar com) //液晶写指令程序{while(buzz()) ; lcdrs=0; // lcdwr=0; // lcden=0;P0=com; // _nop_();_nop_();_nop_();_nop_();lcden=1; // _nop_();_nop_();_nop_();_nop_();lcden=0; // void write_data(uchardat) // while(buzz());lcdrs = 1;液晶初始化程序 {lcdwr = 0;lcden = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); lcden = 1; _nop_(); _nop_(); _nop_(); _nop_(); lcden = 0;} void init() // lcden=0; // write_com(0x38); // write_com(0x0c); // write_com(0x06); // write_com(0x01); // } bit buzz() // 液晶测忙程序 { bit b; lcdwr=1; // lcdrs=0; //延时子程序 {延时函数 lcden=1;_nop_();_nop_();_nop_();_nop_();b=(bit)(P&0x80);lcden=0;return b;void delay(int z) // int i;while(z--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}/********************* voiddelayms(uchar z) // 延时毫秒程序 {运算程序uchar i,j;for(i=z;i>0;i--) for(j=110;j>0;j--); }void clear() // 清零程序{ uchar i;for(i=0;i<16;i++) // 对液晶写入空格 { write_com(0x80+i);write_data(' ');}for(i=0;i<15;i++){write_com(0x80+0x40+i);write_data(' ');}write_data('0');write_com(0x80);flag=0;number1=0;number2=0;adders=0; // 将数据变量清零}void yuans() // 运算函数 { uchar i,j,temp1; /*********************** 运算*********************************/ /******************** 清零函数******************************************* */两数相加两数相减两数相乘两数相除 switch(sym){ case '+':number1+=number2;break; // case '-':number1-=number2;break; // case '*':number1*=number2;break; //case '/':number1/=number2;break; // }sprintf(sumsz,"%10.2f",number1); // j=strlen(sumsz); write_com(0x80+0x40+16-j); for(i=0;i<j;i++) // 显示结果 { temp1=sumsz[i];write_data(temp1);delay(10);}number2=0; write_com(0x80+adders-1); }。

运用8255设计的键盘及显示接口-实验报告(含接线图+源程序)

运用8255设计的键盘及显示接口-实验报告(含接线图+源程序)

运用8255设计的键盘及显示接口图中用并行接口8255A作为微机与键盘间的接口,采用逐行扫描法识别键。

将键盘中的列与PA0—PA3相连,A口为输出;将行与C口的PC0—PC1相连,C 口为输入口; PB0—PB7与七段代码显示器连接B口为输出。

程序执行过程如下:识别是否有键按下,方法是使PA0一PA3输出全0,读C 口(行值) 中只要有一位为0,就说明有键按下,在检测到有键按下后,延迟一段时间,根据找到的键号,转去执行显示七段代码显示器的程序,这时七段代码显示器就显示与该键相同的数值。

实验步骤8255接口的应用键盘及显示接线图注:圆圈处是要求接的连线。

(1)按图4接线。

(2)输入源程序,汇编、连接后装入系统。

(3)执行程序后,按一下键盘,7段代码就会显示相应的数字。

程序STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,3000HMOV AL,00HMOV [SI],AL ;清空存放数据的缓冲区MOV [SI+1],ALMOV [SI+2],ALMOV [SI+3],ALMOV DI,3003HMOV AL,81H ;8255方式字定义选择0方式,A口为输出;OUT 63H,AL;B口为输出;C口为输入BEGIN: CALL DIS ;显示七段代码管数据的子程序CALL CLEAR ;七段代码管清0子程序CALL CCSCAN ;检测是否有键按下子程序JNZ INK1 ;JMP BEGININK1: CALL DISCALL DALLY ;子程序为延时,消抖动CALL DALLYCALL CLEARCALL CCSCANJNZ INK2JMP BEGININK2: MOV CH,0FEHMOV CL,00HCOLUM: MOV AL,CHOUT 60H,ALIN AL,62HTEST AL,01HJNZ LONEMOV AL,00HJMP KCODELONE: TEST AL,02HJNZ NEXTMOV AL,04HKCODE: ADD AL,CLCALL PUTBUFPUSH AXKON: CALL DISCALL CLEARCALL CCSCANJNZ KONPOP AX NEXT: INC CLMOV AL,CHTEST AL,08HJZ KERRROL AL,1MOV CH,ALJMP COLUM KERR: JMP BEGIN CCSCAN: MOV AL,00HOUT 60H,ALIN AL,62HNOT ALAND AL,03HRET CLEAR: MOV AL,00HOUT 61H,ALRETDIS: PUSH AXMOV SI,3000HMOV DL,0F7HMOV AL,DLAGAIN: OUT 60H,ALMOV AL,[SI]MOV BX,OFFSET TABLE ;取七段代码首址AND AX,00FFHADD BX,AXMOV AL,[BX]OUT 61H,ALCALL DALLYINC SIMOV AL,DLTEST AL,01HJZ OUTROR AL,1MOV DL,ALJMP AGAINOUT: POP AXRETDALLY: PUSH CXMOV CX,0010HT1: MOV AX,0010HT2: DEC AXJNZ T2LOOP T1POP CXRETPUTBUF: MOV SI,DIMOV [SI],ALDEC DICMP DI,2FFFHJNZ GOBACKMOV DI,3003H GOBACK: RETCODE ENDSEND START。

单片机控制数码管显示1-100程序

单片机控制数码管显示1-100程序

//此函数实现对数码管的控制显示个十百位数#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit duan=P2^6;//七段选择sbit wei=P2^7;//片选,选择哪个数码管uchar aa,bai,shi,ge,temp;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void init();void delay(uint);void display(uchar bai,uchar shi,uchar ge);void main(){init();//调用初始化函数,定时器0初始化,中断开启while(1){if(aa>=20){aa=0;temp++;if(temp==100){ temp=0;}bai=temp/100;//百位shi=temp%100/10;//十位ge=temp%10;//个位}display(bai,shi,ge);}}void delay(uint k){uint i;uchar j;for(i=k;i>0;i--)for(j=110;j>0;j--);}//显示子函数void display(uchar bai,uchar shi,uchar ge){//显示百位duan=1;P0=table[bai];duan=0;P0=0xff; //消影,下一步位选开启时,瞬间传入的是前面的P0值,所以后3个数码管有乱码wei=1;P0=0xfe;//6片全选wei=0;delay(1);//显示十位duan=1;P0=table[shi];duan=0;P0=0xff;//消影,下一步位选开启时,瞬间传入的是前面的P0值,所以后3个数码管有乱码wei=1;P0=0xfd;wei=0;delay(1);//显示个位duan=1;P0=table[ge];duan=0;P0=0xff;//消影,下一步位选开启时,瞬间传入的是前面的P0值,所以后3个数码管有乱码wei=1;P0=0xfb;wei=0;delay(1);}/*void display() {if(aa>=20){aa=0;ge++;duan=1;P0=table[ge];duan=0;wei=1;P0=0xfd;wei=0;if(ge>=10){ge=0;shi++;duan=1;P0=table[shi];duan=0;wei=1;P0=0xfe;wei=0;}if(shi>=6){shi=0;}}}*/void init(){duan=0;wei=0;temp=0;TMOD=0x01;TH0=(65536-50000)/256; //定时器装初值50ms TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0;使TR0置位=1,定时器0开始计数;停止时,使TR0=0复位;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}。

51单片机数码管显示程序设计

51单片机数码管显示程序设计

练习3主程序参考:
ORG 0000H LJMP START ORG 000BH LJMP T0SERV ;T0中断入口 ORG 0030H START: MOV SP,#50H ;初始化堆栈 LCALL INIT ;初始化 MOV DISBUF,#0 MOV DISBUF+1,#1 MOV DISBUF+2,#2 MOV DISBUF+3,#3 MOV DISBUF+4,#4 MOV DISBUF+5,#0 MOV FLASH,#11000000B MOV R0,#0 LOOP: MOV DISBUF+5,R0 LCALL DELAY INC R0 CJNE R0,#10,LOOP MOV R0,#0 AJMP LOOP
恢复现场
返回
动态显示参考程序1:定义变量
;--------------------------------------------------------;动态显示程序 ;--------------------------------------------------------;全局变量定义 FLAG EQU 20H ;标志位 DISSEG EQU P0 ;显示段驱动 DISBIT EQU P2 ;显示位驱动P2.7-P2.2 DISBUF EQU 21H ;显示缓冲区首地址21H-26H DISBITBUF EQU 27H ;当前显示位计数器0-5 FLASH EQU 28H ;闪烁控制xxxxxx00,将x=1闪烁,=0不闪 ;小数点的处理: ;若显示‘3’,缓冲区放‘3’,若显示‘3.’,缓冲区放‘3+80H’, 最高位为1 S_PULSE EQU FLAG.0 ;秒脉冲 CNT_2D5MS EQU 2FH ;2.5MS计数器 CNT_10MS1 EQU 30H ;10MS计数器 CN_0D5S EQU 31H ;0.5秒计数器 ;----------------------------------------------------------

8255控制数码管、单片机程序

8255控制数码管、单片机程序

8255 管脚图下面是8255 管脚设置,具体代码要看原理图中各管脚的连接情况。

reset = 0; 禁止复位cs = 0;wr = 0;//允许CPU将数据或控制字写入8255//A1=1.A0=1;选择.控制寄存器//假设00001111控制D口的数据,从A口输出;11110000控制D口的数据,从B口输出;实际情况由实际管脚连接决定。

d0 = d1=d2= d3=0;d4 = d5=d6=d7 = 1;A1=0;A0=0;选择PA口//pa口--数码管的段选//根据原理图设置pa口各引脚,假设使pa输出00000001控制第1个数码管pa0 = pa1=pa2=pa3=pa4=pa5=pa6= 0;pa7 = 1;A1=0;A0=1;选择PB口//PB口--数码管的位选//根据原理图设置pb口各引脚,假设使pb输出00000001控制数码管显示0 pa0 = pa1=pa2=pa3=pa4=pa5=pa6= 0;pa7 = 1;//=========A1=1.A0=1;选择.控制寄存器//假设00001111控制D口的数据,从A口输出;11110000控制D口的数据,从B口输出;实际情况由实际管脚连接决定。

d0 = d1=d2= d3=1;d4 = d5=d6=d7 = 0;A1=0;A0=0;选择PA口//pa口--数码管的段选//根据原理图设置pa口各引脚,假设使pa输出00000010控制第2个数码管pa0 = pa1=pa2=pa3=pa4=pa5=pa7= 0;pa6 = 1;A1=0;A0=1;选择PB口//PB口--数码管的位选//根据原理图设置pb口各引脚,假设使pb输出00000001控制数码管显示0 pa0 = pa1=pa2=pa3=pa4=pa5=pa6= 0;pa7 = 1;。

用51单片机8255138373等实现数码管显示按键数值的程序DOC

用51单片机8255138373等实现数码管显示按键数值的程序DOC

姓名专业学号2013年10月28日随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。

单片机具有体积小、功能强、应用面广等优点,目前正以前所未见的速度取代着传统电子线路构成的经典系统,蚕食着传统数字电路与模拟电路固有的领地。

它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。

同时,学习使用单片机了解计算机原理与结构的最佳选择。

现在,这种单片机的使用领域已十分广泛。

彩电、冰箱、空调、录像机、VCD、遥控器、游戏机、电饭煲等无处不见单片机的影子,单片机早已深深地融入我们每个人的生活之中。

单片机能大大地提高这些产品的智能性,易用性及节能性等主要性能指标,给我们的生活带来舒适和方便的同时,在工农业生产上也极大地提高了生产效率和产品质量。

单片机按用途大体上可分为两类,一种是通用型单片机,另一种是专用型单片机。

课题要求:用51单片机、8255、138、373等实现数码管显示按键数值的程序各芯片资料:1.8255芯片资料如下用8255A可编程器件扩展并行接口8255: 有三个八位的并行口:PA、PB、PC。

有三种工作方式:方式0,方式1,方式2。

逻辑结构图:包含四个部分:●三个并行数据输入输出端口●两个工作方式控制电路●一个读写逻辑控制电路●八位总线缓冲器⑴.三个并行数据输入输出端口:A口;B口;C口一般,A口,B口作为数据输入输出端口,C口作为控制/状态信息口,可以分为两个部分,分别与A口和B口配合使用,作为控制信息输出或状态信息输入。

⑵.工作方式控制电路工作方式控制电路有两个:A组控制和B组控制电路,A组控制用来控制A口和C口的上半部分PC7——PC4;B组控制用来控制B口和C口的下半部分PC3——PC0;两组控制电路具有一个控制命令寄存器,用来接收来自CPU的数据(控制字),以决定芯片的工作方式,或对C口按位进行清“0”或者置“1”。

51单片机数码管显示及矩阵键盘扫描程序

51单片机数码管显示及矩阵键盘扫描程序

51单片机数码管显示及矩阵键盘扫描程序硬件实验十一八段数码管实验一、实验任务1、在静态数码管上轮流显示数字0-9。

2、在两个4位数码管上动态显示数字0-9二、流程图及程序静态显示:流程图:程序代码:#include#define uchar unsigned chucharcodevalue[10]={0xC0,0xF9,0xA4,0xB0,0X99,0x92,0x82,0xF8,0 x80,0x90};//0 -9数码管显示段码void delay(char x) //延时子程序{uchar i;for(i=0;i<200;i++);}main() //主函数{int i;while(1){for(i=0;i<10;i++) //显示0-9{P0=codevalue[i];delay(500); //延时1秒}}}动态显示:#include#includetab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f}; //数码管显示数字字段unsigned char tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//片选字段unsigned char i,k,j,x;void delay(x); //声明延时子函数void main() //主函数{while(1){for(i=0;i<8;i++) //显示0-7{ P1=tab1[i];P0=tab2[i];delay(5); //延时}P1=tab1[8]; P0=tab2[0]; delay(5); //显示8-9P1=tab1[9]; P0=tab2[1]; delay(5);}}void delay(x) //延时函数定义{do{for(j=0;j<250;j++)for(k=0;k<250;k++);}}硬件实验十二矩阵键盘扫描显示一、实验任务1、把矩阵键盘上的按键输入的键码在静态数码管上显示出来。

利用8255和51单片机实现数码管显示按键值的实验

利用8255和51单片机实现数码管显示按键值的实验

三个附加的控制端、和。当、时,输出为高电平(S=1),译码器处 于工作状态。否则,译码器被禁止,所有的输出端被封锁在高电平, 如表 3.3.5 所示。这三个控制端也叫做“片选”输入端,利用片选的作 用可以将多篇连接起来以扩展译码器的功能。 带控制输入端的译码 器又是一个完整的数据分配器。在图 3.3.8 电路中如果把作为“数据” 输入端(同时),而将作为“地址”输入端,那么从送来的数据只能通 过所指定的一根输出线送出去。这就不难理解为什么把叫做地址输入 了。例如当=101 时,门的输入端除了接至输出端的一个以外全是高 电平,因此的数据以反码的形式从输出,而不会被送到其他任何一个 输出端上。 【例 3.3.2】 试用两片 3 线-8 线译码器 74LS138 组成 4 线-16 线译码器,将输入的 4 位二进制代码译成 16 个独立的低电平 信号。 解:由图 3.3.8 可见,74LS138 仅有 3 个地址输入端。如果 想对 4 位二进制代码,只能利用一个附加控制端(当中的一个)作为 第四个地址输入端。 取第(1)片 74LS138 的和作为它的第四个地 址输入端(同时令),取第(2)片的作为它的第四个地址输入端(同 时令),取两片的、、,并将第(1)片的和接至,将第(2)片的接至, 如图 3.3.9 所示,于是得到两片 74LS138 的输出分别为 图 3.3.9 用 两片 74LS138 接成的 4 线-16 线译码器 式(3.3.8)表明时第(1) 片 74LS138 工作而第(2)片 74LS138 禁止,将的 0000~0111 这 8 个代码译成 8 个低电平信号。而式(3.3.9)表明时,第(2)片 74LS138 工作,第(1)片 74LS138 禁止,将的 1000~1111 这 8 个代码译成 8 个低电平信号。这样就用两个 3 线-8 线译码器扩展成一个 4 线-

利用按键操作数码管显示

利用按键操作数码管显示

利用按键操作数码管显示数码管是一种常见的显示设备,它由许多小型LED灯组成,可以通过按键操作实现不同数字的显示。

下面是一个利用按键操作数码管显示数字的示例程序:```c#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>#define BUTTON_PIN 2Adafruit_7segment display = Adafruit_7segment(;void setupinMode(BUTTON_PIN, INPUT_PULLUP);display.begin(0x70);display.setBrightness(15);void loostatic int number = 0;static int prevButtonState = HIGH;int buttonState = digitalRead(BUTTON_PIN);if (buttonState != prevButtonState && buttonState == LOW)number++;if (number > 9)number = 0;}display.writeDigitNum(0, number, false);display.writeDisplay(;}prevButtonState = buttonState;```这个程序使用`Adafruit_7segment`库来控制数码管显示。

首先,需要在Arduino IDE中安装`Adafruit_GFX`和`Adafruit_LEDBackpack`库。

然后,将数码管的SDA引脚连接到Arduino的A4引脚,SCL引脚连接到A5引脚,还需要将按键连接到2号引脚。

在程序的`setup(`函数中,初始化数码管显示,并设置亮度为最大。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

51单片机并行口驱动LED数码管显示电路及程序

51单片机并行口驱动LED数码管显示电路及程序

51单片机并行口驱动LED数码管显示电路及程序介绍利用51单片机的一个并行口实现多个LED数码管显示的方法,给出了利用此方法设计的多路LED显示系统的硬件电路结构原理图和软件程序流程,同时给出了采用51汇编语言编写程序。

1 硬件电路多位LED显示时,常将所有位的段选线并联在一起,由一个8位I/O口控制,而共阴极点或共阳极点分别由另一个8位I/O口控制;也可采用并行扩展口构成显示电路,通常,需要扩展器件管脚的较多,价格较高。

本文将介绍一种利用单片机的一个并行I/O口实现多个LED显示的简单方法,图1所示是该电路的硬件原理图。

其中,74LS138是3线-8线译码器,74LS164是8位并行输出门控串行输入移位寄存器,LED采用L05F型共阴极数码管。

显示时,其显示数据以串行方式从89C52的P12口输出送往移位寄存器74LS164的A、B端,然后将变成的并行数据从输出端Q0~Q7输出,以控制开关管WT1~WT8的集电极,然后再将输出的LED段选码同时送往数码管LED1~LED8。

位选码由89C52的P14~P16口输出并经译码器74LS138送往开关管Y1~Y8的基极,以对数码管LED1~LED8进行位选控制,这样,8个数码管便以100ms的时间间隔轮流显示。

由于人眼的残留效应,这8个数码管看上去几乎是同时显示。

<51单片机并行口驱动LED数码管显示电路>2 软件编程该系统的软件编程采用MCS-51系列单片机汇编语言完成,并把显示程序作为一个子程序,从而使主程序对其进行方便的调用。

图2所示是其流程图。

具体的程序代码如下:<51单片机并行口驱动LED数码管显示程序>pic单片机驱动led数码管显示程序;*****该程序用于驱动led数码管显示,在8个LED数码管上依次显示数字1、2、3、4、5、6、7、8*******;**** 单片机学习网经典程序已测试,led数码管共阴和共阳不同请修改码值转换表部分LIST P=18F458INCLUDE "P18F458.INC";所用的寄存器XIANR EQU 0X20ORG 0X00GOTO MAINORG 0X30;****************以下为码值转换表******************** CONVERT ADDWF PCL,1RETLW 0XC0 ;0,显示段码与具体的硬件连接有关RETLW 0XF9 ;1RETLW 0XA4 ;2RETLW 0XB0 ;3RETLW 0X99 ;4RETLW 0X92 ;5RETLW 0X82 ;6RETLW 0XD8 ;7RETLW 0X80 ;8RETLW 0X90 ;9RETLW 0X88 ;ARETLW 0X83 ;BRETLW 0XC6 ;CRETLW 0XA1 ;DRETLW 0X86 ;ERETLW 0X8E ;FRETLW 0X7F ;"."RETLW 0XBF ;"-"RETLW 0X89 ;HRETLW 0XFF ;DARKRETURN;**************初始化子程序*****************INITIALBCF TRISA,5 ;置RA5为输出方式,以输出锁存信号BCF TRISC,5BCF TRISC,3 ;设置SCK与SDO为输出方式BCF INTCON,GIE ;关闭所有中断MOVLW 0XC0MOVWF SSPSTAT ;设置SSPSTAT寄存器MOVLW 0X30MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并且时钟下降;沿发送数据,与"74HC595当其SCLK从低到高电平;跳变时,串行输入数据(DI)移入寄存器"的特点相对应MOVLW 0X11 ;显示值寄存器赋初值,每个值占两个字节,MOVWF XIANR ;从8开始显示RETURN ;返回;***************led数码管显示子程序******************;SPI发送显示子模块DISPLAYTRANSMIT CLRF PORTA ;LACK送低电平,为锁存做准备MOVWF SSPBUF ;启动发送WAITBTFSS PIR1,SSPIFGOTO WAIT ;等待发送结束BCF PIR1,SSPIF ;清除中断标志NOPBSF PORTA,5 ;最后给一个锁存信号,代表一显示任务完成RETURN;*****************pic单片机驱动led显示程序的主程序开始*************** MAIN NOPCALL INITIAL ;调用系统初始化子程序LOOP MOVF XIANR,WCALL CONVERT ;查出XIANR的显示段码值CALL DISPLAYDECF XIANRDECF XIANR ;显示值减2,因为按字存放,按字节读取MOVF XIANR,WSUBLW 0X01BTFSS STATUS,ZGOTO LOOP ;若送完显示的数,则退出显示HERE GOTO HEREENDC语言源程序如下:/*************************************************程序名称:8位数码管移位显示0-F简要说明:使用共阳型数码管P0口输出数码管段码,P2口输出数码管位码编写:时间:2008-8-21*************************************************/#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define duan P0 //定义段码输出#define wei P2 //定义位码输出uchar a=0,b=0; //全局变量。

数码管显示按键键号实验 单片机实验报告

数码管显示按键键号实验 单片机实验报告

数码管显示按键键号实验单片机实验报告数码管显示按键键号实验一.实验目的1.熟悉数码管的功能和使用。

2.熟悉延时子程序的编写和使用。

3.熟悉独立按键的使用和编程方法。

二.实验仪器计算机、Keil 编程环境、普中下载软件、单片机开发实验仪。

三.实验原理与内容P0 口做输出口,接一个共阳极数码管,要求循环显示。

共阳极数码管字形表同上一实验。

独立按键为 K1;K8 接 P2 口。

四 .实验线路及原理五五 .注意事项 1.安装实验仪时,先接通讯串口线,再开电源开关。

2.实验过程中,在进行接插线操作时,必须先关闭电源。

六 .实验步骤1、主机连线说明:JP10单片机 0 P0 口(8 8 位)JP3共阳极数码管JP11单片机 2 P2 口(8 8 位)JP58 8 个独立按键七 .实验步骤1.打开 Keil 编程软件编写程序,并进行汇编产生 HE_ 文件。

(1)流程图(2)源程序ORG 0000HLJMP MAIN; 初始地址 0000H 跳转 MAI 程序 ORG 0030HMAIN:MOV SP,#60H; 赋值 SP=60H MOV A,P2;A=P2 CJNE A,#0FFH,LP3 ;ane;FFH 跳转 LP3LJMP LP1; 跳转 LP1 LP2:LCALL DEY10; 调用 DEY10 延时子程序MOV A,P2; 赋值 A=P2 CJNE A,#0FFH,LP3 ;Ane;FFH 时跳转 LP3 LJMP LP1; 跳转 LP1 LP3:MOV R3,#1;R3=1MOV R2,#8;R2=8 LP4:RRC A;A 带进位循环右移JNC LP5; 无进位跳转 LP5 INC R3;R3 加一 DJNZ R2,LP4;R2 减一ne;0 转跳转 LP4 LJMP LP1; 跳转 LP1 LP5:MOV A,P2;A=P2CJNE A,#0FFH,LP5 ;Ane;FFH 跳转 LCALL DISPLAY ; 调用LP1:LJMP MAIN; 跳转 DISPLAY:MOV A,R3 MOV DPTR,#500H ; 将数组首地址赋给数据指针寄存器 MOVC A,@A+DPTR ; 根据 R3 的值取第几个数据 MOV P0,A ;P0=A RET DEY10: MOV R6,#20__MOV R7,#0 DEY11: DJNZR7,DEY11DJNZR6,DEY11; 执行256 _____20__次后返回调用处RETdey1: MOV R5,#40DEYY1:LCALL DEY10; 调用延时子程序 DEY10DJNZ R5,DEYY1;256 _____20__ _____40RET; 返回调用处ORG 500H; 数组从 500H 开始存储 TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH END 2.点击普中下载软件,检查设置是否正确,然后下载到实验仪的单片机中。

51单片机驱动8位数码管电路图+程序

51单片机驱动8位数码管电路图+程序

51单片机驱动8位数码管电路图+程序电路图:JP10排线连接J12 J21跳线跳12处测试程序#include<reg52.h>typedef unsigned char BYTE;typedef unsigned int WORD;sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制//此表为 LED 的字模, 共阴数码管 0-9 -BYTE code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};WORD LedOut[10];//数码管数组/************************************************************** **************** 延时程序 **************************************************************** *************/void Delay(WORD n){WORD x;while (n--){x = 250;while (x--);}}/************************************************************** **************** 显示函数 **************************************************************** *************/void display(WORD num){WORD i,LedNumVal ;LedNumVal=num;LedOut[0]=Disp_T ab[LedNumVal%100000/10000]; //万位LedOut[1]=Disp_T ab[LedNumVal%10000/1000]; //千位LedOut[2]=Disp_T ab[LedNumVal%1000/100]; //百位LedOut[3]=Disp_T ab[LedNumVal%100/10]; //十位LedOut[4]=Disp_T ab[LedNumVal%10]; //个位LedOut[5]=Disp_T ab[LedNumVal%1000/100]|0x80; //百位带小数点LedOut[6]=Disp_T ab[LedNumVal%100/10]; //十位LedOut[7]=Disp_T ab[LedNumVal%10]; //个位for( i=0; i<8; i++) //实现8位动态扫描循环{P0 = LedOut[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选也可以是用查表的方式{case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}Delay(1);}}main(){while(1){display(12345);}}。

51单片机数码管的程序代码

51单片机数码管的程序代码
for (x=s;x>0;x--) for (y=100;y>0;y--);
}
3.依次流水作业
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit line= P1^3; //点阵
sbit led= P1^2;
duan=1; P0=table[shi]; _nop_();
//显示十位
_nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xFb; wei=0; delay(3);
duan=1; P0=table[ge]; _nop_(); _nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xF7; wei=0; delay(3);
unsigned char code weisn[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint y,s,a,b;
void delay ( uint);
void main ()
{
P0=0X00;
line=0;//关闭点阵
P0=0xff; led=0;//关闭 led
5,DS18B20 温度计程序代码
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^4; //18B20 信号端口 sbit duan=P1^0; //数码管段码控制端

51单片机数码管动态显示程序

51单片机数码管动态显示程序

单片机数码管动态显示程序实验,数码管显示一般分静态显示及动态显示两种驱动方式,静态显示占用口线比较多,本文介绍的是如何实现数码管动态显示,应该说数码管动态显示是单片机外部指令输出的重要途径,因此如何设计数码管以及数码管的工作原理、数码管显示的方法、数码管显示的抗干扰设计等在单片机系统设计中占有重要地位。

这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种数码管动态显示的工作原理与读取方式。

s1 bit p0.0 ;数码管位定义s2 bit p0.1s3 bit p0.2s4 bit p0.3s5 bit p0.4s6 bit p0.5s7 bit p0.6s8 bit p0.7led_data equ p2 ;数码管数据定义org 00h ;程序开始jmp main ;主程序开始处org 030h ;主程序从30H开始main: MOV sp,#30h ;设置堆栈lcall rest ;调用初始化程序lcall pro_8led ;调用数码管显示程序jmp main ;返回********* 初始化程序 **************rest:MOV a,#00h ;清寄存器MOV b,#00h ;清寄存器MOV p0,#0 ;禁止数码管显示MOV p2,#255 ;MOV p1,0ffh ;禁止LED显示clr beep ;禁止蜂鸣器ret ;返回******** 数码管显示程序 *************** pro_8led:MOV b,#32 ;一共显示32个数字clr psw.3 ;重新设置寄存器组setb psw.4 ;MOV r0,#00h ;数据显示从0开始MOV r1,#01h ;数码管从第1个开始loop:MOV p0,r1 ;点亮当前数码管MOV a,r0 ;准备第一个数据MOV dptr,#tab_nu ;获得表头MOVc a,@a+dptr ;得到第一个数据MOV led_data,a ;输出到显示数据口lcall delay ;500 ms 延时lcall delay ;1 s 延时inc r0 ;准备下一个数据MOV a,r1 ;准备下一位数码管rlc a ;设置下一个数码管jc c1 ;8位全部显示,转移MOV r1,a ;否则,设置下一位djnz b,loop ;32个数没有显示完,返回显示ret ;否则返回主程序c1: MOV r1,#1 ;8位显示完,重新开始循环clr c ;设置显示位djnz b,loop ;32位显示完则返回重新显示ret ;否则返回到主程序************* 数码管显示 ******************************* ************* 软件延时 500ms ***************************** delay: push psw ;保存原来的寄存器内容clr psw.3 ;clr psw.4 ;设置新的寄存器组MOV r0,#2 ;延时参数1MOV r1,#250 ;延时参数2MOV r2,#2 ;延时参数3dl1:djnz r0,dl1 ;延时循环1MOV r0,#250 ;dl2:djnz r1,dl1 ;延时循环2MOV r0,#240 ;MOV r1,#248 ;dl3:djnz r2,dl1 ;延时循环3nop ;定时精度调整pop psw ;恢复原来的寄存器ret ;返回********************************************************************************************************************这是数字显示表格,其中带小数点的数字比不带小数点的数字大16比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推tab_nu:db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ;数字0-7 不带小数点代码db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ;数字8-f 不带小数点代码db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ;数字0-7 带小数点代码db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ;数字8-f 带小数点代码。

单片机实验键盘显示

单片机实验键盘显示

实验七8255 键盘显示实验【实验目的】1.熟悉8255与单片机的接线和I/O编程方法;2.熟悉数码管的显示原理与编程;3.熟悉8255扫描键盘与读取键值的编程。

【实验内容】使用单片机、8255模块和数码管显示电路,编程实现在数码管上从右至左显示0-5,当有键按下时在数码管最右1位显示按键的键码。

【实验原理与设计】1.硬件电路设计本次实验使用实验箱上的E1、E3和F6模块电路。

如图7.1所示。

E1E3F6图7.1 实验箱(1)8255模块(E3区)PA口作为位扫描口(键扫描口),PB口输出字形码,PC口作为键值读入口,与数码管显示电路和矩阵键盘模块电路(F6区)相应接口连接,8255的数据总线D0-D7、读(/RD)、写(/WR)、端口选择A0、A1和片选/CS已和单片机接好。

各端口地址如下:PA口:0FF28H;PB口:0FF29H;PC口:0FF2AH;控制口:0FF2BH单片机与8255模块电路连接图如图7.2所示。

图7.2 单片机与8255的电路连接(2)数码管显示电路(F6区)实验箱上提供的数码管显示电路如图7.3所示。

实验时需将数码管显示电路中的JLED与8255的PB口相连,JS与8255的PA口相连,JLED和JS分别位于E6区,同时E6区SW3、SW4和SW4红色拨码开关打在“OFF”位置。

图7.3数码管模块连接电路(3)矩阵键盘模块电路(F6区)实验箱上提供的矩阵键盘模块电路如图7.4所示,实验时将该电路中的JR(位于E6区)与8255的PC口相连。

图7.4矩阵键盘模块电路2.程序设计根据实验内容程序主流程图如图7.5所示。

图7.5 主程序流程图(1)初始化MOV A, #81H ;PA口(位扫描口)和PB口(字形码)做输出,PC口(键扫描口)做输入MOV DPTR, #0FF2BH ;实验箱接线决定8255的控制口地址为FF2BHMOVX @DPTR, A ;将命令字82H送给8255控制口确定各口工作方式(2)显示数据子程序显示数据子程序流程图如图7.6所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

姓名专业学号2013年10月28日随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。

单片机具有体积小、功能强、应用面广等优点,目前正以前所未见的速度取代着传统电子线路构成的经典系统,蚕食着传统数字电路与模拟电路固有的领地。

它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。

同时,学习使用单片机了解计算机原理与结构的最佳选择。

现在,这种单片机的使用领域已十分广泛。

彩电、冰箱、空调、录像机、VCD、遥控器、游戏机、电饭煲等无处不见单片机的影子,单片机早已深深地融入我们每个人的生活之中。

单片机能大大地提高这些产品的智能性,易用性及节能性等主要性能指标,给我们的生活带来舒适和方便的同时,在工农业生产上也极大地提高了生产效率和产品质量。

单片机按用途大体上可分为两类,一种是通用型单片机,另一种是专用型单片机。

课题要求:用51单片机、8255、138、373等实现数码管显示按键数值的程序各芯片资料:1.8255芯片资料如下用8255A可编程器件扩展并行接口8255: 有三个八位的并行口:PA、PB、PC。

有三种工作方式:方式0,方式1,方式2。

逻辑结构图:包含四个部分:●三个并行数据输入输出端口●两个工作方式控制电路●一个读写逻辑控制电路●八位总线缓冲器⑴.三个并行数据输入输出端口:A口;B口;C口一般,A口,B口作为数据输入输出端口,C口作为控制/状态信息口,可以分为两个部分,分别与A口和B口配合使用,作为控制信息输出或状态信息输入。

⑵.工作方式控制电路工作方式控制电路有两个:A组控制和B组控制电路,A组控制用来控制A口和C口的上半部分PC7——PC4;B组控制用来控制B口和C口的下半部分PC3——PC0;两组控制电路具有一个控制命令寄存器,用来接收来自CPU的数据(控制字),以决定芯片的工作方式,或对C口按位进行清“0”或者置“1”。

⑶.总线缓冲器三态双向八位缓冲器,作为微处理器数据总线与8255之间的接口,用来传送命令、数据及状态信息。

⑷.读写逻辑控制电路读写逻辑控制电路接受CPU来的控制信号:读、写、地址及复位信息,根据控制信号的要求,将数据读出,送往CPU,或者将CPU来的信息写入端口。

引脚说明:CS:片选信号,低电平有效,表示芯片被选中;RD:读操作,低电平有效,控制数据读出;WE:写操作,低电平有效,控制数据写入;A1,A0:地址线, 端口选择信号,用来选择8255内部端口:RESET:复位信号,高电平有效,各端口被置成输入;D7—D0:双向三态数据线;PA7——PA0:A口输入输出线;PB7—PB0:B口输入输出线;PC7——PC0:C口输入输出线;3.工作方式选择——工作方式控制字8255有三种工作方式:方式0,方式1,方式2。

其中方式2只对A口。

8255的工作方式是由工作方式控制字决定,工作方式控制字是由CPU写入。

8255方式控制字定义如下:D7=1:命令控制字有效。

当D7=0,通过控制口对C口进行位操作。

C口具有位操作功能,通过工作方式控制字可以将PC7——PC0 中任意一位置1或清0D7 D6 D5 D4 D3 D2 D1 D0D7=0 对C口操作,D6 D5 D4 无效,D3 D2 D1:位选择0 0 0 PC00 0 1 PC10 1 0 PC20 1 1 PC31 0 0 PC41 0 1 PC51 1 0 PC61 1 1 PC7D0=0:清0 ;0=1:置1⑴.工作方式0:基本输入输出方式三个端口都可以设置成输入或输出方式:●具有两个八位端口:A口和B口●具有两个四位端口:PC0——PC3,PC4——PC7●任一端口都可设置为输入或输出●数据输出带锁存,输入时不锁存此时,8255可以工作在无条件传送;也可以查询式传送,C口作为联络信号⑵.工作方式1:选通式输入/输出方式有固定的选通信号,选通信号与数据一齐传送,由选通信号表示数据传送的状态:●三个端口分为两组:A组和B组●每组包括一个八位数据端口和一个四位的控制状态端口●每个八位数据端口均可设置为输入或输出,输入输出均带锁存●四位端口作为八位端口的控制/状态联络信号2. 51芯片资料Vcc40电源端GND20接地端*工作电压为5V,另有AT89LV51工作电压则是2.7-6V, 引脚功能一样。

2.外接晶体引脚图2-2外接晶体引脚XTAL119XTAL218XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。

内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。

晶振的频率可以在1MHz-24MHz内选择。

电容取30PF左右。

*型号同样为AT89C51的芯片,在其后面还有频率编号,有12,16,20,24MHz可选。

大家在购买和选用时要注意了。

如AT89C51 24PC就是最高振荡频率为24MHz,40P6封装的普通商用芯片。

3.复位RST9在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。

复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。

当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。

常用的复位电路如图2-3所示。

*复位操作不会对内部RAM有所影响。

图2-3常用复位电路4.输入输出引脚(1) P0端口[P0.0-P0.7] P0是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端。

作为输出口时能驱动8个TTL。

对内部Flash程序存储器编程时,接收指令字节;校验程序时输出指令字节,要求外接上拉电阻。

在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,访问期间内部的上拉电阻起作用。

(2) P1端口[P1.0-P1.7] P1是一个带有内部上拉电阻的8位双向I/0端口。

输出时可驱动4个TTL。

端口置1时,内部上拉电阻将端口拉到高电平,作输入用。

对内部Flash程序存储器编程时,接收低8位地址信息。

(3) P2端口[P2.0-P2.7] P2是一个带有内部上拉电阻的8位双向I/0端口。

输出时可驱动4个TTL。

端口置1时,内部上拉电阻将端口拉到高电平,作输入用。

对内部Flash程序存储器编程时,接收高8位地址和控制信息。

在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。

而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。

(4) P3端口[P3.0-P3.7] P2是一个带有内部上拉电阻的8位双向I/0端口。

输出时可驱动4个TTL。

端口置1时,内部上拉电阻将端口拉到高电平,作输入用。

对内部Flash程序存储器编程时,接控制信息。

除此之外P3端口还用于一些专门功能,具体请看表2-2.。

*P1-3端口在做输入使用时,因内部有上接电阻,被外部拉低的引脚会输出一定的电流。

表2-2P3端口引脚兼用功能表呼!一口气说了那么多,停一下吧。

嗯,什么?什么叫上拉电阻?上拉电阻简单来说就是把电平拉高,通常用4.7-10K的电阻接到Vcc电源,下拉电阻则是把电平拉低,电阻接到GND 地线上。

具体说明也不是这里要讨论的,接下来还是接着看其它的引脚功能吧。

5.其它的控制或复用引脚(1) ALE/PROG 30 访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。

即使不访问外部存储器,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6)。

在访问外部数据存储器时,出现一个ALE脉冲。

对Flash存储器编程时,这个引脚用于输入编程脉冲PROG(2) PSEN 29 该引是外部程序存储器的选通信号输出端。

当AT89C51由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲即两次有效。

但访问外部数据存储器时,将不会有脉冲输出。

(3) EA/Vpp 31 外部访问允许端。

当该引脚访问外部程序存储器时,应输入低电平。

要使AT89C51只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。

对Flash存储器编程时,用于施加Vpp编程电压。

Vpp电压有两种,类似芯片最大频率值要根据附加的编号或芯片内的特征字决定。

具体如表2-3所列。

表2-3Vpp与芯片型号和片内特征字的关系看到这您对AT89C51引脚的功能应该有了一定的了解了,引脚在编程和校验时的时序我们在这里就不做详细的探讨,通常情况下我们也没有必要去撑握它,除非你想自己开发编程器。

下来的课程我们要开始以一些简单的实例来讲述C程序的语法和编写方法技巧,中间穿插相关的硬件知识如串口,中断的用法等等。

成HEX文件和最小化系统在开始C语言的主要内容时,我们先来看看如何用KEIL uVISION2来编译生成用于烧写芯片的HEX文件。

HEX文件格式是Intel公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用16进制数字表示, 常用来保存单片机或其他处理器的目标程序代码。

它保存物理程序存储区中的目标代码映象。

一般的编程器都支持这种格式。

我们先来打开第一课做的第一项目,打开它的所在目录,找到test.Uv2的文件就可以打开先前的项目了。

然后右击图3-1中的1项目文件夹,弹出项目功能菜单,选Options for Target'Target1',弹出项目选项设置窗口,同样先选中项目文件夹图标,这时在Project 菜单中也有一样的菜单可选。

打开项目选项窗口,转到Output 选项页图3-2所示,图中1是选择编译输出的路径,2是设置编译输出生成的文件名,3则是决定是否要创建HEX文件,选中它就可以输出HEX文件到指定的路径中。

选好了?好,我们再将它重新编译一次,很快在编译信息窗口中就显示HEX文件创建到指定的路径中了,如图3-3。

这样我们就可用自己的编程器所附带的软件去读取并烧到芯片了,再用实验板看结果,至于编程器或仿真器品种繁多具体方法就看它的说明书了,这里也不做讨论。

3. 74HC138芯片资料如下:74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL (LSTTL)系列。

74HC138译码器可接受3位二进制加权地址输入(A0, A1和A3),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。

74HC138特有3个使能输入端:两个低有效(E1和E2)和一个高有效(E3)。

除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高。

相关文档
最新文档