第3章 AT89C51单片机的硬件仿真
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 AT89C51单片机的硬件仿真
09DQ3
第3章 AT89C51单片机的硬件仿真
09DQ3
第3章 AT89C51单片机的硬件仿真
3.1 发光二极管的应用 3.1.1 程序流程图 3.1.2 汇编语言源程序 3.1.3 C语言源程序 3.1.4 发光二极管的应用仿真效果图 3.2 数码管显示的应用 3.2.1 静态扫描显示 3.2.2 动态扫描显示 3.3 键盘的应用 3.3.1 独立式键盘的应用 3.3.2 行列式键盘的应用 3.4 简单I/O接口的应用 3.4.1 程序流程图
图3-7 独立式键盘的应用程序流程图
09DQ3
2.汇编语言源程序
•ORG 0000H •LJMPMAIN •ORG0030H • MAIN:MOVP3,#00H • L1:MOVR3,#0F7H;键盘行扫描的初值 •MOVR1,#00H;TABLE2的取码指针 • L2:MOVA,R3 •MOVP2,A •DJNZR7,D2 • D3:MOVA,P2;读入的键盘值是否与R4相等 •XRLA,R4 •JZD3;按键松开否 •MOVA,R1 •MOVDPTR,#TABLE2 •MOVCA,@A+DPTR;取键值 •MOVP3,A •JMPL1 • TABLE2:DB4FH,5BH,06H,3FH,07H,7DH,6DH,66H •DB7CH,77H,6FH,7FH,71H,79H,5EH,39H •END
at89c51单片机的硬件仿真09dq3at89c51单片机的硬件仿真09dq3at89c51单片机的硬件仿真31发光二极管的应用311程序流程图312汇编语言源程序313c语言源程序314发光二极管的应用仿真效果图32数码管显示的应用321静态扫描显示322劢态扫描显示33键盘的应用331独立式键盘的应用332行列式键盘的应用34简单io接口的应用341程序流程图09dq3at89c51单片机的硬件仿真342汇编语言源程序343c语言源程序344简单io接口的应用仿真效果图35定时器的应用351程序流程图352汇编语言源程序353c语言源程序354定时器的应用仿真效果图36串行口的应用361串行口的基本应用362采用串行口扩展并行输入口37中断的应用371程序流程图09dq3at89c51单片机的硬件仿真372汇编语言源程序373c语言源程序374中断的应用仿真效果图09dq331发光二极管的应用311程序流程图312汇编语言源程序313c语言源程序314发光二极管的应用仿真效果图09dq3311程序流程图图31发光二极管的应用程序流程图09dq3312汇编语言源程序?org0000h?ljmpmain?org0030h?main
09DQ3
第3章 AT89C51单片机的硬件仿真
3.4.2 汇编语言源程序 3.4.3 C语言源程序 3.4.4 简单I/O接口的应用仿真效果图 3.5 定时器的应用 3.5.1 程序流程图 3.5.2 汇编语言源程序 3.5.3 C语言源程序 3.5.4 定时器的应用仿真效果图 3.6 串行口的应用 3.6.1 串行口的基本应用 3.6.2 采用串行口扩展并行输入口 3.7 中断的应用 3.7.1 程序流程图
• #include<reg51.h> • #include<stdio.h> • #define u char unsigned char • #define uint unsigned int • char code seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; • sbit key=P2^7;∥设键码 • void main() • { • u char i=0,x; • uint j=50; • P0=0x3F; • while(1) • { • P0=0x3F; •
09DQ3
3.C语言源程序
•#include<reg51.h> • #include<intrins.h> • #include<absacc.h> • #define uchar unsigned char • #define uint unsigned int • uchar code a[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F, •0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; • void delay(uint i) ∥延时程序 • {uint j; • for (j=0;j<i;j++); • } • uchar checkkey()∥检测有没有键按下 • {uchar i; •uchar j; •j=0x0F; •P2=j; •i=P2; •i=i&0x0F; •if (i==0x0F)return(0); • else return(0xFF);
09DQ3
2.汇编语言源程序
•PLAY2INCR6;查表求位码子程序 •MOVA,R6 •MOVDPTR,#TABLE2 •MOVCA,@A+DPTR •MOVP1,A •RET •TABLE:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,0FFH •TABLE2:DB01H,02H,04H,08H,10H,20H,40H,80H •DELAY:MOVR5,#02H;延时子程序 •C1:MOVR4,#0FFH •DJNZR4, •DJNZR5,C1 •RET •END
图3-3 静态扫描显示 的程序流程图
09DQ3
2.汇编语言源程序
• KEY BIT P2.7 •ORG0000H •LJMPMAIN •ORG0030H • MAIN:MOVP0,#3FH;显示零 •MOVR0,#0 •MOVDPTR,#TABLE;表首地址送DPTR • BB:JBKEY,;查键是否按下 •LCALLDELAY •JBKEY, •INCR0 •MOVA,R0 •MOVCA,@A+DPTR;取段码送累加器A •MOVP0,A;输出显示 •MOVA,R0 •LCALLDELAY •CJNEA,#0AH,BB •MOVR0,A •SJMPMAIN ;设键码
09DQ3
3.1.3 C语言源程序
• #include <intrins.h> • #define u char unsigned char • void delayms (uchar ms); ∥延时毫秒@12MHz,ms最大值255 • void main() • { • u char led;∥为P1口赋值的变量 • u char i;∥循环控制变量 • while(1) • { • led=0xFE;∥初值为11111110 • for (i=0;i<7;i++) • { • P1=led ; ∥led值送入P1口 • delayms(100);∥延时100ms • led=crol(led,1);∥led值循环左移1位 • }
09DQ3
3.1.4 发光二极管的应用仿真效果图
图3-2 发光二极管的应用仿真效果图
09DQ3
3.2 数码管显示的应用
3.2.1 静态扫描显示 3.2.2 动态扫描显示
09DQ3
3.2.1 静态扫描显示
1.程序流程图 2.汇编语言源程序 3.C语言源程序 4.静态扫描显示仿真效果图
09DQ3
1.程序流程图
∥设段码
09DQ3
3.C语言源程序
• • • • • • • • • • • • • while(1) { if (key==0) { while (j--); x=s e g[i];∥取段码 i=i+1; P0=x; if (i>9) i=0; } } }
09DQ3
4.静态扫描显示仿真效果图
图3-4 静态扫描显示仿真效果图
;段码表 ;位码表
09DQ3
3.C语言源程序
• #include<reg51.h> • #include<intrins.h> ∥包含crol() • void delayms(unsigned char ms);∥延时子程序 • unsigned char data disdigit;∥位选通值,传送到P1口用于选通当前数码 •∥管的数值,如等于0x01时,选通P1.0口数 •∥码管 • unsigned char code discode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0xFF}; •∥0,1,2,3,4,5,6,7,8,9,off • unsigned char data disindex;∥用于标识当前显示的数码管和缓冲区的偏 •∥移量 • void main() • { • P2=0xFF;∥关闭所有数码管 • P1=0x00; • disindex=0;∥当前偏移量为0 • disdigit=0x01;∥选通P1.0 • while(1) • { •
09DQ3
3.1.3 C语言源程序
• for (i=0;i<7;i++) • { • P1=led ; ∥led值送入P1口 • delayms(100);∥延时100ms • led=cror(led,1);∥led值循环左移1位 • } • } • } • void delayms (uchar ms)∥延时毫秒@12MHz,最大值255ms • } • } • } • void delayms (uchar ms)∥延时毫秒@12MHz,最大值255ms • { uchar i; •While (ms--) •For (i=0;i<124;i++); • }
09DQ3
4.动态扫描显示仿真效果图
图3-6 动态扫描显示的仿真效果图
09DQ3
3.3 键盘的应用
3.3.1 独立式键盘的应用 3.3.2 行列式键盘的应用
பைடு நூலகம்
09DQ3
3.3.1 独立式键盘的应用
1.程序流程图 2.汇编语言源程序 3.C语言源程序 4.独立式键盘的应用仿真效果图
09DQ3
1.程序流程图
09DQ3
2.汇编语言源程序
•TABLE:DB3FH,06H,5BH,4FH,66H;段码地址表 •DB6DH,7DH,07H,7FH,6FH •DELAY:MOVR5,#0A0H;延时 •C1:MOVR6,#0A0H •DJNZR6, •DJNZR5,C1 •RET •END
09DQ3
3.C语言源程序
图3-1 发光二极管的应用程序流程图
09DQ3
3.1.2 汇编语言源程序
•ORG 0000H •LJMPMAIN •ORG0030H •MAIN:MOVA,#0FEH;初值11111110送入A •MOV30H,#7;30H单元作计数器,初始值为左移次数 •LEFT:MOVP1,A;A送入P1口(初始点亮P1.0) •LCALLDELAY;延时 •RLA;循环左移 •DJNZ30H,LEFT;未够7次继续左移 •MOV30H,#7;重置计数器,为右移次数 •RIGHT:MOVP1,A;A送入P1口 •LCALLDELAY;延时 •RRA;循环右移 •DJNZ30H,RIGHT;未够7次继续右移 •AJMPMAIN •DELAY:MOVR5,#195;延时 •C1:MOVR6,#255 •DJNZR6, •DJNZR5,C1 •RET •END
09DQ3
3.C语言源程序
•P2=discode[disindex];∥段码送P2口 •P1=disdigit;∥位码送P1口 •delayms(1); •P1=0x00; •disdigit=crol(disdigit,1);∥位选通左移,下次选通下一位 •disindex++; •disindex &=0x07; • } • } • void delayms(unsigned char ms)∥延时子程序(晶振12MHz) • { • unsigned char i; • while(ms--) • { • for(i=0;i<120;i++); • while(ms--) • { • for(i=0;i<120;i++); • } • }
09DQ3
第3章 AT89C51单片机的硬件仿真
3.7.2 汇编语言源程序 3.7.3 C语言源程序 3.7.4 中断的应用仿真效果图
09DQ3
3.1 发光二极管的应用
3.1.1 程序流程图 3.1.2 汇编语言源程序 3.1.3 C语言源程序 3.1.4 发光二极管的应用仿真效果图
09DQ3
3.1.1 程序流程图
09DQ3
3.2.2 动态扫描显示
1.程序流程图 2.汇编语言源程序 3.C语言源程序 4.动态扫描显示仿真效果图
09DQ3
1.程序流程图
图3-5 动态扫描显示程序流程图
09DQ3
2.汇编语言源程序
• ORG 0000H •LJMPMAIN •ORG0030H • MAIN:MOVR7,#0FFH;置初值 •MOVR6,#0FFH • LOOP:LCALLPLAY1;调用显示段码子程序 •LCALLPLAY2;调用显示位码子程序 •LCALLDELAY •MOVP1,#00H •CJNEA,#80H,LOOP;判断是否到了最左边的数,即第8个位码 •SJMPMAIN • PLAY1:INCR7;查表求段码子程序 •MOVA,R7;A在这里做变址寄存器 •MOVDPTR,#TABLE;表首址送DPTR,DPTR做基址寄存器 •MOVCA,@A+DPTR;基址寄存器加变址寄存器寻址 •MOVP2,A •RET
09DQ3
第3章 AT89C51单片机的硬件仿真
09DQ3
第3章 AT89C51单片机的硬件仿真
3.1 发光二极管的应用 3.1.1 程序流程图 3.1.2 汇编语言源程序 3.1.3 C语言源程序 3.1.4 发光二极管的应用仿真效果图 3.2 数码管显示的应用 3.2.1 静态扫描显示 3.2.2 动态扫描显示 3.3 键盘的应用 3.3.1 独立式键盘的应用 3.3.2 行列式键盘的应用 3.4 简单I/O接口的应用 3.4.1 程序流程图
图3-7 独立式键盘的应用程序流程图
09DQ3
2.汇编语言源程序
•ORG 0000H •LJMPMAIN •ORG0030H • MAIN:MOVP3,#00H • L1:MOVR3,#0F7H;键盘行扫描的初值 •MOVR1,#00H;TABLE2的取码指针 • L2:MOVA,R3 •MOVP2,A •DJNZR7,D2 • D3:MOVA,P2;读入的键盘值是否与R4相等 •XRLA,R4 •JZD3;按键松开否 •MOVA,R1 •MOVDPTR,#TABLE2 •MOVCA,@A+DPTR;取键值 •MOVP3,A •JMPL1 • TABLE2:DB4FH,5BH,06H,3FH,07H,7DH,6DH,66H •DB7CH,77H,6FH,7FH,71H,79H,5EH,39H •END
at89c51单片机的硬件仿真09dq3at89c51单片机的硬件仿真09dq3at89c51单片机的硬件仿真31发光二极管的应用311程序流程图312汇编语言源程序313c语言源程序314发光二极管的应用仿真效果图32数码管显示的应用321静态扫描显示322劢态扫描显示33键盘的应用331独立式键盘的应用332行列式键盘的应用34简单io接口的应用341程序流程图09dq3at89c51单片机的硬件仿真342汇编语言源程序343c语言源程序344简单io接口的应用仿真效果图35定时器的应用351程序流程图352汇编语言源程序353c语言源程序354定时器的应用仿真效果图36串行口的应用361串行口的基本应用362采用串行口扩展并行输入口37中断的应用371程序流程图09dq3at89c51单片机的硬件仿真372汇编语言源程序373c语言源程序374中断的应用仿真效果图09dq331发光二极管的应用311程序流程图312汇编语言源程序313c语言源程序314发光二极管的应用仿真效果图09dq3311程序流程图图31发光二极管的应用程序流程图09dq3312汇编语言源程序?org0000h?ljmpmain?org0030h?main
09DQ3
第3章 AT89C51单片机的硬件仿真
3.4.2 汇编语言源程序 3.4.3 C语言源程序 3.4.4 简单I/O接口的应用仿真效果图 3.5 定时器的应用 3.5.1 程序流程图 3.5.2 汇编语言源程序 3.5.3 C语言源程序 3.5.4 定时器的应用仿真效果图 3.6 串行口的应用 3.6.1 串行口的基本应用 3.6.2 采用串行口扩展并行输入口 3.7 中断的应用 3.7.1 程序流程图
• #include<reg51.h> • #include<stdio.h> • #define u char unsigned char • #define uint unsigned int • char code seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; • sbit key=P2^7;∥设键码 • void main() • { • u char i=0,x; • uint j=50; • P0=0x3F; • while(1) • { • P0=0x3F; •
09DQ3
3.C语言源程序
•#include<reg51.h> • #include<intrins.h> • #include<absacc.h> • #define uchar unsigned char • #define uint unsigned int • uchar code a[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F, •0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; • void delay(uint i) ∥延时程序 • {uint j; • for (j=0;j<i;j++); • } • uchar checkkey()∥检测有没有键按下 • {uchar i; •uchar j; •j=0x0F; •P2=j; •i=P2; •i=i&0x0F; •if (i==0x0F)return(0); • else return(0xFF);
09DQ3
2.汇编语言源程序
•PLAY2INCR6;查表求位码子程序 •MOVA,R6 •MOVDPTR,#TABLE2 •MOVCA,@A+DPTR •MOVP1,A •RET •TABLE:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,0FFH •TABLE2:DB01H,02H,04H,08H,10H,20H,40H,80H •DELAY:MOVR5,#02H;延时子程序 •C1:MOVR4,#0FFH •DJNZR4, •DJNZR5,C1 •RET •END
图3-3 静态扫描显示 的程序流程图
09DQ3
2.汇编语言源程序
• KEY BIT P2.7 •ORG0000H •LJMPMAIN •ORG0030H • MAIN:MOVP0,#3FH;显示零 •MOVR0,#0 •MOVDPTR,#TABLE;表首地址送DPTR • BB:JBKEY,;查键是否按下 •LCALLDELAY •JBKEY, •INCR0 •MOVA,R0 •MOVCA,@A+DPTR;取段码送累加器A •MOVP0,A;输出显示 •MOVA,R0 •LCALLDELAY •CJNEA,#0AH,BB •MOVR0,A •SJMPMAIN ;设键码
09DQ3
3.1.3 C语言源程序
• #include <intrins.h> • #define u char unsigned char • void delayms (uchar ms); ∥延时毫秒@12MHz,ms最大值255 • void main() • { • u char led;∥为P1口赋值的变量 • u char i;∥循环控制变量 • while(1) • { • led=0xFE;∥初值为11111110 • for (i=0;i<7;i++) • { • P1=led ; ∥led值送入P1口 • delayms(100);∥延时100ms • led=crol(led,1);∥led值循环左移1位 • }
09DQ3
3.1.4 发光二极管的应用仿真效果图
图3-2 发光二极管的应用仿真效果图
09DQ3
3.2 数码管显示的应用
3.2.1 静态扫描显示 3.2.2 动态扫描显示
09DQ3
3.2.1 静态扫描显示
1.程序流程图 2.汇编语言源程序 3.C语言源程序 4.静态扫描显示仿真效果图
09DQ3
1.程序流程图
∥设段码
09DQ3
3.C语言源程序
• • • • • • • • • • • • • while(1) { if (key==0) { while (j--); x=s e g[i];∥取段码 i=i+1; P0=x; if (i>9) i=0; } } }
09DQ3
4.静态扫描显示仿真效果图
图3-4 静态扫描显示仿真效果图
;段码表 ;位码表
09DQ3
3.C语言源程序
• #include<reg51.h> • #include<intrins.h> ∥包含crol() • void delayms(unsigned char ms);∥延时子程序 • unsigned char data disdigit;∥位选通值,传送到P1口用于选通当前数码 •∥管的数值,如等于0x01时,选通P1.0口数 •∥码管 • unsigned char code discode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0xFF}; •∥0,1,2,3,4,5,6,7,8,9,off • unsigned char data disindex;∥用于标识当前显示的数码管和缓冲区的偏 •∥移量 • void main() • { • P2=0xFF;∥关闭所有数码管 • P1=0x00; • disindex=0;∥当前偏移量为0 • disdigit=0x01;∥选通P1.0 • while(1) • { •
09DQ3
3.1.3 C语言源程序
• for (i=0;i<7;i++) • { • P1=led ; ∥led值送入P1口 • delayms(100);∥延时100ms • led=cror(led,1);∥led值循环左移1位 • } • } • } • void delayms (uchar ms)∥延时毫秒@12MHz,最大值255ms • } • } • } • void delayms (uchar ms)∥延时毫秒@12MHz,最大值255ms • { uchar i; •While (ms--) •For (i=0;i<124;i++); • }
09DQ3
4.动态扫描显示仿真效果图
图3-6 动态扫描显示的仿真效果图
09DQ3
3.3 键盘的应用
3.3.1 独立式键盘的应用 3.3.2 行列式键盘的应用
பைடு நூலகம்
09DQ3
3.3.1 独立式键盘的应用
1.程序流程图 2.汇编语言源程序 3.C语言源程序 4.独立式键盘的应用仿真效果图
09DQ3
1.程序流程图
09DQ3
2.汇编语言源程序
•TABLE:DB3FH,06H,5BH,4FH,66H;段码地址表 •DB6DH,7DH,07H,7FH,6FH •DELAY:MOVR5,#0A0H;延时 •C1:MOVR6,#0A0H •DJNZR6, •DJNZR5,C1 •RET •END
09DQ3
3.C语言源程序
图3-1 发光二极管的应用程序流程图
09DQ3
3.1.2 汇编语言源程序
•ORG 0000H •LJMPMAIN •ORG0030H •MAIN:MOVA,#0FEH;初值11111110送入A •MOV30H,#7;30H单元作计数器,初始值为左移次数 •LEFT:MOVP1,A;A送入P1口(初始点亮P1.0) •LCALLDELAY;延时 •RLA;循环左移 •DJNZ30H,LEFT;未够7次继续左移 •MOV30H,#7;重置计数器,为右移次数 •RIGHT:MOVP1,A;A送入P1口 •LCALLDELAY;延时 •RRA;循环右移 •DJNZ30H,RIGHT;未够7次继续右移 •AJMPMAIN •DELAY:MOVR5,#195;延时 •C1:MOVR6,#255 •DJNZR6, •DJNZR5,C1 •RET •END
09DQ3
3.C语言源程序
•P2=discode[disindex];∥段码送P2口 •P1=disdigit;∥位码送P1口 •delayms(1); •P1=0x00; •disdigit=crol(disdigit,1);∥位选通左移,下次选通下一位 •disindex++; •disindex &=0x07; • } • } • void delayms(unsigned char ms)∥延时子程序(晶振12MHz) • { • unsigned char i; • while(ms--) • { • for(i=0;i<120;i++); • while(ms--) • { • for(i=0;i<120;i++); • } • }
09DQ3
第3章 AT89C51单片机的硬件仿真
3.7.2 汇编语言源程序 3.7.3 C语言源程序 3.7.4 中断的应用仿真效果图
09DQ3
3.1 发光二极管的应用
3.1.1 程序流程图 3.1.2 汇编语言源程序 3.1.3 C语言源程序 3.1.4 发光二极管的应用仿真效果图
09DQ3
3.1.1 程序流程图
09DQ3
3.2.2 动态扫描显示
1.程序流程图 2.汇编语言源程序 3.C语言源程序 4.动态扫描显示仿真效果图
09DQ3
1.程序流程图
图3-5 动态扫描显示程序流程图
09DQ3
2.汇编语言源程序
• ORG 0000H •LJMPMAIN •ORG0030H • MAIN:MOVR7,#0FFH;置初值 •MOVR6,#0FFH • LOOP:LCALLPLAY1;调用显示段码子程序 •LCALLPLAY2;调用显示位码子程序 •LCALLDELAY •MOVP1,#00H •CJNEA,#80H,LOOP;判断是否到了最左边的数,即第8个位码 •SJMPMAIN • PLAY1:INCR7;查表求段码子程序 •MOVA,R7;A在这里做变址寄存器 •MOVDPTR,#TABLE;表首址送DPTR,DPTR做基址寄存器 •MOVCA,@A+DPTR;基址寄存器加变址寄存器寻址 •MOVP2,A •RET