数码管显示转换的电压值数码管显示秒表

合集下载

制作一个LED数码管显示的秒表

制作一个LED数码管显示的秒表

计算机科学与工程系实验报告实验题目:制作一个LED数码管显示的秒表班级:姓名:学号:日期:一、实验目的掌握单片机使用定时计数器控制LED数码管的设计与软件编程二、实验要求1、用2位数码管显示计时时间,最小计时单位为“百毫秒”,计时范围0.1~9.9s;2、当第1次按下并松开计时功能键时,秒表开始计时并显示时间;3、第2次按下并松开计时功能键时,停止计时,计算两次按下计时功能键的时间,并在数码管上显示;4、第3次按下计时功能键,秒表清0,再按1次计时功能键,重新开始计时。

5、如果计时到9.9s时,将停止计时,按下计时功能键,秒表清零,再按下重新开始计时。

三、实验要求提交的实验报告中应包括:电路原理图、实验设计思路、C51源程序(含注释语句)、运行效果(含运行截图与说明)、实验小结三、硬件电路原理图的设计四、编程思路及C51源程序编程思路:使用外中断服务处理程序处理按键,内部设计一个计数器,记录按键按下的次数,根据按键次数完成相应的功能。

用数码管显示计时时间,根据按键的次数以及其功能来显示数字。

#include<reg51.h> //包含8051单片机寄存器定义的头文件unsigned char code discode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef} unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char timer=0; //记录中断次数unsigned char second; //存储秒数unsigned char key=0; //记录按键次数main() //主函数{TMOD=0x01; //定时器T0方式1定时ET0=1; // 允许定时器T0中断EA=1; // 总中断允许second=0; //设初始值P0=discode1[second/10]; //显示秒位P2=discode2[second%10]; //显示0.1S位while(1) //循环{if((P3&0x80)==0x00) //当按键被按下时{key++; //按键次数加一switch(key) //根据按键次数分三种情况{case 1: //第一次按下为启动秒表表示TH0=0xee; //TL0=0x00; //TR0=1; //break; //case 2: //按下两次暂停秒表TR0=0; //break; //case 3: //按下三次秒表清零key=0; //second=0; //P0=discode1[second/10]; //P2=discode2[second%10]; //break;}while((P3&0x80)==0x00); //如果按键时间过长在此循环}}}}void int_t0() interrupt 1 using 0 //定时器T0中断子程序{TR0=0; //停止计时,执行以下操作(计时出现误差)TH0=0xee; //向TH0写入初值的高8位TL0=0x00; //向TL0写入初值的低8位,定时5mstimer++; //记录中断次数if (timer==20) //中断20次,20*5ms=100ms=0.1s{timer=0; //中断次数清0second++; //加0.1sP0=discode1[second/10]; //根据计时时间,即时显示秒位P2=discode2[second%10]; //根据计时时间,即时显示0.1s位}if(second==99) //当计时到9.9s时{TR0=0; //停止计时second=0; //秒数清0key=2; //按键数置2,当再次按下按键时,key++,即key=3,秒表清0复原}else //计时不到9.9s时{TR0=1; //继续计时}}五、仿真运行效果展示1、第一次按键,秒表开始计时,并计时到9.92、2次按键,停止计时,将计时的时间值送到数码管显示3、第3次按下计时功能键,秒表清零六、实验小结在实验的过程中,出现过几次错误,自己对理论知识了解的还不够透彻,所幸,通过自己思考解决了。

数码管显示

数码管显示
数码管显示
课题目标
本课题的任务是用单片机实现简易数字 显示,演示效果如图4-1所示。通过编程, 学会在单片机上实现一位数字和多位数字 的静态和动态显示控制方法,以及不同进 制计数的程序编写方法。
图4-1 数码管显示实物图
任务一 LED数码管的静态显示
本任务就是将单片机与数码管接成图 4-2所示静态显示方式,编程实现数码管 每隔0.5s的0-9数字显示。
图4-7 动态显示结构图
1、C语言程序:
#include <AT89X51.h> #define uchar unsigned char unsigned char code
tabledu[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char code
tablewe[]={0x1f,0x3f,0x5f,0x7f,0x9f, 0xbf,0xdf,0xff};
unsigned char dispcount; void delay02s(void) { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--);} void main(void) { while(1)
图4-5
1、C语言程序: #include <AT89X51.h> #define uchar unsigned char sbit a=P0^5; sbit b=P0^6; sbit c=P0^7; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char dispcount; void delay02s(void) { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--); }

秒表-八位数码管显示

秒表-八位数码管显示

秒表-八位数码管显示1;************************************************************************** 2; 标题: 秒表-八位数码管显示(汇编)3; 作者: wentao 4; 5; 日期: 2007.3.36; 软件: Keil A51 V8.007; 芯片: AT89X518; 说明: 实验板实测通过,数码管为8位共阳9; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!10;************************************************************************** 1112dot_l equ 30h ;30单元存储百分之一秒值13dot_h equ 31h ;31单元存储十分之一秒值14sec_l equ 32h ;32单元存储秒个位值15sec_h equ 33h ;33单元存储秒十位值16min_l equ 34h ;34单元存储分个位值17min_h equ 35h ;35单元存储分十位值18hou_l equ 36h ;36单元存储时个位值19hou_h equ 37h ;37单元存储时十位值2021dot equ 38h ;38单元为百分之一秒计数器(0.00s-0.99s)22sec equ 39h ;39单元为秒计数器(00s-59s)23min equ 40h ;40单元为分计数器(00m-59m)24hou equ 41h ;41单元为时计数器(00h-00h)2526dis_b equ 42h ;dis_b(42单元)作为位码选通数码管27dis_r equ 43h ;dis_r(43单元)为取段码时的偏移量2829key_t equ 44h ;44单元为键按下的次数标记3031K bit p1.4 ;K键与P1.4相连3233 org 0000h34 ajmp start35 org 000bh ;定时器0的中断入口地址36 ajmp time0 ;跳到定时器0的中断服务程序处37 org 001bh ;定时器1的中断入口地址38 ajmp time1 ;跳到定时器1的中断服务程序处39 org 0030h40start:41 mov p2,#0xff ;关所有数码管42 mov p1,#0xff ;p1为准双向口,作输入时先写14344 mov dis_b,#0x7f ;初始选通P2.7口数码管45 mov dis_r,#0 ;初始化偏移量为046 mov dot,#0 ;百分之一秒计数器清零47 mov sec,#0 ;秒计数清零48 mov min,#0 ;分计数清零49 mov hou,#0 ;时计数清零50 mov key_t,#0 ;键按下次数清零5152 mov tmod,#00010001b ;定时/计数器0、1工作于方式153 mov th0,#0xd8 ;预置定时常数55536(d8f0),产生10ms时基信号54 mov tl0,#0xf055 mov th1,#0xfc ;预置定时常数64536(fc18),产生1ms间隔用于动态显示56 mov tl1,#0x185758 setb ea ;开总中断59 setb et0 ;定时/计数器0允许中断60 setb et1 ;定时/计数器1允许中断61 clr tr0 ;关定时/计数器062 setb tr1 ;开定时/计数器16364lop:65 jb K,lop ;键(P1.4)未按下则返回66 lcall d_10ms ;延时10ms消抖67 jb K,lop ;是抖动则返回重新扫描68 jnb K,$ ;等待键松开69 lcall key_to ;调用键处理部分70 ajmp lop ;循环显示7172key_to: ;键处理子程序73 inc key_t ;键按下次数加174 mov a,key_t ;按下次数送入a75 cjne a,#1,key_2 ;不是1次继续检测是否是第2次76 setb tr0 ;第1次按下启动定时器077 ret78key_2: cjne a,#2,key_3 ;也不是2次继续检测是否是第3次79 clr tr0 ;第2次按下关闭定时器080 ret81key_3: cjne a,#3,back ;也不为3则结束82 mov dot,#0 ;第3次按下将四个计数器清零83 mov sec,#084 mov min,#085 mov hou,#086 mov key_t,#0 ;按键次数清零87back: ret88;--------------------------------------------------------------------------------89time0: ;定时器0中断服务程序90 push psw ;保护现场91 push acc9293 inc dot ;百分之一秒计数器加194 mov a,dot ;计数器值送入a95 cjne a,#100,over ;未计到100则返回继续计数96 mov dot,#0 ;计到100后清零97 inc sec ;秒计数器加1(进位10ms*100=1s)98 mov a,sec ;秒计数值送入a99 cjne a,#60,over ;未计到60则返回继续计数100 mov sec,#0 ;计到60后秒计数器清零101 inc min ;分计数器加1(进位60s=1m)102 mov a,min ;分计数值送入a103 cjne a,#60,over ;未计到60则返回继续计数104 mov min,#0 ;计到60后分计数器清零,重新计时105 inc hou ;时计数器加1(进位60m=1h)106 mov a,hou ;时计数器送入a107 cjne a,#100,over ;未计到100则返回继续计数108 mov hou,#0 ;计到100后清零109110over: mov th0,#0xd8 ;重置定时常数111 mov tl0,#0xf0112 pop acc ;恢复现场113 pop psw114 reti ;中断返回115;--------------------------------------------------------------------------------116time1: ;定时器1中断服务程序117 push psw ;保护现场118 push acc119 push b120 ;以下是百分之一秒计数器值个位十位分开121 mov a,dot ;百分之一秒计数器值送入a(被除数)122 mov b,#10 ;除数10送入b123 div ab ;a除以b124 mov dot_l,b ;余数b(百分之一秒值)送入百分之一秒存储单元125 mov dot_h,a ;商a(十分之一秒值)送入十分之一秒存储单元126 ;以下是秒计数器值个位十位分开127 mov a,sec ;秒计数器值送入a(被除数)128 mov b,#10 ;除数10送入b129 div ab130 mov sec_l,b ;余数b(秒个位值)送入秒个位存储单元131 mov sec_h,a ;商a(秒十位值)送入秒十位存储单元132 ;以下是分计数器值个位十位分开133 mov a,min ;分计数器值送入a(被除数)134 mov b,#10 ;除数10送入b135 div ab136 mov min_l,b ;余数b(分个位值)送入分个位存储单元137 mov min_h,a ;商a(分十位值)送入分十位存储单元138 ;以下是时计数器值个位十位分开139 mov a,hou ;时计数器值送入a(被除数)140 mov b,#10 ;除数10送入b141 div ab142 mov hou_l,b ;余数b(小时个位值)送入时个位存储单元143 mov hou_h,a ;商a(小时十位值)送入时十位存储单元144145 mov dptr,#table ;数码管段码表首址送入dptr146147 mov a,#dot_l ;取百分之一秒值的地址148 add a,dis_r ;基址+偏移量149 mov r0,a ;R0为欲显示值的地址150 mov a,@r0 ;取欲显示值送入a151 ; dis_r : 0 1 2 3 4 5 6 7152 ;对应单元: dot_l dot_h sec_l sec_h min_l min_h hou_l hou_h153 movc a,@a+dptr ;取对应值的段码154 mov p2,dis_b ;位码送入P2口155156 mov r0,dis_b ;取位码判断是否为需加小数点的位[liuwentao]157 cjne r0,#0xdf,b3 ;不是P2.5再判断是否为P2.3158 ajmp add_dot ;是P2.5则段码加上小数点显示159b3: cjne r0,#0xf7,b1 ;也不是P2.3再判断是否为P2.1160 ajmp add_dot ;是P2.3则段码加上小数点显示161b1: cjne r0,#0xfd,com ;也不是P2.1则正常送段码162163add_dot: anl a,#0x7f ;是P2.5,P2.3,P2.1则段码和7f做与操作使对应位显示小数点164com: mov p0,a ;段码送入P0口165166 inc dis_r ;偏移量加1,下次中断时显示下个数167 anl dis_r,#0x07 ;dis_r增到8时自动清0(使之在0到7间循环)168169 mov a,dis_b ;位码循环右移,下次中断时选通下个数码管170 rr a171 mov dis_b,a172173 mov th1,#0xfc ;重置定时常数174 mov tl1,#0x18175176 pop b177 pop acc ;恢复现场178 pop psw179 reti180181d_10ms: mov r5,#20 ;1+(1+2*255)*20+2*20=10.261ms@12M182temp1: mov r6,#255 ;1+2*255183 djnz r6,$184 djnz r5,temp1185 ret186187table: db 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf ;段码表188 ; 0 1 2 3 4 5 6 7 8 9 - 对应内容189190end191/************************************************************************** 192* 标题: 八位数码管显示(C51)193* 作者: wentao 194 195* 日期: 2007.3.3196* 软件: Keil C51 V8.02197* 芯片: AT89X51198* 说明: 实验板实测通过,数码管为8位共阳199* 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!200**************************************************************************/ 201202#include <reg51.h>203#include <intrins.h>204#define uchar unsigned char205206void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255207void key_scan(); // 按键扫描208void key_to(); // 按键处理209210uchar code dis_code[11] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表211 // 0 1 2 3 4 对应内容212 0x92,0x82,0xf8,0x80,0x90,0xbf};213 // 5 6 7 8 9 -214215uchar data dis[8]; // dis[0]为百分之一秒值,dis[1]为十分之一秒值216 // dis[2]为秒个位值,dis[3]为秒十位值217 // dis[4]为分个位值,dis[5]为分十位值218 // dis[5]为时个位值,dis[6]为时十位值219220uchar data dot = 0; // 百分之一秒计数器(0.00s-0.99s)221uchar data sec = 0; // 秒计数器(00s-59s)222uchar data min = 0; // 分计数器(00m-59m)223uchar data hou = 0; // 时计数器(00h-99h)224225uchar data dis_b; // dis_b为位码选通数码管226uchar data dis_r; // dis_r为取段码时的偏移量227228uchar data key_t = 0; // 按键次数,初始为0229230sbit K = P1^4; // K键与P1.4相连231232void main()233{234 P2 = 0xff; // 关所有数码管235 P1 = 0xff; // p1为准双向口,作输入时先写1236 dis[2] = 10; // '-'在段码表中偏移量为10237 dis[5] = 10; // '-'在段码表中偏移量为10238 dis_b = 0x7f; // 初始选通P2.7口数码管239 dis_r = 0; // 初始化偏移量为0240241 TMOD = 0x11; // 定时/计数器0,1工作于方式1242 TH0 = 0xd8; // 预置定时常数55536(d8f0),产生10ms时基信号243 TL0 = 0xf0;244 TH1 = 0xfc; // 预置定时常数64536(fc18),产生1ms间隔用于动态显示245 TH1 = 0x18;246 EA = 1; // 开总中断247 ET0 = 1; // 定时/计数器0允许中断248 ET1 = 1; // 定时/计数器1允许中断249 TR0 = 0; // 关闭定时/计数器0250 TR1 = 1; // 启动定时/计数器1251 while(1)252 {253 if(K != 1) // 有键按下254 {255 delay_ms(10); // 延时10ms去抖256 if(K != 1) // 确定是有键按下257 {258 while(K != 1); // 等待键松开259 key_to(); // 按键处理260 }261 }262 }263}264void key_to() // 按键处理子程序265{266 key_t++; // 按键次数加1267 if(key_t == 1) // 第一次按下268 TR0 = 1; // 启动定时器0269 else270 {271 if(key_t == 2) // 第二次按下272 TR0 = 0; // 关闭定时器0273 else274 {275 if(key_t == 3) // 第三次按下276 {277 dot = 0; // 四个计数器清零278 sec = 0;279 min = 0;280 hou = 0;281 key_t = 0; // 按键次数清零282 }283 }284 }285286}287void tiem0(void) interrupt 1 // T/C0中断服务程序(产生10ms时基信号) 288{289 dot++; // 百分之一秒计数器加1290 if(dot == 100) // 计数值到100291 {292 dot = 0; // 清零293 sec++; // 秒计数器加1(进位10ms*100=1s)294 if(sec == 60) // 秒计数值到60295 {296 sec = 0; // 秒计数器清零297 min++; // 分计数器加1(进位60s=1m)298 if(min == 60) // 分计数到60299 {300 min = 0; // 分计数器清零301 hou++; // 时计数器加1(进位60m=1h)302 if(hou == 100) // 时计数器到100303 hou = 0; // 时计数器清零304 }305 }306 }307 TH0 = 0xd8; // 重置定时常数308 TL0 = 0xf0;309}310void time1(void) interrupt 3 // T/C1中断服务程序(延时1ms数码管动态显示) 311{312 uchar data t = 0; // 段码临时变量313314 dis[0] = dot % 10; // 百分之一秒计数器个位分离出来赋绐dis[0] 315 dis[1] = dot / 10; // 百分之一秒计数器十位分离出来赋绐dis[1] 316 dis[2] = sec % 10; // 秒计数器个位赋绐dis[2]317 dis[3] = sec / 10; // 秒计数器十位赋绐dis[3]318 dis[4] = min % 10; // 分计数器个位赋绐dis[4]319 dis[5] = min / 10; // 分计数器十位赋绐dis[5]320 dis[6] = hou % 10; // 时计数器个位赋绐dis[6]321 dis[7] = hou / 10; // 时计数器十位赋绐dis[7]322323 t = dis_code[dis[dis_r]]; // 取出段码放入临时变量t324325 // 判断位码如果为显示P2.5,P2.3,P2.1则对应段码应加上小数点显示326 // 和0x7f(01111111)做与操作使原段码加上小数点变为新段码327328 if(dis_b == 0xdf | dis_b == 0xf7 | dis_b == 0xfd)329 t &= 0x7f;330331 P2 = dis_b; // 位码送P2口332 P0 = t; // 段码送P0口333334 dis_r++; // 偏移量加1,下次中断时显示下个数335 dis_r &= 0x07; // dis_r增到8时自动清0(使之在0到7间循环) 336337 dis_b = _cror_(dis_b,1); // 位码循环右移,下次中断时选通下个数码管338339 TH1 = 0xfc; // 重置定时常数340 TL1 = 0x18;341342}343void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255344{345 uchar i;346 while(ms--)347 for(i = 0; i < 124; i++);348}广州珍珠岩,广州珍珠岩厂 Ce57uICIJeu8。

数电课程设计:电子秒表

数电课程设计:电子秒表

数电课程设计:电子秒表
电子秒表是一种常见的计时工具,它通过使用电子元件实现高精度的计时功能。

下面是一个基于数电的电子秒表的设计方案:
1. 运算部分设计:
- 使用一个1Hz的时钟源,可以通过计数器或者振荡器实现。

- 使用一个可重置的二进制计数器,位数根据需要的计时范
围确定。

例如,如果计时范围为1小时,可使用一个4位二进制计数器。

- 计时开始/停止控制逻辑:这可以通过一个开关电路实现,可以使用一个门电路或者触发器电路。

- 计数器重置逻辑:可以使用一个按钮或者开关来重置计数
器的值。

2. 显示部分设计:
- 使用数码管或者液晶显示器来显示计时结果。

数码管可以
使用共阳或者共阴的7段数码管。

- 使用译码器将计数器的二进制输出转换为译码信号,用于
控制数码管显示的数字。

3. 其他功能:
- 可以添加一个暂停功能,通过一个按钮或者开关来实现。

当计时中按下暂停按钮时,计时器会停止计数,再次按下暂停
按钮时,计时器继续计数。

- 可以添加一个拆表功能,通过一个按钮或者开关来实现。

按下拆表按钮时,计时器会记录当前的计时值,然后重置为0,再次按下拆表按钮时,计时器恢复原来的计时状态。

该设计方案中的电子秒表可根据实际需求进行调整和扩展,例如增加更多的功能按钮、调整计时范围和精度等。

同时,需要注意电路的稳定性和可靠性,以及对供电电源和信号的处理。

《数码管显示》课件

《数码管显示》课件
具有高亮度、高对比度、低功耗等优点,是未来显示技术的发展方向之一。
具有高分辨率、低成本等优点,但存在视角较小、响应速度较慢等问题。
LCD显示器
具有高亮度、长寿命、低功耗等优点,但存在色彩表现较差等问题。
LED显示器
05
CHAPTER
数码管显示的实际应用案例
数码管常用于智能家居控制面板,显示温度、湿度、时间等信息,方便用户了解家居环境状况。
《数码管显示》ppt课件
目录
数码管显示概述数码管显示原理数码管显示驱动电路数码管显示技术发展趋势数码管显示的实际应用案例
01
CHAPTER
数码管显示概述
是一种通过控制LED灯的亮灭来显示数字或字符的电子显示器件。
数码管显示器

发光原理
显示效果
利用LED灯的发光特性,通过导通或截止控制LED灯的亮灭,以显示不同的数字或字符。
数码管显示器具有高亮度、高清晰度、低功耗等优点,常用于各种电子设备中。
03
02
01
按位数分类
01
一位、两位、三位、四位等数码管显示器,位数越多,可以显示的数字或字符越多。
按显示内容分类
02
七段数码管显示器、点阵式数码管显示器等,不同的显示内容适用于不同的应用场景。
按控制方式分类
03
静态数码管显示器、动态数码管显示器,静态数码管显示器直接控制每个LED灯的亮灭,而动态数码管显示器则是通过扫描方式控制LED灯的亮灭。
02
CHAPTER
数码管显示原理
数码管内部由多个LED灯珠组成,每个灯珠都有一个阴极和阳极,通过控制阴极和阳极的电压来控制灯珠的亮灭。
发光原理
数码管通常有单色和双色两种类型,单色数码管只能发出红、绿、黄等单色光,而双色数码管则能发出红、绿、黄等两种颜色。

单片机的4位数码管秒表

单片机的4位数码管秒表

原理图:源程序:/*************************************************************标题:定时器中断精确到00.01的秒表效果:能清零重新开始,暂停,继续计时,能精确到0.01秒作者:皖绩小挺说明:使用12M晶振,四位数码管,3个按键****************************************************************/ #include<reg52.h>#define uint unsigned int#define uchar unsigned charuint temp,tt,qian,bai,shi,ge;sbit smg_q=P1^0;sbit smg_b=P1^1;sbit smg_s=P1^2;sbit smg_g=P1^3;sbit key1 = P3^7;sbit key2 = P3^6;sbit key3 = P3^5;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点void keyscan();void display(uint shi,uint ge);void delay(uint z);void init();/************************************************************** 主函数******************************************************************/void main(){init();//初始化子程序while(1){if(tt==1){tt=0;temp++;if(temp==10000){temp=0;}qian=temp/1000;bai=temp%1000/100;shi=temp%100/10;ge=temp%10;}keyscan();display(shi,ge);}}/********************************************************************* 延时***********************************************************************/ void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*********************************************************************按键控制***********************************************************************/ void keyscan(){if(key1==0) //清零并重新开始计时{temp=0;TR0=1;}if(key2==0) //暂停计时{TR0=0;}if(key3==0) //继续计时{TR0=1;}}/********************************************************************* 显示***********************************************************************/ void display(uint shi,uint ge){smg_q=0;P0=table[qian];delay(1);smg_q=1;P0=0xff;smg_b=0;P0=table1[bai];delay(1);smg_b=1;P0=0xff;smg_s=0;P0=table[shi];delay(1);smg_s=1;P0=0xff;smg_g=0;P0=table[ge];delay(1);smg_g=1;P0=0xff;}/********************************************************************* 初始化***********************************************************************/ void init(){smg_q=1;smg_b=1;smg_s=1;smg_g=1;temp=0;TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;}/********************************************************************* 中断***********************************************************************/ void t0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;tt++;}。

实验二 数码管显示

实验二 数码管显示

实验二数码管显示本实验的目的是掌握数码管的工作原理与使用,实现数码管的静、动态显示。

静态数码管我们先看看什么是数码管,上图就是各种长相各种样子的数码管了,肯定很眼熟了吧。

不管将几位数码管连在一起,数码管的显示原理都是一样的,都是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。

数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示一个8字需要7个小段,另外还有一个小数点,所以其内部一共有8个小的发光二极管,最后还有一个公共端,生产商为了封装统一,单位数码管都封装10个引脚,其中第3和第8引脚是连接在一起的。

而它们的公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。

上图展出了常用的两种数码管的引脚排列和内部结构。

总所周知,点亮发光二极管就是要给予它足够大的正向压降。

所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。

如上图左(一共a、b、c、d、e、f、g、DP 八段),如果要显示“1”则要点亮b、c 两段LED;显示“A”则点亮a、b、c、e、f、g 这六段LED;我们还知道,既然LED 加载的是正向压降,它的两端电压必然会有高低之分:如果八段LED 电压高的一端为公共端,我们称之为共阳极数码管(如上图中);如果八段LED 电压低的一段为公共端,则称之为共阴极数码管(上图右)。

所以,要点亮共阳极数码管,则要在公共端给予高于非公共端的电平;反之点亮共阴极数码管,则要在非公共端给予较高电平。

对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴”,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。

当我们给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮了。

如果想要显示出一个8字,并且把右下角的小数点也点亮的话,可以给8个阳极全部送高电平,如果想让它显示出一个0字,那么我们可以除了给第“g, dp”这两位送低电平外,其余引脚全部都送高电平,这样它就显示出0字了。

原创数码管动态显示时间(0-999秒倒计时)

原创数码管动态显示时间(0-999秒倒计时)

数码管动态显示时间(0-999秒倒计时)原理图:
控制部分
数码管时间显示,微动按键时间调整,工作手具转换,启动和复位程序。

1.待机:时间显示010秒.D6灯亮,此时ZHH,GZ无输出。

2.转换键:待机D5和D6状态可相互转换,开机常态体腔指示灯亮ZHH,GZ无输出。

按一下转换到D5状态,D5
指示灯亮ZHH输出,再按一下转换到D6状态,体腔指示灯亮ZHH无输出。

3.“加”“减”键:可调时间000-999秒,可快加和快减时间,每秒10个数变化。

慢加和慢减时间,每按一下变化1
个数。

4.复位键:工作和报警中可用,复位到设定状态。

5.手柄启动键:设定到D6状态时,按下启动键时间以设定时间倒计时工作,此时ZHH无输出GZ输出,治疗指
示灯D4亮时间减到000后,GZ断开报警5秒治疗指示灯闪烁,返回到设定状态。

设定到D5状态时,按下启动键时间以设定时间倒计时工作,此时ZHH,GZ输出,治疗指示灯亮时间减到000后,GZ断开报警5秒治疗指示灯闪烁。

工作中除复位键外其他键不能动作。

报警中可重复启动(设定状态)。

数码管显示程序

数码管显示程序
P2=2;
while(1)
{
P0 = table[i % 16]; //在这里取 i 的个位数,不带点显示
//P0 = table_d[i % 16]; //带点显示
if(KEY == 0)
{
Delay(1); //软件消抖,试验为20ms
sbit KEY = P3^4; //独立按键的T0
/*下一行你可以试着把 code 去掉看看试验结果。 去掉后 table[] 会被存到 RAM 中,因为单片机的 RAM 比 ROM 小的多*/
/*所以,对于不会改变的值应该用 code 或者 #define 去定义,让这些固定值存到 ROM 中去*/
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*下一行的数组可以显示数值外,还可以显示数码管的点*/
uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
if(KEY == 0)
{
i++;
}
Delay(50); //延时0.5秒后进行下一次的按键检测
}
}
}
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)

七段数码管显示秒表

七段数码管显示秒表

沈阳工程学院课程设计摘要摘要本文提出了一个利用微机原理与接口技术完成秒表的设计方案,该方案主要是选择8254A的计数器0进行100ms的定时,其输出于OUT0与8259的IRQ7相连,当定时到100ms 的时候产生一个中断信号,在中断服务程序进行秒的计数,并送入相应的存储单元;8255的A口接七段数码管的位选信号,B口接七段数码管的段选信号,C口上面接键盘,通过键盘控制暂停计时、继续计时。

秒,毫秒的数值通过对8255的编程可以显示在七段数码管上面。

通过对一个基于微型计算机的能实现电子时钟的设计学习,详细介绍了微型计算机原理控制的应用中的数据转换显示,LED显示原理,微型计算机控制的定时中断原理。

从而达到学习、了解微机原理控制的相关指令在各方面的应用。

系统由8254、8255、8259等构成,能实现秒表显示的功能,能进行秒、毫秒的显示。

关键词:定时器8254A,并行通信接口芯片8255,七段数码管。

目录摘要 (I)第1章概述 (1)1.1 设计题目 (1)1.2 设计目的 (1)1.3 设备器材 (1)1.4 任务分析 (1)第2章设计原理 (3)2.1 设计原理 (3)2.2 元器件功能特性 (3)2.2.1 8255简介 (3)2.2.2 8259简介 (5)2.2.3 8254简介 (6)2.2.4 七段LED数码管及其接口 (8)第3章系统设计 (9)3.1 硬件设计 (9)3.2 软件设计 (9)第4章系统实现 (11)4.1 概述 (11)4.2 程序模块 (11)4.2.1 主程序模块 (11)4.2.2 显示模块 (12)4.2.3 小键盘模块 (13)4.2.4 定时模块 (13)4.2.5 中断处理模块 (14)第5章遇到的问题及解决方法 (15)5.1 遇到的问题 (15)5.2 解决的方法 (15)总结 (17)致谢 (18)参考文献 (19)附录 (20)A1.1 源程序代码 (20)第1章概述1.1 设计题目用七段LED数码管显示秒表1.2 设计目的《微型计算机原理及应用》是一门实践性较强的课程,让学生在学完该课程之后,进行一次课程设计,使学生将课堂所学的知识和实践有机结合起来,初步掌握计算机应用系统设计的步骤和接口设计的方法,提高分析和解决实际问题的能力。

LED数码管秒表的制作

LED数码管秒表的制作

LED数码管秒表的制作
一、课程设计要求及原始资料:
制作一个LED数码管显示的秒表,用2位数码管显示计时时间,最小计时单位为“百毫秒”,计时范围0.1~9.9s。

当第一次按下并松开计时功能键时,秒表开始计时并显示时间;
当第二次按下并松开计时功能键时,停止计时,计算两次按下计时功能键的时间,并把时间值送入数码管显示;
当第三次按下计时功能键时,秒表清零,等待下一次按下计时功能键。

如果计时到9.9s时,将停止计时,按下计时功能键,秒表清零,再按下重新开始计时。

二、课程设计进度:
三、主要参考文献:
[1]张毅刚.单片机原理及应用[M].北京:高等教育出版社,2010
[2]张毅刚.单片机原理及接口技术[M].北京:人民邮电出版社,2008
[3]张毅刚.基于Proteus的单片机课程的基础实验与课程设计[M].北京:人民邮
电出版社,2013
专业班级学生课程设计工作起止时间
课程设计评语。

电子技术课程设计---秒表数码显示电路数字秒表电路设计

电子技术课程设计---秒表数码显示电路数字秒表电路设计

电子技术课程设计---秒表数码显示电路数字秒表电路设计一,课题名称秒表数码显示电路数字秒表电路设计二,设计要求1. 设计1MHz时钟:2.完成0~59小时59分59秒范围内的计时:3.通过按键设置计时起点与终点,计时精度为10ms:4. 计时暂停、恢复和清零功能;5. 计时时间报警功能;三,比较和选定设计的系统方案,画出系统框图1.1,课题分析与方案确定本题要求计数至59时59分59秒,所以要用到六个数码管。

计数精度为10ms,及计数分辨率为0.01秒,所以需要相应的信号发生器。

暂停功能和清零功能通过开关进行控制。

最终方案是使用六个74LS160,六个数码管,以及两个VCC来进行设计,总体采用同步预置法。

1.2,总体设计方案及系统框图数字式秒表,必须有数字显示。

按设计要求,必须用数码管来做显示器。

题目要求59时59分59秒,则需要六个数码管。

要求计数分辨率为0.01秒,则需要相应频率的信号发生器。

总体上,采用六个74LS160计数器。

使用同步预置法,实现59时59分59秒的计时。

将两个74LS160组合,并通过同步预置法实现六十进制,六个计数器分成三组,分别对应时、分、秒的功能。

四,单元电路设计、参数计算和器件选择1.1,各个模块单元设计74LS160 芯片同步十进制计数器(直接清零)作用:1、用于快速计数的内部超前进位.2、用于n 位级联的进位输出.3、同步可编程序.4、有置数控制线.5、二极管箝位输入.6、直接清零.7、同步计数.74LS160的功能真值表。

功能表:图20引脚图:图21逻辑符号及其引脚功能图:图2274ls160中的ls代表为低功耗肖特基型芯片。

74160为标准型芯片。

结构功能一样。

2、160为可预置的十进制计数器,共有54/74160 和54/74LS160 两种线路结构型式,其主要电器特性的典型值如表3-1(不同厂家具体值有差别): 异步清零端/MR1 为低电平时,不管时钟端CP信号状态如何,都可以完成清零功能。

第9章 用LED数码管显示的秒表设计

第9章 用LED数码管显示的秒表设计

图9-4 定时器中断程序
程序清单见课程设计指导书或配套仿真软件
5
9.4 仿真与实验结果
图9-5 按下Stop按键时的仿真结果
6
9.4 仿真与实验结果
图9-6 按下S 用LED数码管显示的秒表设计
9.1 项目任务 9.2 硬件设计 9.3 程序设计 9.4 仿真与实验结果
1
秒表是一个重要的计时工具,可用于比赛计时、实验研究以及生 活计时等。
2
9.1 项目任务
用STC89C52单片机与两位数码管设计并制作一个秒表,实现 电子秒表的基本功能,显示时间为00~59,每秒自动加1,至59 秒后再回到00,继续循环。运用“开始”、“暂停”、“复位” 按键实现对秒表计时控制。
3
9.2 硬件设计
图9-2 LED数码管显示的秒表设计电路原理图 4
9.3 程序设计
开始 定时器初始化 开中断、开始计时
1秒时间到? N
Y 1秒标志位清0,秒加1
秒=60? N
停止键按下? N
继续计时?
Y 秒计数器清零 Y
停止计时 结束
开始 定时器重新置初值 50ms中断次数加1
结束
显示秒
图9-3 主程序流程图

3位数码管秒表,精确到1%

3位数码管秒表,精确到1%

话说经过大概2天的奋战,终于把带停表,开始计时功能的秒表完成了!误差在可以接受的范围内,运行90多秒,大概会有0。

2秒的误差,一般用途还是够了吧。

上一篇《用数码管显示1到9》已经为本文打下不少基础,对于怎样显示数字,我就不多做说明了。

秒表有3位,第一位是10位,第二位是个位,还有一位是小数点第一位,个位后面带个小数点,只要在那个位的字符上加上0×80即可。

但是P0,8个引脚,一个位锁存器,一个段锁存器,那些LED显示数字的引脚都是并联的,如果3位同时亮了,那么显示的数字3个都是一样的。

怎让让3个显示不同的内容,我想了挺久,也参照了一下51HEI给的程序,后来发现有个东西叫动态扫描。

动态扫描:轮流向各位数码管送入数据,并且将数据输入速度控制在人肉眼所分辨不出来的范围内,利用发光二极管的余晖让人的视觉能够识别的过程。

知道上面的做法之后就可以在一个循环频率很高的循环里分别设置3个位要显示的数据,比如设置完第一位的数据后设置第二位的数据,再设置第三位的数据,这3个操作的间隔也是很短的,也就几十个机器周期。

几十个机器周期也是很短的几十微秒级别的时间,速度太快了!人眼是不可能分辨出来滴。

于是我先把00.0在数码管上点亮,不过在这里也遇到了一个问题,本该在二位上的小数点却同时出现第三位上,而且第二位和第三位的0的亮度比小数点的亮度大,这个问题也困扰了我不久。

后来看了一下代码,找到了答案,按照我代码的模式,U1开,传送字符,U1关,U2开,选位,U2关。

单个位的显示几是这样的,这样做有个问题,在选完位之后,下一次U1开的时候传进去的字符会显示在当前的位上,直到下一次U2再打选位的时候才显示在下一个位上。

为了解决这个问题,我在每次传送字符,选位之后,再传送一次字符,传进去的字符呢,就是让数码管灭了,这样互相就不会有干扰了。

知道了怎样三个位分别显示不同的数字之后,接下来就是让数码管的数字随时间更新啦,比较精确的计时呢就是用单片机内部的计时器,关于计时器的使用,请在上一篇《用数码管显示1到9》中查找,这里关于定时器,只多加计时器中断的内容,中断的概念就不用我多讲,只讲怎么用,中断要用的特殊功能寄存器(SFR) IE,其结构如下图:最高位,EA是中断总开关,ET0代表计时器0中断开关,当EA和ET0,TR0,都打开的并且TF0为1的时候,程序会跳入到中断1中,而1刚好是ET0在IE中的第二位。

数码管时分秒动态显示

数码管时分秒动态显示

数码管时分秒动态显示1、目的:数码管显示时、分、秒,实现计时功能。

2、原理:定时器产生中断,一秒钟计数一次,计数值转换成时、分、秒后,数码管动态显示。

3、原理图4、函数思路。

单片机工作频率是12MHZ,定时器12分频后累加计数,也就是1us计数一次。

定时一秒,定时器装入初值50000,则需进入中断20次,才能实现(50000*20=100000=1s)!数码管动态显示,要求控制显示延时时间和消隐。

累计计数转换成时、分、秒,转换思路是计数分割。

一分等于60,秒,一小时等于60分。

计数累加,计数一次,秒加1,;计数60次,分加1,;计数3600次,时加1.计数86400次,24小时满,而后计数清零。

5、程序#include<reg52.H>#include<intrins.H> // 加载头文件#define uchar unsigned char // 宏定义无符号字符型#define uint unsigned long int // 宏定义无符号长整型uint num ; // 定义num和cunt为全局变量,全局更改有效uchar cunt ;uchar tab1[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 数码管段选编码高电平有效uchar code tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //数码管位选编码,低电平有效void display(uint num ); // 显示函数函数声明void delay (); // 延时函数声明void init () // 中断初始化{TMOD=0x01; // 设置定时器T0为16位定时模式TH0=(65535-50000)/256; // T0装入初值50000TL0=(65535-50000)%256; // / 取整,%取余。

数码管显示模拟电压值

数码管显示模拟电压值

a) 把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。

b) 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。

c) 把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。

d) 把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。

e) 把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。

f) 把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。

g) 把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。

h) 把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。

i) 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。

设计内容由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的P3.3端口上,也就是要求从 P3.3输出CLK信号供ADC0809使用。

因此产生CLK信号的方法就得用软件来产生了;由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。

实际显示的电压值(D/256*VREF)C语言源程序#include <AT89X52.H>unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsigned char dispbuf[8]={10,10,10,10,0,0,0,0}; unsigned char dispcount;unsigned char getdata;unsigned int temp;unsigned char i;sbit ST=P3^0;sbit OE=P3^1;sbit EOC=P3^2;sbit CLK=P3^3;void main(void){ST=0;OE=0;ET0=1;ET1=1;EA=1;TMOD=0x12;TH0=216;TL0=216;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=1;ST=1;ST=0;while(1){if(EOC==1){OE=1;getdata=P0;OE=0;temp=getdata*235;temp=temp/128;i=5;dispbuf[0]=10;dispbuf[1]=10;dispbuf[2]=10;dispbuf[3]=10;dispbuf[4]=10;dispbuf[5]=0;dispbuf[6]=0;dispbuf[7]=0;while(temp/10){dispbuf[i]=temp%10;temp=temp/10;i++;}dispbuf[i]=temp;ST=1;ST=0;}}}void t0(void) interrupt 1 using 0{CLK=~CLK;}void t1(void) interrupt 3 using 0 {TH1=(65536-4000)/256;TL1=(65536-4000)%256;P1=dispcode[dispbuf[dispcount]]; P2=dispbitcode[dispcount];if(dispcount==7){P1=P1 | 0x80;}dispcount++;if(dispcount==8){dispcount=0;}}。

单片机数码管秒表程序

单片机数码管秒表程序

单片机数码管秒表程序
数码管秒表是一种常见的计时工具,它利用单片机控制数码管的显示来实现计时功能。

下面我将为大家介绍一种基于单片机的数码管秒表程序。

程序的实现思路如下:首先,我们需要使用单片机的定时器来实现时间的计数。

通过设置定时器的计数周期和中断处理函数,我们可以在每个固定的时间间隔内进行一次计数。

然后,我们需要将计数的结果通过数码管进行显示。

为了方便显示,我们可以将计数结果分为小时、分钟和秒三个部分,分别显示在数码管的不同位上。

程序的具体实现步骤如下:
1. 初始化单片机的定时器,并设置计数周期为1秒。

2. 设置一个全局变量来保存计数的结果,初始值为0。

3. 在定时器的中断处理函数中,每次中断时将计数结果加1。

4. 在主函数中,设置一个循环来不断检测计数结果的变化,并将其转换为时、分、秒的形式。

5. 将转换后的时、分、秒分别显示在数码管的不同位上,通过控制数码管的引脚来实现。

通过以上步骤,我们就可以实现一个简单的数码管秒表程序。

当程序运行时,数码管会不断地显示计时结果,从0开始递增,以秒为单位。

当需要停止计时时,可以通过外部按键等方式来暂停或重置计数结果。

这种数码管秒表程序可以广泛应用于各种计时场景,比如运动比赛、实验计时等。

它的实现简单、成本低廉,并且可以精确地显示时间,非常实用。

希望通过以上介绍,大家对基于单片机的数码管秒表程序有了更深入的了解。

希望这个简单的程序能够帮助大家更好地实现计时功能,提高工作和学习的效率。

谢谢大家!。

用LED数码管显示的秒表设计

用LED数码管显示的秒表设计

课程设计说明书用LED数码管显示的秒表设计专业新能源科学与工程学生姓名班级学号指导教师完成日期用LED数码管显示的秒表设计摘要:对采用LED数码管显示的秒表进行了设计。

所设计的秒表,可通过两位数码管显示00-59。

每秒自动加一。

在对系统功能分析的基础上,采用AT89C52单片机。

相对而言比较简单,贴近书本,比较熟悉。

对所要实现的功能也能很好地满足,焊接也比较简单。

设计主要采用硬件和软件两部分。

硬件包含数码管按钮模块、单片机控制模块、数码管显示模块、驱动电流放大模块。

按钮模块采用独立式按键,控制模块选用AT89C52单片机,显示模块采用两位数码管,放大模块选用NPN三极管。

软件采用模块化的程序,分为主程序和定时器计时服务子程序。

在多孔板上制作了LED数码管显示的秒表,使用protus完成了系统仿真,对硬件和软件部分分别进行了调试,进行了软硬件联调,最后调试成功样机实物,完成了毕业设计任务书的要求。

关键词:单片机;数码管;秒表A stopwatch design with LED digital tube displayAbstract: For the LED digital tube display of a stopwatch is used for design. The stopwatch, designed by two digital tube display 00 ~ 59. Automatically add a per second.On the basis of the analysis of system function, using the AT89C52 single chip microcomputer. Relatively simple, close to the book, familiar with. To in order to realize the function also can well satisfy, welding is more simple. The design mainly adopts two parts of hardware and software. Hardware consists of digital tube button module, single-chip microcomputer control module, digital tube display module, the drive current amplifier module. Button module USES the independent type key, choose AT89C52 single chip microcomputer control module, using two digital tube display module, amplifier module selects the NPN transistor. Software adopts the modular program, main program and timer timing service subroutine.On the perforated plate made of LED digital tube display a stopwatch, use protus completed system simulation, the hardware and the software part, has carried on the debugging, the software and hardware alignment, the final debugging success physical prototype, completed the graduation design specification requirements.Key Words:Single chip microcomputer; Digital tube; A stopwatch.用LED数码管显示的秒表设计目录1. 概述 (1)1.1 课题研究背景与意义 (1)1.2 课题设计内容 (1)2. 系统设计 (1)2.1 设计方案论证 (1)2.2 系统硬件设计 (2)2.2.1 主控模块 (2)2.2.2 秒表按钮模块 (4)2.2.3 LED数码管显示模块 (5)2.2.4 放大模块 (6)2.3.1 主程序模块 (6)2.3.2 定时器中断程序 (6)3. 系统调试 (8)3.1 硬件调试 (8)3.1.1 静态检查 (8)3.1.2 通电检查 (8)3.2 软件调试及软硬件联调 (8)3.2.1仿真调试 (8)3.2.2 实物调试 (9)3.2.3 实验结果 (9)4. 结束语 (11)附录1:用LED数码管显示的秒表设计原理图图纸 (15)附录2:用LED数码管显示的秒表设计的元器件目录表 (16)附录3:用LED数码管显示的秒表设计程序清单 (17)盐城工学院课程设计说明书( 2015)用LED数码管显示的秒表设计1.概述1.1 课题研究背景与意义随着电子技术的发展,电子技术在各个领域的运用也越来越广泛。

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

数码管显示转换的电压值数码管显示秒表标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]电子科技大学微电子与固体电子学院实验报告实验名称现代电子技术综合实验姓名:詹朋璇学号:20评分:教师签字电子科技大学教务处制电子科技大学实验报告学生姓名:詹朋璇学号: 20 指导教师:熊万安实验地点: 211大楼308 实验时间:2014. 晚一、实验室名称:单片机技术综合实验室实验项目名称:数码管显示A/D转换的电压值&数码管显示秒表二、实验学时: 12三、实验目的与任务:1、熟悉系统设计与实现原理2、掌握KEIL C51的基本使用方法3、熟悉实验板的应用4、连接电路,编程调试,实现各部分的功能5、完成系统软件的编写与调试四、实验器材1、PC机一台2、实验板一块五、实验原理、步骤及内容试验要求:数码管的第1位显示任务号1,第3位到第5位显示、A/D转换的电压值,可调节电压,第7、8位显示两位学号;数码管第2位和第6位显示“-”号;按按键key1进行切换,此时数码管第1位显示任务号2,第7、8位显示循环倒计时的秒表,范围为08秒到01秒后,再过01秒,秒表又显示为08秒;(单片机系统中利用定时器/计数器计数秒表的值:利用定时器T0延时1秒进行计数。

),其它位显示不变,按按键key2时,秒表停止计数,再按按键key2时,秒表继续计数,按key1键,又回到任务1的显示状态。

当电压值大于2伏时,按按键不起作用。

1、硬件设计(可打印)2、各部分硬件原理(可打印)数码管动态扫描TLS549ADC工作时序图3、软件设计按下服务程序。

答:将KEY1与KEY2键通过跳线分别接到INT0与INT1接口上。

开启中断:SysInit(){ …EA=0; 用单片机开发板上丰富的资源可以实现一个有一定功能的系统。

2.懂得利用中断可以使单片机的效率提高。

六、对本实验过程及方法、手段的改进建议实在是没有,都挺好的。

七、附录1、程序/*利用TLC549 A/D转换器实现电压测量与显示*/#include <> //包含8051的SFR寄存器定义头文件#include <> //扩展并行接口所需的绝对地址访问库函数#define LED_dig XBYTE[0x9000] //8位数码管显示器的位选输出控制#define LED_seg XBYTE[0x8000] //8位数码管显示器的段码(字形码)输出控制#define KEY_IN XBYTE[0x8000]//定义TLC549操作接口sbit ADC_CS = P1^7;sbit ADC_DATA = P1^6;sbit ADC_CLK = P1^5;code unsigned char disp_seg[]= //显示段码{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5f,0 x79,0x71,0x40,0x00,0xff};// 0 1 2 3 4 5 6 7 8 9 a b c d e f - blank,全亮unsigned char DispBuf[8]; //定义显示缓冲区(由定时中断程序自动扫描)unsigned char key_value,flag;//定义键盘返回值,任务标志unsigned char y1000,y100,y10,y;//定义秒表的个位,十分位,百分位,千分位unsigned short mbiao;//定义秒表计数单元void delay(int ms); //延时大约1msunsigned char ReadAdc(void);//读取A/D转换结果void AdcInit(void); //初始化ADC接口void key_scan(void);void main(){unsigned char i=0;unsigned char volt, x100, x10, x;TMOD &= 0x0f;TMOD |= 0x10;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;ET1 = 1;TMOD &= 0xf0;TMOD |= 0x01;TH0 = 0xFC;TL0 = 0x66;TR0 = 1;ET0 = 1;EA =1;AdcInit();for(i=0; i<8; i++)DispBuf[i] = 17; //全部8位显示灭y1000=9;y100=9;y10=9;y=9;mbiao=9999;flag=0;while(1){while(flag ==0){volt = ReadAdc(); //得到A/D转换结果的数字量(0x00~0xff)volt = volt * 250/256; //转换成电压值,其中Vr=x100 = volt/100;x10 = (volt - x100*100)/10;x = (volt - x100*100)%10;DispBuf[0] = 4;DispBuf[1] = 2;DispBuf[2] = 16;DispBuf[3] = x;DispBuf[4] = x10;DispBuf[5] = x100;DispBuf[6] = 16;DispBuf[7] = 1;delay(100);if(key_value == 8&&volt<=200){flag =1;mbiao=9000;while(key_value == 8);}}while(flag==1){TR0=1;volt = ReadAdc();volt = volt * 250/256; //转换成电压值,其中Vr=x100 = volt/100;x10 = (volt - x100*100)/10;x = (volt - x100*100)%10;DispBuf[0] = y1000;DispBuf[1] = 0;DispBuf[2] = 16;DispBuf[3] = x;DispBuf[4] = x10;DispBuf[5] = x100;DispBuf[6]=16;DispBuf[7]=2;if(key_value == 8&&volt<=200){flag = 0;while(key_value == 8);} else if(key_value == 7&&volt<=200){flag = 2;while(key_value == 7);}}while(flag==2){TR0=!TR0;if(key_value == 7){flag = 1;while(key_value == 7);} }}}/*函数:T1INTSVC()功能:定时器T1的中断服务函数*/void T1INTSVC() interrupt 3{code unsigned char com[] ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};static unsigned char n = 0;TR1 = 0;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;LED_dig = 0xFF; //暂停显示if(flag==0){if(n==5)LED_seg = ~(disp_seg[DispBuf[n]]|0x80);elseLED_seg = ~disp_seg[DispBuf[n]];//更新扫描数据}if(flag==1){ if(n==5)LED_seg = ~(disp_seg[DispBuf[n]]|0x80);elseif(n==4)LED_seg = ~( disp_seg[DispBuf[n]] ); //更新扫描数据,elseLED_seg = ~disp_seg[DispBuf[n]]; //更新扫描数据}if(flag==2){LED_seg = ~disp_seg[DispBuf[n]]; //更新扫描数据}LED_dig = ~com[n]; //重新显示key_scan();n++;n &= 0x07;}void delay(int ms){unsigned int i,j;for(i=0; i<ms; i++) //延时大约1ms (fosc={for(j=0; j<100; j++);}}/*函数:ReadAdc()功能:读取A/D转换结果返回:8位ADC代码*/unsigned char ReadAdc(void){unsigned char d; //读取得ADC结果unsigned char n; //ADC bit位计数ADC_CS = 0;n = 5;while ( --n != 0 ); //模拟tsu时间n = 8;do{d <<= 1;if ( ADC_DATA )d = d | 0x01; //或d++;ADC_CLK = 1;ADC_CLK = 0;}while ( --n != 0 );ADC_CS = 1;return d;}/*函数:AdcInit()功能:初始化ADC接口*/void AdcInit(void){ADC_CS = 1;ADC_CLK = 0;ADC_DATA = 1;ReadAdc(); //空读一次,用于启动一次A/D转换过程}void key_scan(void){unsigned char key_in;key_in = KEY_IN;switch(key_in){case 0xff:key_value = 0;break;case ~0x01:key_value = 1;break;case ~0x02:key_value = 2;break;case ~0x04:key_value = 3;break;case ~0x08:key_value = 4;break;case ~0x10:key_value = 5;break;case ~0x20:key_value = 6;break;case ~0x40:key_value = 7;break;case ~0x80:key_value = 8;break;default:break;}}/*函数:T1INTSVC()功能:定时器T0的中断服务函数*/void T0INTSVC() interrupt 1{TR0 = 0;TH0 = 0xFC;TL0 = 0x66;TR0 = 1;if(mbiao<=9000&&TR0==1)mbiao=mbiao-1;if(mbiao==0)mbiao=9000;y1000=mbiao/1000;y100=(mbiao-y1000*1000)/100;y10=(mbiao-y1000*1000-y100*100)/10;y=(mbiao-y1000*1000-y100*100)%10; }。

相关文档
最新文档