实验五_外部中断控制数码管显示实验
单片机数码管显示实验总结

单片机数码管显示实验总结单片机数码管显示实验总结一、实验目的本次实验旨在通过单片机控制数码管显示,掌握数码管的工作原理、编程控制方法以及单片机与数码管的接口技术。
通过实验,提高自己的动手能力和编程技能,为今后的学习和实际工作打下坚实的基础。
二、实验原理数码管是一种常用的电子显示器件,它由多个LED组成,通过控制各个LED的亮灭来显示不同的数字或字符。
本次实验采用的是共阴极数码管,它由8个LED组成,通过单片机控制每个LED的亮灭状态来显示不同的数字或字符。
三、实验步骤1.硬件准备(1)选择合适的单片机开发板,如Arduino、STM32等。
(2)购买数码管及相应的驱动电路。
(3)准备杜邦线、电阻、电容等电子元件。
2.硬件连接(1)将数码管与单片机开发板连接起来。
(2)根据数码管驱动电路的要求,连接电源、地线和控制信号线。
(3)连接电源后,打开开发板电源,观察数码管的显示效果。
3.编程控制(1)在开发板上编写程序,控制数码管显示不同的数字或字符。
(2)使用相应的编译器将程序编译成可执行文件,上传到开发板上。
(3)观察数码管的显示效果,调试程序,使其达到预期效果。
4.测试与评估(1)在不同情况下测试数码管的显示效果,如按键输入、传感器数据等。
(2)对程序进行优化和改进,提高程序的效率和稳定性。
(3)总结实验过程中的问题和解决方法,为今后的学习和实际工作提供参考。
四、实验结果及分析1.实验结果在实验过程中,我们成功地实现了对数码管的编程控制,使其能够根据不同的输入显示不同的数字或字符。
同时,我们也发现了一些问题,如数码管的亮度不够、显示的数字不清晰等。
经过调试和改进,我们解决了这些问题,使数码管的显示效果更加理想。
2.结果分析通过本次实验,我们深入了解了数码管的工作原理和编程控制方法,掌握了单片机与数码管的接口技术。
同时,我们也发现了一些问题,如数码管的亮度不够、显示的数字不清晰等。
这些问题的出现可能与硬件连接、编程控制等方面有关。
51单片机实验报告

实验一:开发环境的搭建一、(1)、keil的安装与破解点击Keil安装包,一键傻瓜式操作,安装完成后以管理员身份打开Keil,在File里选择license management 把CID复制到注册机里的CID栏,注册机里的Target选择C51,然后点击Generate,将生成的激活码复制到license management里的LIC栏,并点击Add LIC,即完成破解。
(2)、CH340驱动安装(3)、普中烧录软件的使用波特率选择9600,速度选择低速,文件路径选择HEX文件的路径(4)、keil的使用新建工程并保存,在CPU 里面选择STC90C52RC ,再新建C 文件,注意保存时手动加上.c 后缀,再在Source Group 1 右击选择 Add Files to Group'Source Group 1'找到刚才新建的C 文件,然后找到图标并点击,再Target 里将晶振频率改为12MHz,将Output 里生成HEX 文件的勾打上即可生成HEX 文件。
(5)、protues的安装与破解双击安装包开始安装,等进入到Labcenter Licence Manager1.6,也就是许可证管理页面,点击Browse For Key File,找到下载解压软件包中的LICENCE.lxk文件,并打开,再点击install,再点击“是”,继续傻瓜式操作。
破解时以管理员身份运行破解软件,目标文件里找到安装的路径,再点击升级,即可完成破解。
(6)、protues的使用双击蓝色ISIS图标即可打开Proteus,File里新建并保存,然后点击“P”即可选择自己所需元器件,输入AT89C52单片机,确定后在图纸中点击即可,双击单片机将对话框中的Program File 选择Keil生成的HEX文件,电路及程序都完成后,点击左下角即可开始仿真,点击停止仿真。
二、实验结论在实验一里学会了开发环境的搭建,学会并熟练了Keil u Vision4 和Proteus 7.8以及普中烧录软件的使用,基本实现了用Keil编写程序并且生成HEX文件,能够用Proteus 画基本仿真图并且成功实现仿真,在仿真过程中出现了win10电脑不能正常实现仿真的问题,在经过百度等多方面查找之后找到了如下解决办法:1、路径上不能有中文2、仿真时出现cannot open'C:User\?\AppData\Local\Temp\LISA5476.SDF'的错误时:右击我的电脑-属性-高级系统设置-环境变量,在“用户变量”栏里找到TEMP与TMP,分别双击,将变量值都改为%SystemRoot%\TEMP如果还不行将下面的“系统变量”栏里的TEMP与TMP同样修改方法,如果没有新建就行。
《FPGA设计与应用》数码管显示实验

《FPGA设计与应用》数码管显示实验一、实验目的1.学习动态数码管的工作原理;2.实现对EGO1开发板四位动态数码管的控制;二、实验内容实现对EGO1开发板四位动态数码管的控制,使其能够正常工作;三、实验要求在EGO1开发板上显示想要的数字。
四、实验背景知识1.LED数码管基础知识在数码管上显示数字就是将相应的段位点亮组成要显示的数字,共阴数码管的码值表如下所示,‘1’代表相应的管脚输出高电平,点亮相应段位,‘0’代表相应的管脚输出低电平,不点亮相应段位。
2.动态数码管原理EGO1 开发板上使用的是共阴极动态数码管,这种数码管有四个共阴极分别选通对应的每位数码管,四位数码管的八个段码脚连接在一起。
动态数码管显示的原理是:每次选通其中一位,送出这位要显示的内容,然后一段时间后选通下一位送出对应数据,4 个数码管这样依次选通并送出相应的数据,结束后再重复进行。
这样只要选通时间选取的合适,由于人眼的视觉暂留,数码管看起来就是连续显示的。
五、实验方案及实现1、数码管显示的设计共分3个模块:(1)数码管封装模块(2)数码管设计模块(3)顶层模块数码管封装模块代码:module smg_ip_model(clk,data,sm_wei,sm_duan);input clk;input [15:0] data;output [3:0] sm_wei;output [7:0] sm_duan;integer clk_cnt;reg clk_400Hz;always @(posedge clk)if(clk_cnt==32'd100000)begin clk_cnt <= 1'b0; clk_400Hz <= ~clk_400Hz;endelseclk_cnt <= clk_cnt + 1'b1;reg [3:0]wei_ctrl=4'b1110;always @(posedge clk_400Hz)wei_ctrl <= {wei_ctrl[2:0],wei_ctrl[3]}; reg [3:0]duan_ctrl;always @(wei_ctrl)case(wei_ctrl)4'b1110:duan_ctrl=data[3:0];4'b1101:duan_ctrl=data[7:4];4'b1011:duan_ctrl=data[11:8];4'b0111:duan_ctrl=data[15:12];default:duan_ctrl=4'hf;endcasereg [7:0]duan;always @(duan_ctrl)case(duan_ctrl)4'h0:duan=8'b0011_1111;4'h1:duan=8'b0000_0110;4'h2:duan=8'b0101_1011;4'h3:duan=8'b0100_1111;4'h4:duan=8'b0110_0110;4'h5:duan=8'b0110_1101;4'h6:duan=8'b0111_1101;4'h7:duan=8'b0000_0111;4'h8:duan=8'b0111_1111;4'h9:duan=8'b0110_1111;4'ha:duan=8'b0111_0111;4'hb:duan=8'b0111_1100;4'hc:duan=8'b0011_1001;4'hd:duan=8'b0101_1110;4'he:duan=8'b0111_1000;4'hf:duan=8'b0111_0001;数码管设计模块module test(clk,data);input clk;output [15:0]data;reg clk_1Hz;integer clk_1Hz_cnt;always @(posedge clk)if(clk_1Hz_cnt==32'd2*******-1)begin clk_1Hz_cnt <= 1'b0; clk_1Hz <= ~clk_1Hz;end elseclk_1Hz_cnt <= clk_1Hz_cnt + 1'b1;reg [39:0]disp=40'h1234567890;reg [15:0]data;always @(posedge clk_1Hz)begindisp <= {disp[35:0],disp[39:36]};data <= disp[39:24];endEndmodule顶层模块module smg_ip(clk,sm_wei,sm_duan);input clk;output [3:0]sm_wei;output [7:0]sm_duan;wire [15:0]data;wire [3:0]sm_wei;wire [7:0]sm_duan;test U0 (.clk(clk),.data(data));smg_ip_model U1(.clk(clk),.data(data),.sm_wei(sm_wei),.sm_duan(sm_duan)); endmodule六、实验结果Vivado仿真:上实验板实操:七、实验心得次实验主要学习了利用vivado软件实现数码管的显示,利用编程来实现,并且还对动态数码管的原理进行了一定的学习,包括上次实验学习到的模块化设计,方便程序的调试,程序运行过程中并不顺利,一直没有创建出pin文件夹,最后还是在老师的帮助下完成了pin文件夹的创建,导入到板子后完成了本次实验的设计。
基础实验(数码管显示)含代码

实验一基础实验(数码管显示)一、实验内容使用MCS-51汇编语言编写程序,完成如下功能:1. 使用三个数码管显示十进制数值(001~999,可任意设置);2. 每隔1秒,该数值自动减一,直到归零;3. 归零后的下一秒,显示一个新的十进制数值(001~999,可任意设置);4. 每隔1秒,新数值继续自动减一,直到再次归零;5. 重新执行步骤1,循环往复。
6. 当开关S1按下时,暂停计数;S1松开时,恢复计数。
二、数码管显示原理如图所示,三段式数码管由三片74HC164级联控制三个数码管的显示,其中使用单片机P4.5作为模拟串口数据,使用P4.4模拟串口时钟,CLR端接高电平。
使用上一个74HC164的Q7作为下一个74HC164的输入端。
要想输出一个字形码,就需要从高位到低位依次向移位寄存器输出8个比特。
移位寄存器的数据线和时钟线分别接到单片机的P4.5和P4.4管脚,可以使用MCS-51里面的位操作指令进行输出。
连续输出3个字形,24个bit之后,欲显示的字形将稳定地显示在数码管上,程序可以转而执行其他工作。
三、实验流程图1.主程序流程图开始初始化定义计数器R6,R5,R4定义码表TAB 0-9根据R6偏移从TAB取数送到算术寄存器A中调用SHOW子程序根据R5偏移从TAB取数送入算术寄存器A中调用SHOW子程序根据R4偏移从TAB取数送入算术寄存器A中调用SHOW子程序调用延时子程序S1按下?是循环延时否R6减一即个位减一R6为-1?是R5减一即十位减一重新初始化R6否R5为-1?否是R4减一即百位减一重新初始化R5R4为-1?重新初始化R4否2.显示子程序SHOW 流程图3.延时子程序DELAY 流程图子程序SHOW 开始R0初始化计数时钟置0右移AC 标志位送入DATA时钟置1,上跳R0=0?是RET否子程序DELAY 开始RI 初始化为80R3减一R3为0?是R2减一R2为0?是R1减一是R1为0?否R2初始化为200R3初始化为250否否是四、程序源代码 0000H2.LJMP START 0050H4.START:5.P4 EQU 0C0H6.P4SW EQU 0BBH7.CLK EQU P4.48.DAT EQU P4.59.SW EQU P3.610.MOV P4SW, #70H11.LP:12. MOV R6, #913. MOV R5, #914. MOV R4, #915.LOOP:16. MOV DPTR, #TAB17. MOV A,R618. MOV DPTR,#TAB19. MOVC A,@A+DPTR20. LCALL SHOW21.22. MOV A,R523. MOV DPTR,#TAB24. MOVC A,@A+DPTR25. LCALL SHOW26.27. MOV A,R428. MOV DPTR,#TAB29. MOVC A,@A+DPTR30. LCALL SHOW31. LCALL DELAY32.33.PAUSE:34. NOP35. JNB SW,PAUSE36. DEC R637. CJNE R6,#-1,LOOP38.39. DEC R540. MOV R6,#941. CJNE R5,#-1,LOOP42. DEC R443. MOV R5,#944. CJNE R4,#-1,LOOP45. MOV R4,#946. LJMP LOOP47.48.SHOW:49. MOV R0,#850.SLP:51. CLR CLK52. RLC A53. MOV DAT,C54. SETB CLK55. DJNZ R0,SLP56. RET57.58.DELAY:59. MOV R1,#8060.SD:61. MOV R2,#20062.SD1:63. MOV R3,#25064.SD2:65. DJNZ R3,SD266. DJNZ R2,SD167. DJNZ R1,SD68.RET69.70.TAB:71. DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H72.73.74.END75.TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H五、思考题1.MCS51中有哪些可存取的单元,存取方式如何?它们之间的区别和联系有哪些?答:MCS51单片机中,包含程序存储器ROM、数据存储器RAM和特殊功能寄存器(SFRs),其中数据存储器还包含内部RAM,内部扩展RAM和片外RAM。
《微机原理与接口技术》实验指导书

《微机原理与接口技术》课程实验指导书实验内容EL-8086-III微机原理与接口技术教学实验系统简介使用说明及要求✧实验一实验系统及仪器仪表使用与汇编环境✧实验二简单程序设计实验✧实验三存储器读/写实验✧实验四简单I/0口扩展实验✧实验五8259A中断控制器实验✧实验六8253定时器/计数器实验✧实验七8255并行口实验✧实验八DMA实验✧实验九8250串口实验✧实验十A/D实验✧实验十一D/A实验✧实验十二8279显示器接口实验EL-8086-III微机原理与接口技术教学实验系统简介使用说明及要求EL-8086-III微机原理与接口技术教学实验系统是为微机原理与接口技术课程的教学实验而研制的,涵盖了目前流行教材的主要内容,该系统采用开放接口,并配有丰富的软硬件资源,可以形象生动地向学生展示8086及其相关接口的工作原理,其应用领域重点面向教学培训,同时也可作为8086的开发系统使用。
可供大学本科学习《微机原理与接口技术(8086)》,《单片机应用技术》等课程提供基本的实验条件,同时也可供计算机其它课程的教学和培训使用。
为配合使用EL型微机教学实验系统而开发的8086调试软件,可以在WINDOWS 2000/XP等多种操作系统下运行。
在使用本软件系统调试程序时,可以同时打开寄存器窗口、内存窗口、反汇编窗口、波形显示窗口等等,极大地方便了用户的程序调试。
该软件集源程序编辑、编译、链接、调试与一体,每项功能均为汉字下拉菜单,简明易学。
经常使用的功能均备有热键,这样可以提高程序的调试效率。
一、基本特点EL型微机教学实验系统是北京精仪达盛科技有限公司根据广大学者和许多高等院校实验需求,结合电子发展情况而研制的具有开发、应用、实验相结合的高科技实验设备。
旨在尽快提高我国电子科技发展水平,提高实验者的动手能力、分析解决问题能力。
系统具有以下特点:1、系统采用了模块化设计,实验系统功能齐全,涵盖了微机教学实验课程的大部分内容。
数字显示器实验报告

一、实验目的1. 了解数字显示器的基本原理和分类。
2. 掌握数字显示器的设计方法和应用。
3. 学会使用数码管和LCD显示器进行数字显示。
4. 提高动手实践能力和问题解决能力。
二、实验内容1. 数码管显示实验2. LCD显示器显示实验三、实验原理1. 数码管显示原理:数码管是一种半导体发光器件,由若干个发光二极管(LED)组成,每个LED代表一个数码管的笔画。
通过控制LED的亮灭,可以显示不同的数字和字符。
2. LCD显示器显示原理:LCD显示器是一种液晶显示器,通过液晶分子的旋转控制光的透过与阻挡,实现图像的显示。
LCD显示器主要由液晶面板、背光源、偏振片、驱动电路等组成。
四、实验步骤1. 数码管显示实验(1)搭建电路:将数码管与AT89C51单片机连接,连接方式包括共阴极和共阳极两种。
(2)编写程序:使用C语言编写程序,实现数码管显示数字和字符。
(3)调试程序:使用Keil软件对程序进行编译和调试,观察数码管显示效果。
2. LCD显示器显示实验(1)搭建电路:将LCD显示器与AT89C51单片机连接,连接方式包括并行和串行两种。
(2)编写程序:使用C语言编写程序,实现LCD显示器显示数字和字符。
(3)调试程序:使用Keil软件对程序进行编译和调试,观察LCD显示器显示效果。
五、实验结果与分析1. 数码管显示实验结果:通过编写程序,数码管能够显示数字和字符,实现了实验目的。
2. LCD显示器显示实验结果:通过编写程序,LCD显示器能够显示数字和字符,实现了实验目的。
3. 分析:(1)数码管显示实验:在实验过程中,发现数码管的共阴极和共阳极连接方式不同,需要根据实际连接方式编写程序。
此外,为了提高显示效果,需要对数码管进行动态扫描显示。
(2)LCD显示器显示实验:在实验过程中,发现LCD显示器的并行和串行连接方式不同,需要根据实际连接方式编写程序。
此外,为了提高显示效果,需要对LCD显示器进行初始化和设置显示模式。
EDA设计课程实验报告数码管动态显示实验报告
EDA设计课程实验报告实验题目:数码管动态显示实验学院名称:专业:电子信息工程班级:姓名:高胜学号小组成员:指导教师:一、实验目的学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
二、设计任务及要求1、在SmartSOPC实验箱上完成数码管动态显示自己学号的后八个数字。
2、放慢扫描速度演示动态显示的原理过程。
三、系统设计1、整体设计方案数码管的八个段a,b,c,d,e,f,g,h(h是小数点)都分别连接到SEG0~SEG7,8个数码管分别由八个选通信号DIG0~DIG7来选择,被选通的数码管显示数据,其余关闭。
如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG0~DIG7分别被单独选通,并在此同时,在段信号输入口SEG0~SEG7加上该对应数码管上显示的数据,于是随着选通信号的扫描就能实现动态扫描显示的目的。
虽然每次只有1个数码管显示,但只要扫描显示速率足够快,利用人眼的视觉余辉效应,我们仍会感觉所有的数码管都在同时显示。
2、功能模块电路设(1)输入输出模块框图(见图1)图1(2)模块逻辑表达(见表1)表1(数码管显示真值表)clk_1k dig seg↑01111111 C0↑10111111 F9注:数码管显示为01180121(3)算法流程图(见图2)(4)Verilog源代码module scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0]count; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule四、系统调试(1)仿真代码`timescale 1ns/1nsmodule scan_ledfz;reg clk_1k;reg[31:0] d;wire[7:0] dig;wire[7:0] seg;parameter dely=100;scan_led u1(clk_1k,d,dig,seg);always #(dely/2)clk_1k=~clk_1k;initial beginclk_1k=0;d=32'h01180134;#dely ;#dely ;#dely ;#dely ;#dely ;#(dely*20);#dely $finish;endinitial $monitor($time,,,"%b,%d,%h,%h",clk_1k,d,dig,seg); endmodulemodule scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0] count=3'b000; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule位码代码仿真代码`timescale 1ns/1nsmodule smg_tp; //测试模块的名字reg [2:0] c; //测试输入信号定义为reg型wire[7:0] dig; //测试输出信号定义为wire型parameter DEL Y=100; //延时100秒wei u1(c,dig); //调用测试对象initial begin //激励波形设定c=3'b0;#DEL Y c=3'b001 ;#DEL Y c=3'b010 ;#DEL Y c=3'b100 ;#DEL Y c=3'b101 ;#DEL Y c=3'b110 ;#DEL Y c=3'b111 ;#DEL Y $finish;endinitial $monitor($time,,,"dig=%d,c=%b ",dig,c); //输出格式i定义endmodulemodule wei(c,dig); //命名模块名字input[2:0] c;output[7:0] dig; //定义输入与输出reg[7:0] dig_r;reg[2:0] c_r; // 定义dig_r与c_r2个reg型数据assign dig=dig_r; //将reg型数据转化为wire型数据always @(*) //检测c_r的数据是否变化begin c_r=c;case (c_r)3'b000:dig_r=8'b11111110; //c_r的数据变化而dig_r对于的数据变化3'b001:dig_r=8'b11111101;3'b010:dig_r=8'b11111011;3'b011:dig_r=8'b11110111;3'b100:dig_r=8'b11101111;3'b101:dig_r=8'b11011111;3'b110:dig_r=8'b10111111;3'b111:dig_r=8'b01111111;default: dig_r=8'b11111111;endcase //结束case语句end //结束always语句endmodule //结束程序译码器代码仿真代码`timescale 1ns/1nsmodule duan_tp; //测试模块的名字reg[3:0] a; //测试输入信号定义为reg型wire[7:0] seg; //测试输出信号定义为wire型parameter DEL Y=100; //延时100秒duan u1(a,seg); //调用测试对象initial begin //激励波形设定a=4'b0;#DELY a=4'b0001;#DELY a=4'b0010;#DELY a=4'b0011;#DELY a=4'b0100;#DELY a=4'b0101;#DELY a=4'b0110;#DELY a=4'b0111;#DELY a=4'b1000;#DELY a=4'b1001;#DELY a=4'b1010;#DELY a=4'b1011;#DELY a=4'b1100;#DELY a=4'b1101;#DELY a=4'b1110;#DELY a=4'b1111;#DELY $finish;endinitial $monitor($time,,,"seg=%d,a=%b",seg,a); //输出格式i定义endmodulemodule duan(a,seg); //命名模块名字input[3:0] a;output[7:0] seg; //定义输入与输出reg[7:0] seg_r;reg[3:0] a_r; // 定义seg_r与a_r2个reg型数据assign seg=seg_r; //将reg型数据转化为wire型数据always @(*) //检测c_r的数据是否变化begin a_r=a;case(a_r) //七段译码4'b0000:seg_r = 8'hc0; //显示04'b0001:seg_r = 8'hf9; //显示14'b0010:seg_r = 8'ha4; //显示24'b0011:seg_r = 8'hb0; //显示34'b0100:seg_r = 8'h99; //显示44'b0101:seg_r = 8'h92; //显示54'b0110:seg_r = 8'h82; //显示64'b0111:seg_r = 8'hf8; //显示74'b1000:seg_r = 8'h80; ///显示84'b1001:seg_r = 8'h90; //显示94'b1010:seg_r = 8'h88; //显示a4'b1011:seg_r = 8'h83; //显示b4'b1100:seg_r = 8'hc6; //显示c4'b1101:seg_r = 8'ha1; //显示d4'b1110:seg_r = 8'h86; //显示e4'b1111:seg_r = 8'h8e; ///显示f endcase //结束case语句end //结束always语句endmodule //结束程序(2)仿真波形图(3)引脚图五、实验感想通过这次实验,让我学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
单片机数码管动态显示实验报告
单片机数码管动态显示实验报告单片机数码管动态显示实验程序(汇编)单片机数码管动态显示实验程序org 00hajmp headorg 0030hhead:mov sp,#0070hnum equ p0 ;p0口连接数码管reset:mov dptr ,#tabmov r0,#4sh:acall show_tabcall dptr_adddjnz r0,shmov r0 ,#4sjmp resetdptr_add:inc dptrinc dptrinc dptrinc dptrrettab :db0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;;;;;;;;;;;;;;;;;;;;; 函数的功能是用来动态显示dptr上的四个数据 ;;;;;;;;;;;;;;;;;;;;;; show_tab:clr amov r2,#0mov r3,#148mov p2,#238loop:movc a,@a+dptrmov num ,aacall delay_5msinc r2mov a,r2;调用片选函数前注意A的变化acall select_movcjne r2,#4,loopmov r2,#0clr adjnz R3,loopret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;select_mov:;p2的初值238push 0e0hmov a,p2rl amov p2,apop 0e0hretdelay_5ms:mov r6,#5signed_5ms:call delay_1msdjnz r6,signed_5msret篇二:单片机动态数码显示设计实验报告微机原理与接口技术实验报告实验题目:指导老师:班级:计算机科学与技术系姓名:动态数码显示设计2014年 12月3日实验十三动态数码显示设计一、实验目的1.掌握动态数码显示技术的设计方法。
LED数码管显示实验
一、实验目的1、熟悉LED数码管的显示原理。
2、掌握驱动数码管工作的汇编语言程序的基本方法。
二、实验内容编写程序,使实验箱上的6个数码管依次闪动显示一些字符。
例如滚动显示“123456”及“good”等。
三、数码管的字形/字位七段数码管的显示原理如图2-1所示,用一个字节的信息对一个数码管的字形进行编码,“0”亮、“1”灭。
字形码中的二进制位由低到高对应数码管的A到H。
例如“0”的字形码是11000000 B。
图2-1 数码管原理图字位码用一个字节表示,如表2-1所示。
G5到G0对应实验箱上的数码管从左到右。
表2-1 字位码表实验箱上LED数码管的端口地址是固定不变的。
字形端口的地址为0FFDCH,字位端口的地址为0FFDDH。
四、程序流程程序流程图参考图2-2。
图2-2 流程图五、实验步骤编写程序,运行程序,观察数码管显示情况。
六、实验报告要求报告内容:实验名称、姓名、班级、学号、实验目的、实验步骤、完整的源程序代码、问题、收获及总结。
提示:本实验在实验箱系统上完成,因此编程方式与PC机环境下(实验一)的编程有一些区别。
例如不能使用功能调用和中断调用,程序不能自动停止等。
程序的流程可以像参考的那样无限次循环,也可以设计成有限次循环后结束。
程序:STACKS SEGMENTORG 2000HDW 256 DUP(?)TOP LABEL WORDSTACKS ENDSCODE1 SEGMENTASSUME CS:CODE1,DS:DATAS,SS:STACKSORG 1000HSTART:MOV AX,DATASMOV DS,AXMOV AX,STACKSMOV SS,AXMOV CX,3L6:PUSH CXL5:MOV AL,20HPUSH AXMOV AL,11111001B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY1ROR AL,1PUSH AXMOV AL,10100100B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY1ROR AL,1PUSH AXMOV AL,10110000B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHCALL DELAY1ROR AL,1PUSH AXMOV AL,10011001B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY1ROR AL,1PUSH AXMOV AL,10010010B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY1ROR AL,1PUSH AXMOV AL,10000010B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY1POP CXMOV CX,3L2:PUSH CXMOV CX,50L1:PUSH CXMOV AL,20HPUSH AXMOV AL,10001001B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY2ROR AL,1PUSH AXMOV AL,10000110B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY2ROR AL,1PUSH AXMOV AL,11000111B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY2ROR AL,1PUSH AXMOV AL,11000111B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY2ROR AL,1PUSH AXMOV AL,11000000B MOV DX,0FFDCHOUT DX,ALPOP AXMOV DX,0FFDDHOUT DX,ALCALL DELAY2POP CXLOOP L1MOV AL,0MOV DX,0FFDDHOUT DX,ALCALL DELAY1POP CXLOOP L2JMP STARTDELAY1 PROC NEARMOV CX,50000DLOOP:LOOP DLOOPRETDELAY1 ENDPDELAY2 PROC NEAR MOV CX,500DLOOP1:LOOP DLOOP1 RETDELAY2 ENDPCODE1 ENDSEND START。
中断实验原理
中断实验原理
中断实验原理是指在实验过程中,对实验进行暂时中止,以便进行其他相关实验操作或检测。
其目的是为了方便实验者对实验进行进一步操作,或者为了获取实验所需数据的准确性和可靠性。
中断实验通常通过暂停实验过程,进行其他相关实验步骤或者测量操作,然后再回到原来的实验步骤继续进行。
这样可以避免某些实验步骤过长或者过复杂而导致实验过程混乱或者不连续,进而影响实验结果的问题。
为了能够准确使用中断实验原理,需要注意以下几点原则:
1. 中断实验的时间应当合理安排,以便实验操作的连贯性。
不应当在重要的数据采集或者反应进行中断,以免影响实验结果。
2. 中断实验时要注意记录实验的详细情况和操作步骤,以便后续分析实验数据。
3. 中断实验之后,需要将实验物质和仪器设备妥善保存,以免对实验结果产生不良影响。
4. 在中断实验之前,需要对实验的各个步骤进行充分的了解和准备,以便能够在中断之后方便地恢复实验操作。
综上所述,中断实验原理是通过对实验进行暂时中止,以方便实验者进行其他操作或者检测的一种实验方法。
通过合理安排
中断实验的时间和记录实验的详细过程,可以确保实验结果的准确性和可靠性。