数码管动态显示(中断 延时)

数码管动态显示(中断  延时)
数码管动态显示(中断  延时)

W

R D I P 31191

8T 9

R D 17W

R

161213141512345678P S

E N

A L E /P C P P P P P P P P T T I p

1

D

Y

4

-

6543210

5

V

80C51中断系统的结构

SCON

TCON

IE

IP

硬件查询

从0~100循环显示程序,

#include

#define uint unsigned int #define uchar unsigned char

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void display(uchar bai,uchar shi,uchar ge); //数码管显示子程序void delay(uint z); //延时子程序

void init(); //初始化子程序

void main()

{

init();//初始化子程序

while(1)

{

if(aa==20)

{

aa=0; //千万别忘记计时器从0开始。

temp++;

if(temp==100)

{

temp=0;

}

bai=temp/100;

shi=temp%100/10;

ge=temp%10;

}

display(bai,shi,ge);

}

}

void delay(uint z)

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

dula=1;

P0=table[bai];

dula=0;

P0=0xff; //消除其他数码管的余晖

wela=1;

P0=0xfe;

wela=0;

dula=1;

P0=table[shi];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(1);

dula=1;

P0=table[ge];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(1);

}

void init()

{

wela=0;

dula=0;

temp=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

}

1.利用动态扫描方法在六位数码管上显示出稳定的654321.

#include

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,bai,shi,ge;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(uint z); //延时子程序

//初始化子程序

void main()

{

while(1)

{

wela=1;

P0=0xfe;

wela=0;

P0=0x00;

dula=1;

P0=0x07;

dula=0;

delay(3);

wela=1;

P0=0xfd;

dula=1; P0=0x7d; dula=0; delay(3);

wela=1; P0=0xfb; wela=0; P0=0x00; dula=1; P0=0x6d; dula=0; delay(3);

wela=1; P0=0xf7; wela=0; P0=0x00; dula=1; P0=0x66; dula=0; delay(3);

wela=1; P0=0xef; wela=0; P0=0x00; dula=1; P0=0x4f; dula=0; delay(3);

/* wela=1; P0=0xfe; wela=0; P0=0x00; dula=1;

delay(20);

wela=1;

P0=0xfe;

wela=0;

P0=0x00;

dula=1;

P0=0x07;

dula=0;

delay(20); */

}

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

2.用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去。

#include

#define uint unsigned int Array #define uchar unsigned char

uint temp,aa,bai,shi,ge;

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x39,0x5e,0x79,0x71};

void display(uchar bai,uchar shi,uchar ge); //数码管显示子程序void delay(uint z); //延时子程序

void init(); //初始化子程序

void main()

{

init();//初始化子程序

while(1)

{

if(aa==1)

{

aa=0; //千万别忘记计时器从0开始。

temp++;

if(temp==999)

{

temp=0;

}

bai=temp/100;

shi=temp%100/10;

ge=temp%10;

}

display(bai,shi,ge);

}

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void display(uchar bai,uchar shi,uchar ge)

{

dula=1;

P0=table[bai];

dula=0;

P0=0xff; //消除其他数码管的余晖

P0=0xfe;

wela=0;

delay(1);

dula=1;

P0=table[shi];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(1);

dula=1;

P0=table[ge];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(1);

}

void init()

{

wela=0;

dula=0;

temp=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void timer0() interrupt 1 {

TL0=(65536-10000)%256;

aa++; }

利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住。

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0x00}; //流水灯数码管停止即定时器停止工作通过标志量进行另一种工作方式

uchar temp,t0,t1,bai,shi,ge,flag,flag1;

uint shu;

void init();

void display(uchar,uchar,uchar,uchar,uchar,uchar);

void delay(uint z)

{

uint t1,y;

for(t1=z;t1>0;t1--)

}

void main() //一个工程中只能有一个main函数

{

init(); //初始化设置

while(1)

{

if(flag1!=1) //通过一些标志量来改变工作方式

display(7,6,5,bai,shi,ge);

else

display(16,17,18,18,19,20);

}

}

void init()

{

shu=432;

temp=0xfe;

P1=temp;

TMOD=0x11; //定时器工作方式

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256; //给T0 T1定时器赋初值不过个人认为没什么用EA=1; //总中断

ET0=1;

ET1=1; //开TO T1

TR0=1;

TR1=1; //开始工作

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256; //每次进入中断需要定时器从初值开始工作

t0++; //控制时间

if(flag!=1)

{

{

t0=1;

temp=_crol_(temp,1);

P1=temp;

}

}

else

{

if(t0%4==0)

P1=~P1;

if(t0==60)

{

TR0=0; //关闭定时器

P1=0xff; //关闭所有LED

flag1=1;//闪烁完毕后通过标志量让数码管显示 LELLO }

}

}

void timer1() interrupt 3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

t1++;

if(t1==2)

{

t1=0;

shu--;

bai=shu/100;

shi=shu%100/10;

ge=shu%10;

if(shu==398)

{

TR0=0; //关闭定时器

TH0=(65536-50000)/256;

TL0=(65536-50000)%256; //装入初值

TR0=1; //再打开定时器

flag=1; //标志量变化

t0=0; //清空t0 //这几个蓝色的不用写也行啊,初值本身可以不给,没用,要给也应该尽量大,t0也不用清0,检测的是flag,t0不用管了。

P1=0xff; //把灯全部关掉

TR1=0; //关闭定时器1

}

}

}

void display(uchar aa,uchar bb,uchar cc,uchar ba,uchar sh,uchar g)

{

dula=1;

P0=table[aa];

dula=0;

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

delay(1);

dula=1;

P0=table[bb];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(1);

dula=1;

P0=table[cc];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(1);

dula=1;

dula=0;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

delay(1);

dula=1;

P0=table[sh];

dula=0;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

delay(1);

dula=1;

P0=table[g];

dula=0;

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

delay(1);

}

我写的

#include

#include

#define uint unsigned int

#define uchar unsigned char uint a,b,c,d,e,f,bai,shi,ge; sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0x00};

void display(uchar q,uchar w, uchar e,uchar bai,uchar shi,uchar ge); //数码管显示子程序

void delay(uint z); //延时子程序

void init(); //初始化子程序

void main()

{

init();//初始化子程序

while(1)

{

if(f==0)

display(7,6,5,bai,shi,ge);

else

display(16,17,18,18,19,20);

}

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void display(uchar q,uchar w, uchar e,uchar bai,uchar shi,uchar ge)

{

dula=1;

P0=table[q];

dula=0;

P0=0xff; //消除其他数码管的余晖

wela=1;

P0=0xfe;

wela=0;

delay(1);

dula=1;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(1);

dula=1;

P0=table[e]; dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(1);

dula=1;

P0=table[bai]; dula=0;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

delay(1);

dula=1;

P0=table[shi]; dula=0;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

delay(1);

dula=1;

P0=table[ge]; dula=0;

P0=0xff;

wela=0;

delay(1);

}

void init()

{

wela=0;

dula=0;

b=0xfe;

c=432;

e=1;

f=0;

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

}

void timer0() interrupt 1 {

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

a++;

if(e==1)

{if(a==1)

{

a=0;

P1=b;

b=_crol_(b,1);

} }

else

if(a%4==0)

P1=~P1;

if(a==60)

{

TR0=0; //关闭定时器

P1=0xff; //关闭所有LED

f=1;//闪烁完毕后通过标志量让数码管显示 HELLO }

}

}

void timer1() interrupt 3

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

d++;

if(d==1)

{

d=0;

bai=c/100;

shi=c%100/10;

ge=c%10;

c--;

if(c==397)

{

TR1=0;

P1=0xff;

e=0;

a=0;

}

}

}

多位数码管动态扫描protues仿真

实验题目:多位数码管动态扫描电路设计与调试 一、实验要求与目的 1、设计要求 8位数码管显示“8.8.8.8.8.8.8.8.”,即点亮显示器所有段,持续约500ms 之后,数码管持续约1s ;最后显示“HELLO —10”,保持。 2、实验目的 1、掌握数码管动态扫描显示原理及实现方法。 2、掌握动态扫描显示电路驱动程序的编写方法。 二、设计思路 1、在Proteus 中设计仿真电路原理图。 2、在Keil C51软件中编译并调试程序,程序后缀必须是.c 。调试时生成hex 文件,确认 无误后将生成的hex 文件添加到原理图的单片机中进行仿真。 3、观察电路仿真结果对程序进行更改直至达到预期结果 三、实验原理 p2[0..3] p0[0..7]p 00p 00p 07p 06p 0605p 02p 05p 04p 04p 03p 03p 02p 02p 01p 01p 07p 23p 22p 21p 20A 15B 14C 13D 12 01122334455667798109 11 U2 7445 A 02 B 018A 13B 117A 24B 216A 35B 315A 46B 414A 57B 513A 68B 612A 7 9 B 7 11 C E 19A B /B A 1 U3 74HC245 234567891 RP1 RESPACK-8 XTAL2 18 XTAL119 RST 9 P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD 17 P3.6/WR 16P3.5/T115AD[0..7]A[8..15] ALE 30EA 31PSEN 29 P1.0/T21 P1.1/T2EX 2P1.23P1.34P1.45P1.56P1.67P1.78 U4 AT89C52 图1 原理图

指示灯数码管的中断控制

学生实验报告 学院:软件与通信工程学院 课程名称:单片机系统设计 专业班级: 姓名: 学号:

学生实验报告(1) 一、实验综述 1、实验目的及要求 【实验目的】 掌握外部中断原理,学习中断编程与程序调试方法 【内容及要求】 (1)熟悉uvision3的软件调试方法; (2)完成c51语言编程 (3)练习uvision3与ISIS的联机仿真方法 【实验原理】 在编程软件配合下,要求实现如下功能:程序启动后,D1处于熄灯、LED1处于黑屏状态;单击K1,可使D1亮灯状态反转一次;单击K2,可使LED1显示值加1,并按十六进制数显示,达到F后重新从1开始。 软件编程原理为:K1和K2的按键动作分别作为INT0和INT1的中断请求,在中断函数中进行指示灯与数码管的信息处理。初始化后,主函数处于无限循环状态,等待中断请求 2、实验仪器、设备或软件 电脑, Keil uVision4, proteus7 二、实验过程(实验步骤、记录、数据、分析)

(1)在Keil uVision4中编写和编译C51程序,生成可执行文件; (2)在uVision4中启动ISIS的仿真运行,并进行联机调试。 【实验代码】 #include<> unsigned char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x58,0x5e,0x79,0x71}; unsigned char count=0; sbit P0_4=P0^4; void INT_0SRV() interrupt 0 { P0_4 = ~P0_4; } void INT_1SRV() interrupt 2 { count++; if(count==16) count = 1; P2 = led_mod[count]; } void main(){ P2=0x00; P0_4=0x01; EA=1; EX0=1; EX1=1; IT1=1; IT0=1;

数码管显示程序(汇编语言)

实验三数码显示 一、实验目的 了解LED数码管动态显示的工作原理及编程方法。 二、实验内容 编制程序,使数码管显示“DJ--88”字样。 三、实验程序框图 四、实验步骤 联机模式: (1)在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开598K8ASM

文件夹,点击S6.ASM文件,单击“确定”即可装入源文件,再单击工具栏中编译装载,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。 (2)数码管显示“DJ--88”字样。 脱机模式: 1、在P.态下,按SCAL键,输入2DF0,按EXEC键。 2、数码管显示“DJ--88”字样。 五、实验程序清单 CODE SEGMENT ;S6.ASM display "DJ--88" ASSUME CS:CODE ORG 2DF0H START: JMP START0 PA EQU 0FF20H ;字位口 PB EQU 0FF21H ;字形口 PC EQU 0FF22H ;键入口 BUF DB ?,?,?,?,?,? data1: db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0 c6h,0a1h db 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH,0F0H START0: CALL BUF1 CON1: CALL DISP JMP CON1 DISP: MOV AL,0FFH ;00H MOV DX,PA OUT DX,AL MOV CL,0DFH ;显示子程序 ,5ms MOV BX,OFFSET BUF DIS1: MOV AL,[BX] MOV AH,00H PUSH BX MOV BX,OFFSET DATA1 ADD BX,AX MOV AL,[BX] POP BX MOV DX,PB

数码管动态显示教案

电子综合设计实训 题目数码管动态显示 _ 姓名 专业 学号 指导教师 郑州科技学院电气工程学院

目录 摘要.................................................................................................. I 1背景. (1) 1.1介绍 (1) 1.2设计步骤 (2) 2 设计思路 (3) 2.1方案对比 (3) 3元件的选择 (6) 3.1单片机 (6) 3.2 显示元器件的选择 (6) 4 设计原理及功能说明 (8) 4.1 各部分功能说明 (8) 5 装配与调试 (14) 5.1装配 (14) 5.2调试 (14) 6 总结 (15) 附录 (17) 附录一:元件清单 (17) 附录二:电路源程序 (17)

数码管动态显示的设计 摘要 本文介绍了一种基于AT89C51单片机的8个数码管滚动显示单个数字的设计,让八位数码管滚动显示0、1、2、3、4、5、6、7,我们以液晶显示技术的发展为背景,选择了比较常用的液晶数码管显示模块,利用了单片机控制数码管模块的显示机理。研究学习AT89C51单片机其功能,对学习过的单片机,C语言课程进行巩固,设计一款在8只数码管上流动显示单个数字的程序,并用PROTEUS进行电路设计和实时仿真。该电路有两部分组成:AT89C51单片机和显示模块组成。AT89C51单片机具有超低功耗和CPU外围的高度整合性;显示模块数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极,方便易用。实际应用中不需要外部任何元器件即可实现,具有接口电路简单、可靠,易于编程的特点,抗干扰性好等特点。 单片机技术使我们可以利用软硬件实现数码管准确显示各种数码。而且这种技术相对简单,性价比较高,在我们生活中应用很广泛,具有一定的发展前景。 关键词:AT89C51单片机;数码管;滚动显示

单片机指示灯和数码管的中断控制实验报告

实验四、指示灯和数码管的中断控制 一、实验目的 掌握外部中断的工作原理,学会中断程序设计。 二、实验内容 1、按照教材图A.53,绘制实验四电路原理图; 2、要求采用外部中断原理完成本次实验,其中按键K1、K2均设置为下降沿触发方式,自然优先级; 3、编写C51程序实现如下功能:开机后D1灭灯,LED1黑屏,随后单击K1→D1状态反转,单击K2 →LED1从0开始循环显示0~F字符。 4、观察仿真结果,完成实验报告。 三、实验要求 提交的实验报告中应包括:电路原理图,外部中断工作原理阐述(以K1为例说明中断响应过程),C51源程序(含流程图与注释语句),运行效果(含运行截图与说明),实验小结。 提交实验报告的电子邮件主题及存盘文件名格式如,2005041220马晓明实验四。 1、电路原理图 2、外部中断工作原理阐述

持续按下K1则D1将“亮→灭→亮→灭→亮→灭如此循环,表明实现了K1对应于D1状态反转这个功能;持续按下持续按K2则数码显示管依次显示1-F,实现了K2对应于0~F间的数码管加一计数显示。 3、C51程序 #include sbit P0_4=P0^4; unsigned char count=0; unsigned led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0 x5e,0x79,0x71}; void main(){ P2=0x00; P0_4=0; EA=1; EX1=EX0=1; IT1=IT0=1; while(1); } void INT_OSVR() interrupt 0 {P0_4=!P0_4;} void INT_1SVR() interrupt 2

单片机指示灯和数码管的中断控制实验报告

实验四、指示灯与数码管的中断控制 一、实验目的 掌握外部中断的工作原理,学会中断程序设计。 二、实验内容 1、按照教材图A、53,绘制实验四电路原理图; 2、要求采用外部中断原理完成本次实验,其中按键K1、K2均设置为下降沿触发方式,自然优先级; 3、编写C51程序实现如下功能:开机后D1灭灯,LED1黑屏,随后单击K1→D1状态反转,单击K2 →LED1从0开始循环显示0~F字符。 4、观察仿真结果,完成实验报告。 三、实验要求 提交的实验报告中应包括:电路原理图,外部中断工作原理阐述(以K1为例说明中断响应过程),C51源程序(含流程图与注释语句),运行效果(含运行截图与说明),实验小结。 提交实验报告的电子邮件主题及存盘文件名格式如,2005041220马晓明实验四。 1、电路原理图 2、外部中断工作原理阐述

持续按下K1则D1将“亮→灭→亮→灭→亮→灭如此循环,表明实现了K1对应于D1状态反转这个功能;持续按下持续按K2则数码显示管依次显示1-F,实现了K2对应于0~F间的数码管加一计数显示。 3、C51程序 #include sbit P0_4=P0^4; unsigned char count=0; unsigned led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0 x5e,0x79,0x71}; void main(){ P2=0x00; P0_4=0; EA=1; EX1=EX0=1; IT1=IT0=1; while(1); } void INT_OSVR() interrupt 0 {P0_4=!P0_4;} void INT_1SVR() interrupt 2

第5章 中断系统 - 3

【实例4】【P108】根据下图所示的数码管显示与按键电路,编程验证两级外部中断嵌套效果。此外,利用发光管验证外部中断请求标志IE0在脉冲触发中断时的硬件置位与撤销过程。 #include //林立P108例题 char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(unsigned int count) { unsigned char i; while(count--) for(i=0;i<120;i++); } void key0(void) interrupt 0 // P3.2 { unsigned char i; for(i=0; i<=9; i++) { P2=led_mod[i]; delay(1000); } P2=0x40; //循环显示完“0”~“9”之后,显示“-”

void key1(void) interrupt 2 //P3.3 { unsigned char i; for(i=0; i<=9; i++) { P1=led_mod[i]; delay(1000); } P1=0x40; } void main(void) { unsigned char i; TCON=0x05; // 0x05= 0000 0101,最好写成IT0=1,IT1=1 PX0=0; PX1=1; //INT1 高优先级 P1=0x40; P2=0x40; IE=0x85; // 0x85=1000 0101, EA=1, EX1=1,EX0=1 while(1) { for(i=0;i<=9;i++) { P0=led_mod[i]; delay(1000); } } } 5.6 扩充外部中断源 实际应用中,两个外部中断请求源往往不够用,需对外部中断源进行扩充,如图5-10所示。系统有5个外部中断请求源IR0~IR4,高电平有效。 INT,优先级高的请求源IR0直接接到80C51的一个外部中断请求输入端0 其余4个请求源IR1~IR4通过各自的OC门(集电极开路门)连到80C51的另 INT,同时还连到P1口的P1.0~P1.3脚,供80C51查询。一个外中断源输入端1 图5-10所示电路,除了IR0优先权级别最高外,其余4个外部中断源的中断优先权的高与低取决于查询顺序。

实验五 定时中断及数码管显示实验(3课时)20140506

实验五定时中断及数码管显示实验(3课时) 1.对P1口所接8只发光二极管,编写相应的程序使发光二极管循环点亮。其中每一个发光二极管亮的时间为0.5S,0.5S的时间要求用定时中断实现。(已知单片机晶振频率为12 .00MHz) 2.采用定时器设计一分钟倒计时器,通过P1口显示计时状态,每过1S时间8个发光二极管最右边一个亮一次,一分钟时间到时全部8个二极管都亮。(已知单片机晶振频率为12 .00MHz) 3. 用八段数码管显示自己的生日:年月日各两位。 实验报告 实验五 1. 实验目的和要求 ①对P1口所接8只发光二极管,编写相应的程序使发光二极管循环点亮。其中每一个发光二极管亮的时间为0.5S,0.5S的时间要求用定时中断实现。(已知单片机晶振频率为 12 .00MHz) ②采用定时器设计一分钟倒计时器,通过P1口显示计时状态,每过1S时间8个发光二极管最右边一个亮一次,一分钟时间到时全部8个二极管都亮。(已知单片机晶振频率为 12 .00MHz) ③用八段数码管显示自己的生日:年月日各两位。 2. 主要仪器设备 ①笔记本电脑 ②51单片机 3. 实验内容 ①对P1口所接8只发光二极管,编写相应的程序使发光二极管循环点亮。其中每一个发光二极管亮的时间为0.5S,0.5S的时间要求用定时中断实现。(已知单片机晶振频率为12 .00MHz) 源程序: #include #define uint unsigned int #define uchar unsigned char char i=100; uchar temp; void display()

基于51单片机的LED数码管动态显示

基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O口。 1 硬件设计 利用51单片机的P0口输出段码,P2口输出位码,其电路原理图如下所示。 在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“DT.DSN”。在器件选择按钮中单击

“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。 51单片机AT89C51 一片 晶体CRYSTAL 12MHz 一只 瓷片电容CAP 22pF 二只 电解电容CAP-ELEC 10uF 一只 电阻RES 10K 一只 电阻RES 4.7K 四只 双列电阻网络Rx8 300R(Ω) 一只 四位七段数码管7SEG-MPX4-CA 一只 三极管PNP 四只 若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。 在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。 2 软件设计 LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X(N-1)),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。 LED数码管动态显示的流程如下所示。

数码管动态扫描显示01234567

实验5 数码管动态扫描显示01234567 原理图:8个数码管它的数据线并联接到JP5, 位控制由8个PNP型三级管驱动后由JP8引出。 相关原理: 数码管是怎样来显示1,2,3,4呢?数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。我们分别把他命名为 A,B,C,D,E,F,G,H。

搞懂了这个原理, 我们如果要显示一个数字2, 那么 A,B,G,E,D这5个段的发光管亮就可以了。也就是把B,E,H(小数点)不亮,其余全亮。根据硬件的接法我们编出以下程序。当然在此之前,还必须指定哪一个数码管亮,这里我们就指定最后一个P2.7。 LOOP: CLR P2.7 ;选中最后的数码管 SETB P0.7 ;B段不亮 SETB P0.5 ;小数点不亮 SETB P0.1 ;C段不亮 CLR P0.2 ;其他都亮 CLR P0.3 CLR P0.4 CLR P0.6 CLR P0.0 JMP LOOP ;跳转到开始重新进行

END 把这个程序编译后写入单片机,可以看到数码管的最后一位显示了一个数字2。 也许你会说:显示1个2字就要10多行程序,太麻烦了。 显示数字2则是C,F,H(小数点)不亮,同时由于接法为共阳接法,那么为0(低电平)是亮 为1(高电平)是灭。从高往低排列,(p0.7_p0.0)写成二进制为01111110, 把他转化为16进制则为A2H。我们可以根据硬件的接线把数码管显示数字编制成一个表格, 以后直接调用就行了。 有了这个表格上面显示一个2的程序则可简化为: LOOP: CLR P2.7 ;选中左边的数码管 MOV P0,#0A2H ;送数字2的代码到P0口 JMP LOOP ;跳转到开始重新进行 END

指示灯开关的中断控制单片机实验报告

嘉应学院物理与光信息科技学院单片机原理及应用实验 学生实验报告 实验项目:指示灯/数码管的中断控制 实验地点:工A310 班级: 姓名: 座号: 指导老师:老师 实验时间:年月日

一、实验目的 掌握外部中断原理,学习中断编程与程序调试方法。 二、实验原理 实验原理图如图所示: 图中按键K1和K2分别接于P3.2和P3.3,发光二极管D1接于P0.4,共阴极数码管LED1接于P2口。时钟电路、复位电路、片选电路忽略。 在编程软件的配合下,要求实现如下功能:程序启动后,D1处于熄灯、LED1处于黑屏状态;单击K1,可使D1亮灯状态反转一次;单击K2,可使LED1显示值加1,并按十六进制数显示,达到F后重新从1开始。 编程原理为:K1和K2的按键动作分别作为INT0和INT1的中断请求,在中断函数中进行指示灯与数码管的信息处理。初始化后,主函数处于无限循环状态,等待中断请求。三、实验内容: (1)熟悉μVision3的软件调试方法; (2)完成实验4的C51语言编程; (3)掌握在μVision3与ISIS的联机仿真方法。 四、实验步骤 1、提前阅读与实验4相关的阅读材料; 2、参考书本实验4,在ISIS中完成电路原理图的绘制: (1).启动ISIS模块 从Windows的“开始”菜单中启动Proteus ISIS模块,可进入仿真件的主界面,如图所示

可以看出,ISIS的编辑界面是标准的Windows软件风格,由标准工具栏、主菜单栏、绘图工具栏、仿真控制工具栏、对象选择窗口、原理图编辑窗口和预览窗口等组成。 (2).元件和电源的选取、摆放及属性编辑,总线与标签的画法等内容 元件的选取:单击左侧绘图工具栏中的“元件模式”按観和对象选择按観“P”,弹出“Pick Devices”元件选择窗口,如图: 摆放元件: 单击对象选择列表中的元件名称,预览窗口中出现的图形单击编辑窗口,元件以红色轮廓图形出现(选中状态),拖动鼠标使元件轮廓移动到所需位置,再次单击可固定摆放位置,同时也撤销选中状态(变为黑色线条图形)。 编辑属性与总线: 对摆放好的元件双击或者右键后选择“编辑属性”即可对元件的属性进行修改。 最后效果图为:

单片机第五章答案

5-3. 现有存储容量为512K×4、1K×4、2K×8、4K×1、8KB、512KB和4MB的存储器,试问这些存储器分别有多少条地址线和数据线(设它们均为非动态RAM)? 5-8 要在单片机片外扩展16KB数据存储器,选择其地址为0000~3FFFH。如选用6264 为存储器芯片,74LS138为译码器,试画出硬件的连接图。(图中右边的6116应该改为6264) 74LS138 5-9 要在单片机片外扩展32KB数据存储器,选择其地址为8000H~FFFFH。如选用线 选法,试设计其硬件的连接图。

5-10写出图5-43中#1~#7存储器的寻址范围,片选信号低电平有效,其中#1~#3为2KB 的ROM;#4~#7为1KB的RAM. 1#:8000H----87FFH 2#:8800H----8FFFH 3#:9000H----97FFH 4#:0A000H—0A3FFH 5#:0A400H---0A7FFH 6#:0A800H---0ABFFH 7#:0AC00H---0AFFFH 5-11 决定8155端口地址的引脚有哪些?IO/M的作用是什么?T/IN和T/OUT的作用是什么? 1. AD0~AD7(8条)三态地址/数据线 控制总线(8条) I/O总线(22条) 电源线(2条) 2. IO/M为I/O口及存储器选择信号,若IO/M=0,则选择存储器;否则 选择I/O口; 3. T/IN为定时器输入,定时器工作所需的时钟信号由此端输入。T/OUT 为定时器输出; 5-13 LED数码管显示器在单片机系统中有哪几种显示方式? LED显示器的显示方式可分为静态显示和动态显示两种。 静态显示是指每个数码管的段选线控制是独立的,其特点是各LED管能稳定地同时显示各自的字形。 动态显示又称扫描显示方式,它是将每个数码管的段选线同名相连,在某一时刻只让一根位选线有效,同时在段选线上输出该位要显示的字形码,在下

数码管动态显示实验报告

实验四数码管动态显示实验一 一、实验要求 1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路 2.在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码 管数据引脚相连,P2.0~P2.3引脚输出选控制信号 3.在Keil软件中编写程序,采用动态显示法,实现数码管分别显示数字1,2,3,4 二、实验目的 1.巩固Proteus软件和Keil软件的使用方法 2.学习端口输入输出的高级应用 3.掌握7段数码管的连接方式和动态显示法 4.掌握查表程序和延时等子程序的设计 三.实验说明 本实验是将单片机的P1口做为输出口,将四个数码管的七段引脚分别接到P1.0至P1.7。由于电路中采用共阳极的数码管,所以当P1端口相应的引脚为0时,对应的数码管段点亮。程序中预设了数字0-9的段码。由于是让四个数码管显示不同的数值,所以要用扫描的方式来实现。因此定义了scan函数,接到单片机的p2.0至p2.3 在实验中,预设的数字段码表存放在数组TAB中,由于段码表是固定的,因此存储类型可设为code。 在Proteus软件中按照要求画出电路,再利用Keil软件按需要实现的功能编写c程序,生成Hex文件,把Hex文件导到Proteus软件中进行仿真。为了能够更好的验证实验要求,在编写程序时需要延时0.5s,能让人眼更好的分辨;89C51的一个机器周期包含12个时钟脉冲,而我们采用的是12MHz晶振,每一个时钟脉冲的时间是1/12us,所以一个机器周期为1us。在keil程序中,子函数的实现是用void delay_ms(int x),其中x为1时是代表1ms。 四、硬件原理图及程序设计 (一)硬件原理图设计 电路中P1.0到P1.7为数码管七段端口的控制口,排阻RP1阻值为220Ω,p2.0到p2.3为数码管的扫描信号。AT89c51单片机的9脚(RST)为复位引脚,当RST为高电平的时间达到2个机器周期时系统就会被复位;31引脚(EA)为存取外部存储器使能引脚,当EA为高电平是使用单片机内部存储器,当EA为低电平时单片机则使用外部存储器。18、19引脚是接晶振脚。而接地和电源端在软件中已经接好,所以不用在引线。 如下图所示:

指示灯、数码管的中断控制实验报告

学生实验报告 (参考样本) 学院:软件与通信工程 课程名称:单片机原理 专业班级:通信101 姓名 : 学号:

学生实验报告 一、实验目的及要求: 1、目的 掌握外部中断原理,学习中断编程与程序调试方法。 2、内容及要求 熟悉uvision3的软件调试方法; 完成c51语言编程 练习uvision3与ISIS的联机仿真方法 三、实验方法与步骤: #include sbit P0_4 = P0^4; unsigned char count = 0; unsigned char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71}; void main() { P2 = 0x00; P0_4 = 0;

EA = 1; EX1 = EX0 = 1; IT1 = IT0 = 1; while(1); } void INT_0SVR() interrupt 0 { P0_4 = !P0_4; } void INT_1SVR() interrupt 2 { count++; if(count==16) count = 1; P2 = led_mod[count]; } 四、实验结果与数据处理:

五、讨论与结论 通过做此次实验,了解了相关中断的知识,了解了自己有关中断知识的不足,有待学习。 六、指导教师评语及成绩: 评语:指导教师依据学生的实际报告内容,用简练语言给出本次实验报告的评价和价值

数码管动态显示(中断 延时)

W R D I P 31191 8T 9 R D 17W R 161213141512345678P S E N A L E /P C P P P P P P P P T T I p 1 D Y 4 - 6543210 5 V 80C51中断系统的结构

SCON TCON IE IP 硬件查询 从0~100循环显示程序, #include #define uint unsigned int #define uchar unsigned char

sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void display(uchar bai,uchar shi,uchar ge); //数码管显示子程序void delay(uint z); //延时子程序 void init(); //初始化子程序 void main() { init();//初始化子程序 while(1) { if(aa==20) { aa=0; //千万别忘记计时器从0开始。 temp++; if(temp==100) { temp=0; } bai=temp/100; shi=temp%100/10; ge=temp%10; } display(bai,shi,ge); } } void delay(uint z) uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

第5章 制作数码管原理图元件库

作者;脚短路长 送给有需要的朋友,由于作者水平有限,希望大家以后能多对指教。 本教材取自protel dxp 2004 第五章制作数码管原理图元件库 5.1能力培养 1.能制作规则原理图元件库。 2.能制作非规则原理图元件库。 3.能调用制作的原理图元件库。 5.2任务分析 要完成此项任务,需要如下3方面知识。 1.原理图元件库的创作。 2.原理图元件库编辑器的基本使用。 3.原理图元件库的调用。 5.3如何创建原理图元件库 要制作数码管原理图元件库,必须先新建立一个原理图元件库文件,然后 绘制满足实物要求的图形和放置引脚,再保存,最后在原理图中调用即可。 5.31 新建原理图元件库 选择菜单命令【文件(F)】/【创建(N)】/【库(L)】/【原理图库(库)】,选择新建原理图元件库文件 新建原理图元件后,选择假面左下角的“SCH Library”选项,进入原理图元件库编辑器界面 5.32保存元件库 制作完元件库后,执行菜单【文件】/【保存】命令,会弹出如图5-5所示的对话框,要求用户输入元件名,输入完元件名后,单机“保存”按钮确认。

5.4如何使用原理图元件库编辑器 打开或新建原理图元件库,即可进入元件库编辑器,整个界面右边主菜单、绘图工具。工作面板和工作窗口组成,如上图所示。 5.41主菜单 主菜单如图所示,通过操作主菜单,可以完成绘制原理图元件库所需的操作 DXP(X);系统菜单,主要用于用户自定义,优先设定,系统信息添加等功能。 文件(F);主要用于各种文件操作,包括新建,打开,保存等功能。 编辑(E);主要用于完成各种编辑操作,包括撤销,复制,黏贴等功能。 查看(V);主要用于改变工作窗口大小,打开与关闭工具栏,显示个点等功能。 项目管理(P);用于项目操作。 放置(P);用于放置元件符号的组成。 工具(T);组要用于新建元件,元件重命名等功能。 报告(R);用于产生元件报告,检查元件规则等。 视窗(W);用于改变窗口的显示方式,切换窗口 帮助(H);提供帮助功能。 5.4.2标准工具栏和绘图工具 1.标准工具栏“Sch Lib Standard” 标准工具栏包括新建、打开、保存、打印、放大、缩小、编辑等常用工具。 2绘图工具“Sch Lib Drawing” 元件模型和相关符号可以通过绘图工具来完成,如图 5.4.3工作画板 进入原理图元件库编辑器后,选择工作面板标签栏中的Library Editor选项,即可显示“Library Editor”面板。通过操作工作面 板,可以浏览和编辑文件,如图。

数码管动态显示的51单片机时钟设计

一看就会,适合初学者参考 T0,T1同时开中断,和别人的有点不一样 源程序如下 //数码管设计的可调电子钟 //K1,K2分别调整小时和分钟 #include<> #include<> #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99, //共阳段码 0x92,0x82,0xF8,0x80,0x90,0xFF}; uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xBF,0,0}; //显示缓存uchar Scan_BIT; //扫描位,选择要显示的数码管 uchar DSY_IDX; //显示缓存索引 uchar Key_State; //P1端口按键状态 uchar h,m,s,s100; //十分秒,1/100s void DelayMS(uchar x) //延时 { uchar i; while(x--) for(i=0;i<120;i++); } void Increase_Hour() //小时处理函数 { if(++h>23)h=0; DSY_BUFFER[0]=DSY_CODE[h/10]; DSY_BUFFER[1]=DSY_CODE[h%10]; } void Increase_Minute()//分钟处理函数 { if(++m>59) { m=0;Increase_Hour(); } DSY_BUFFER[3]=DSY_CODE[m/10]; DSY_BUFFER[4]=DSY_CODE[m%10]; }

MSP430与DS18B20数码管显示中断法

MSP430与DS18B20数码管显示(中断法) #include ; typedef unsigned char uchar; typedef unsigned int uint; /*****18B20部分的接口定义********/ #define DQ1 P1OUT |= BIT6 #define DQ0 P1OUT &= ~BIT6 #define DQ_in P1DIR &= ~BIT6 #define DQ_out P1DIR |= BIT6 #define DQ_val (P1IN & BIT6) /*****数码管部分的接口定义********/ #define wei_h P5OUT|= BIT5 #define wei_l P5OUT&= ~BIT5 #define duan_l P6OUT &= ~BIT6 #define duan_h P6OUT |= BIT6 //数码管七段码;0--f uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar table1[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};//有点 uchar tflag,num=0 ; int tvalue; uchar disdata[4]; /***********18B20部分程序******************/ /******************************************* 函数名称:DelayNus 功 能:实现N个微秒的延时 参 数:n--延时长度 返回值:无 说明 :定时器A的计数时钟是1MHz,CPU主频8MHz 所以通过定时器延时能够得到极为精确的 us级延时

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

51单片机控制数码管动态显示程序 说明:驱动四位一体数码管动态显示数字,可方便的移植到其它程序中。 例如:1、硬件改为三位一体或二位一体数码管,只需修改Display_Scan()函数COM个数。 2、本例中,采用了共阴数码管,如果用在共阳数码管,只需修改相应段码表。 本程序使用P0口作为段码数据发送端,P2.0-P2.3作为数码管扫描选通, 使用P0口时,因单片机内部没有上拉电阻,所以要外接上拉电阻(参考阻值470欧姆). // STC89C52RC // +---------------+

// | | // | | Digital Number // | | _______________________ // | | | __ __ __ __

| // | P0.0--P0.7|===>;| | | | | | | | | | // | (a,b...g,h)| | |--| |--| |--| |--| | 4位共阴数码管// | | | |__|.|__|.|__|.|__|.| // | | ----------------------- // | |

| | | | // | | | | | | // | P2.7(COM3)|--------+ | | | // | |

| | // | P2.6(COM2)|-------------+ | | // | | | | // | P2.5(COM1)|------------------+

// | | | // | P2.4(COM0)|-----------------------+ // +---------------+ #include // 函数声明 //=============================================== ======================== void DisplayNumber(unsigned int Num); void delayms( int ms); //=============================================== ======================== unsigned char code LED_table[]={

基于51单片机的LED数码管动态显示

NDM XTW2 potm 畑 PO^.I P0v.l m\ JO.TAI 啊 P2.W 細 iSEiT ALE ER卩2訥 92辄 MJ 儿1辽帽 112w S13阳F m PR #15P35/ MJ 基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段 时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共 端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O 口。 1 硬件设计 利用51单片机的P0 口输出段码,P2 口输出位码,其电路原理图如下所示。 在桌面上双击图标,打开 ISIS 7 Professional窗口(本人使用的是 v7.4 SP3中文版)。单击菜单命令“文件新建设计”,选择DEFAULT模板,保存文件名为“ DT.DSN ”。在器件选择按钮中单击“P”按钮,或执行菜单命令“库”7“拾取元件/符号”,添加如下表所示的元件。 51单片机AT89C51 —片 晶体 CRYSTAL 12MHz —只 瓷片电容CAP 22pF 二只 电解电容CAP-ELEC 10uF —只 电阻RES 10K 一只 电阻RES 4.7K四只 双列电阻网络 Rx8 300R( Q ) 一只

四位七段数码管 7SEG-MPX4-CA —只 三极管PNP 四只 若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是 默认的。 在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。2软件设计 LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X( N-1 )),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。

利用8259A中断实现LED灯和数码管显示实验

实验三:利用8259A中断实现LED灯和数码管显示实验 安全0901 王宇航 09283020 实验报告 1.实验目的: 了解8259中断控制器的基本使用,掌握中断程序编程技术。同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。 2.实验步骤: 8254A的OUT1输出接到8259A的MIR5上,每秒产生一次中断信号向8259A发出中断请求,在中断程序里将连接在8255A口的LED灯按照中断次数二进制点亮(即中断一次L0亮,中断两次L1亮,中断三次L1L0亮,中断四次L2亮……)。同时在数码管低位上显示中断次数。满10次后停止。 1.8254A在主程序中初始化。 CLK0工作在方式3,则控制字为00110110B,计数常数设为1000; CLK1工作在方式3,则控制字为01110110B,计数常数设为1000,则OUT1输出为1HZ 的方波。 2.8255A在使用前需要在主程序中初始化。 A口方式0输出,B口方式0输入,则控制字为10000011B。 3.8259A不用初始化,但在程序中需要包含以下几个部分: (1)8259A的MIR5对应的中断向量号为35H,需用此来设置中断入口地址。 (2)设置中断入口地址之后,需设置中断屏蔽字OCW1,使IR5请求被允许,其他请求被禁止。 (3)中断服务程序结束之前写OCW2,送中断结束命令EOI。 4.中断服务程序的主要功能是LED指示灯和数码管显示。

图3-1 实验连线图 注意:实验系统的主8259A的片选信号为20H。 3.实验代码: .Model small .386 DATA SEGMENT DATA0 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;分别对应字符0-9 COUNT DB 10;计数值为10 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX;DS装入段基址 LEA SI,DATA0;取操作数DATA0的16位偏移地址送到寄存器SI中;8254初始化 MOV DX,203H;8254命令口 MOV AL,00110110B;控制字--0通道、方式3(方波发生器)、二进制计数OUT DX,AL;将控制字写入命令口 MOV DX,200H;0通道的数据口 MOV AX,1000;计数常数=1000 OUT DX,AL;先写入低字节 MOV AL,AH OUT DX,AL;再写入高字节 MOV DX,203H;8254命令口 MOV AL,01110110B;控制字1通道、方式3(方波发生器)、二进制计数OUT DX,AL MOV DX,201H;1通道的数据口 MOV AX,1000;计数常数=1000 OUT DX,AL MOV AL,AH OUT DX,AL;8255初始化

相关文档
最新文档