数码管显示AD转换的电压值数码管显示秒表
制作一个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次按下计时功能键,秒表清零六、实验小结在实验的过程中,出现过几次错误,自己对理论知识了解的还不够透彻,所幸,通过自己思考解决了。
AD转换的数码管显示

AD转换的数码管显示*本例程采用AD0804 芯片,硬件电路:cs 片选端接P2.3,WR 写数据端写P3.6,RD 读数据端接P3.7,锁存端接P2.6 脚,数码管位选端分别接P3.2,P3.3,P3.4,段选端接P1 口*/#includereg52.h//头文件#define uint unsigned int//宏文件#define uchar unsigned char//宏文件uchar num;//变量void delay3(uint z); //延时定义void dissy();//延时函数定义sbit ge=P3 ;//个位定义sbit shi=P3;//十位定义sbit bai=P3;//百位定义sbit ad_cs=P2;//片选端sbit ad_wr=P3;//写数据端sbit ad_rd=P3;//读数据端sbit pian=P2;//锁存器片选void add();//ad 转换子函数void delay(uint i);//延时子函数申明uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e};//数组/************主函数**********/void main(){while(1){add();//调用AD 转换子函数dissy();//数码管显示子函数} }/************AD 转换子函数**********/void add()//AD 转换子函数{uchar i;ad_cs=1;//将片选关闭ad_cs=0;//将片选打开ad_wr=1;//写数上升沿ad_wr=0;//写数下降沿ad_wr=1;//写数上升沿P1=0xff;//送数到P0 口ad_rd=1;//读数上升沿delay(25);//延时一会儿ad_rd=0;//读数下降沿//////**************因为AD 转换时间周期长,我现在的数码管没有采用锁存器,AD 转换时间大于显示时间,所以显示时会闪烁,解决此问题方法是,连续调用了显示子程序七次,这样显示时就和AD 转换时一至,显示出来的数就不闪了********************//////for(i=0;i7;i++)//调用7 次,相当于delay(255)void dissy();//////**********************************//////num=P1;//将数给计数器num}/************显示子函数**********/void dissy()//显示子函数{P0=table[num/100];//百位显示数据bai=0;//百位打开delay(14);//延时一会bai=1;//。
秒表-八位数码管显示

秒表-八位数码管显示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。
数码管显示的简易秒表PPT学习教案

工作任务
正确连接实验箱电路
输入简易秒表程序并完成调试
根据要求修改程序并观察运行结果
完成实训报告
第3页/共20页
任务分析
用单片机实现一位数简易秒表控制,计时 范围为0~9s,并将计时时间在一位数码管 上显示出来。
数码管如何显示0-9数字?
第4页/共20页
实训电路
第5页/共20页
第16页/共20页
动动手
硬件连接 使用电子连线连接实验箱单片机输出端口与相应的数码管
端口 使用USB数据线连接电脑USB端口与单片机实验箱数据端口 全速运行,观察秒表使用效果
第17页/共20页
拓展思考
如何使六位数码管动态显示“012345”?
第18页/共20页
第19页/共20页
单片机与LED数码管接口
LED静态显示
第10页/共20页
单片机与LED数码管接口
LED静态显示
第11页/共20页
单片机与LED数码管接口
LED动态显示
第12页/共20页
单片机与LED数码管接口
动态显示是一种按位轮流点亮各位数码 管的显 示方式 ,即在 某一时 段,只 让其中 一位数 码管“ 位选端 ”有效 ,并送 出相应 的字型 显示编 码。此 时,其 它位的 数码管 因“位 选端” 无效而 都处于 熄灭状 态;
共 阳极
R U -U I
单片机与LED数码管接口
LED数码管字型编码
若将数值0送至单片机的P1口,数码管上不会 显示数 字“0” 。显然 ,要使 数码管 显示出 数字或 字符, 直接将 相应的 数字或 字符送 至数码 管的段 控制端 是不行 的,必 须使段 控制端 输出相 应的字 形编码 。 将单片机P1口的P1.0、P1.1 …P1.7八个引脚依次与数码管的a、b…f、dp 八个段 控制引 脚相连 接。如 果使用 的是共 阳极数 码管,COM端 接+5V ,要显 示数字 “0”, 则数码 管的a、 b、c、 d、e、 f六个 段应点 亮,其 它段熄 灭,需 向P1口传送数 据11000 000B( C0H) ,该数 据就是 与字符 “0”相 对应的 共阳极 字型编 码。若 共阴极 的数码 管CO M端接 地,要 显示数 字“1” ,则数 码管的b 、c两 段点亮 ,其他 段熄灭 ,需向P1口传 送数据0 000011 0(06H ),这 就是字 符“1” 的共阴 极字型 码了。
用DSP实现AD转换与数码管显示设计(实验四)

如图为 4 位数码管显示原理图,采用共阳极连接方法,即可通过将 GPIO70、 GPIO71、GPIO72、GPIO73 置 1 来控制数码管的位选(1 为选择此位);数码管 的段码输入由串行输入、并行输出的 74HC164 决定。选取 F28335 的 GPIO54SPISOMI 作为 74HC164 的数据输入端,GPIO56-SPICLK 作为 74HC164 的时钟 输入端。SPICLK 每经过一次上升沿跳变,74HC164 锁存数据就右移一位(方向 QA-QH),所以 SPISOMI 数据输出端输出数据时,数据传送采用高位到低位的 方式。 下图为 74HC164 的时序图:
SPI 结合 74HC164 实例: A、设置 SPI 下降沿触发,至少 8 位数据传输以及波特率。 B、设置 SPI 的 FIFO,禁止 SPI 中断。
2、软件设计
主函数:
开始
主循环:
初始化(时钟、GPIO 配置及 初始化、关看门狗、模式初 始化、SPI 初始化、数码管
初始化、ADC 初始化)
主循环
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //设置采样窗口时间:(15+1)
*ADCCLK
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //ADC内核时钟分频:
HSPCLK/2=6.25MHZ
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
#define SET_BIT4 GpioDataRegs.GPCSET.bit.GPIO70 = 1
//与外设板
8_LEDS 端子的 IO70 对应
#define RST_BIT4 GpioDataRegs.GPCCLEAR.bit.GPIO70 = 1
电压采集,AD转换程序,数码管显示

电压采集,AD转换程序,数码管显示#include#includesbit ADC_CS=P3^5; //片选引脚,低电平有效sbit ADC_CLK=P3^4; //ADC0832芯片的时钟输入引脚sbit ADC_DO=P3^3; //数据信号输出引脚,用于将转换的数据输给单片机sbit ADC_DI=P3^3; //数据信号输入引脚,用于通道的选择控制#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存void Delay(unsigned char x);unsigned char ReadADC(viod);unsigned char TempData[8]; //存储显示值的全局变量unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码void Display(unsigned char FirstBit,unsigned char Num);void main(){unsigned char a;a=ReadADC();while(1){TempData[0]=dofly_DuanMa[a/100];//分解显示信息,如要显示68,则68/10=6 68%10=8TempData[1]=dofly_DuanMa[(a%100)/10];TempData[2]=dofly_DuanMa[(a%100)%10];Display(2,3);}}// 延时函数void Delay(unsigned char x){unsigned char i;for(i=0;i<x;i--);}// 把模拟电压转换成八位二进制数,并返回unsigned char ReadADC(unsigned char b){unsigned char i,ch;ch=0;ADC_CS=0; //片选引脚,低电平有效,ADC_DO=0; //DO为高阻状态for(i=0;i<10;i++); //稍做延时ADC_CLK=0;Delay(2); //以上那个为准备工作ADC_DI=1;ADC_CLK=1;Delay(2); //第一个脉冲,起始位ADC_CLK=0;Delay(2);ADC_DI=1;ADC_CLK=1;Delay(2); //第2个脉冲,DI=1表示双通道单极性输入ADC_CLK=0;Delay(2);ADC_DI=1;ADC_CLK=1;Delay(2); //第3个脉冲,DI=1表示表示选择CH1,马上准备读取转换数据ADC_CLK=1;Delay(2);ADC_CLK=0;Delay(2);for(i=0;i<8;i++){ADC_CLK=1;Delay(2);ADC_CLK=0;Delay(2);ch=(ch<<1)|ADC_DO;}ADC_CS=1; //取消片选,一个转换周期结束return(ch);}void Display(unsigned char FirstBit,unsigned char Num) {unsigned char i;for(i=0;i<num;i++){DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=T empData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影}}</num;i++)</x;i--);。
5AD转换结果送数码管显示

(1)分辨率:8位;
(2)单电源:+5V;
SHR AH,1
INC BX
DEC CL
JNZ DLOOP
MOV DX,OUTBIT
MOV AL,0
OUT DX,AL
RET
DISPLAYLED ENDP
START PROC NEAR
MOV AX,DATA
MOV DS,AX
AGAIN:
MOV AL,0
MOV DX,CS0809
OUT DX,AL
MOV CX,40H
OUT DX,AL
MOV CX,40H
LOOP $
IN AL,DX
MOV DX,PA
OUT DX,AL
JMP AGAIN
CODE ENDS
ENDS START
5、程序设计
(1)编写程序,通过查询EOC转换结束信号实现A/D转换,调试并验证结果。程序如下:
MODE EQU 082H
PA EQU 9000H
CS0809 EQU 09000H
OUTBIT EQU 08002H
OUTSEG EQU 08004H
DATA SEGMENT
LEDBUF DB 2 DUP (?)
NUM DB 1 DUP (?)
DELAYT DB 1 DUP (?)
LEDMAP:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
MPS430F149单片机之_模拟电压AD转换数码管显示数值

MPS430F149单片机之_模拟电压AD转换数码管显示数值/************************************************************** ***将P6口输入的模拟电压AD转换后,从P4,P5口连接的数码管输出*************************************************************** **/#include //声明库/************************************************************** ******数据类型定义*************************************************************** ******/#define uchar unsigned char#define uint unsigned int/************************************************************** ******数码管段码定义0123456789*************************************************************** ******/ucharTable[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码uchar wei[4]={0XEF,0XDF,0XBF,0X7F};//控制位uint z,x,c,v, date=0; //定义数据类型/************************************************************** ********延时函数程序,参数i 延时时间*************************************************************** *******/void DelayMS(uint i){uint j;for(;i!=0;i--){for(j=200;j!=0;j--);}}/************************************************************** ********按键函数*************************************************************** *******/void KEY()//按键函数名{if(!(P1IN&BIT0))//判断按键按下{DelayMS(100);//消抖延时while(!(P1IN&BIT0));//判断按键松开date++;//按键数值加1}}/************************************************************** ********数码管动态扫描*************************************************************** ******/void Pre_Display(){/***********************数据转换*****************************/ z=date/1000; //求千位x=date%1000/100;//求百位c=date%100/10; //求十位v=date%10; //求个位P5OUT=wei[0]; //位控制P4OUT=Table[z]; //显示千位DelayMS(5); //延时P5OUT=wei[1]; //位控制P4OUT=Table[x]; //显示百位DelayMS(5); //延时P5OUT=wei[2]; //位控制P4OUT=Table[c]; //显示十位DelayMS(5); //延时P5OUT=wei[3]; //位控制P4OUT=Table[v]; //显示个位DelayMS(5); //延时}/************************************************************** ******I/O口初始化*************************************************************** ******/void Init_IO(void)//初始化I/O{P1DIR&=~BIT0;//设置P4口为输出P4DIR=0XFF;//设置P5口为输出P5DIR=0XFF;}/************************************************************** ******主函数*************************************************************** ******/void main(void)//主函数{Init_IO();//初始化I/OWDTCTL=WDTPW+WDTHOLD;//关闭看门狗while(1)//无限循环{KEY();//数码管显示数值Pre_Display();//数码管扫描显示函数}}/************************************************************** ******结束*************************************************************** ******/。
6.2-AD转换操作+数码管显示

6.2-AD转换操作+数码管显示//由通道A TD0进行单通道A/D转换,转换值在B口显示,并用数码管实现二进制值//与B口对应//AN7接电位器0~5V输入#include <hidef.h> /* common defines and macros */#include "derivative.h"/* derivative-specific definitions */const unsigned char DisplayDecode[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x40,~0xff,0x88,0x83,0xc6,0XA1,0x86,0x8e,0xd0,0x89};//'- ABCDEFGH'const unsigned char WeiMa[]={0xfe,0xfd,0xfb,0xf7};void display(unsigned char wei,unsigned char data);void delay_ms(int m);void dis(int time ,int a, int b, int c,int d) ;byte ad_value; //AD转换结果/*-----------------ms 级延时---------------------*/void delay_ms(int m){int i,j;for(j=0;j<m;j++)for(i=0;i<800;i++);}/***---------------初始化程序---------------***/void InitAD(void){ATD0CTL2 = 0XC0; //1100 0000 启动A/D,快速清除标志位//无等待模式,外部触发禁止(bit2=0),//中断禁止(bit1=0)ATD0CTL3 = 0X0C; //0 0001 1 00 转换序列为1 、FIFO模式启动,冻结模式下继续转换ATD0CTL4 = 0XE1; // 1 11 00001 8位精度,24个A TD采样时间// 总线(1+1)*2 = 4 分频,AD时钟= 1MHz ATD0CTL5 = 0X27; // 0 0 1 0 0 111 右对齐,无符号,连续转换,单通道, 起始通道A TD7ATD0DIEN = 0X00; // 数字输入disabled}/***---------------主程序---------------***/void main(void) {InitAD();DDRB=0XFF; // 设PORTB为输出口PORTB=0xff;DDRP=0xFF;DDRT=0xFF;EnableInterrupts; // 开放总中断for(;;) {while(!ATD0ST AT2L_CCF7); //等待转换结束,退出循环ad_value=(byte)ATD0DR7H;//左对齐,右对齐时转换结果都先存储在A TD0DRxH,后存储在A TD0DRxL.PORTB=ad_value; //PORTB输出AD转换结果,并用8个LED发光二极管显示dis(1,(ad_value%100)%10,(ad_value%100)/10,ad_value/100,0);}}void dis(int time ,int a, int b, int c,int d){int i;for(i=1;i<time*25;i++) {display(1,a);display(2,b);display(3,c);display(4,d);}}void display(unsigned char wei,unsigned char data){PTT=WeiMa[wei-1];PTP=DisplayDecode[data];delay_ms(10);}。
数码管显示两路AD转换结果(按照书上整理后的完整代码)

#define F_CPU 4000000UL //4 MHZ#include<avr/io.h>#include<util/delay.h>#define INT8U unsigned char#define INT16U unsigned int//各数字的数码管段码,最后一位为空白const INT8U SEG_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF}; //两路模拟转换结果显示缓冲,显示格式为:X.XX X.XX ,第4位和第8位不显示INT8U Display_Buffer[]={0,0,0,10,0,0,0,10};//___________________________________________//对通道CH进行模拟数字转换void ADC_Convert(INT8U CH){int Result;ADMUX=CH; //ADC通道选择//读取转换结果,并转换为电压值Result=(int)((ADCL+(ADCH<<8))*500.0/1023.0);//或使用语句:Result=(int)(ADC*500.0/1023.0);//ADC0的结果放入数组0、1、2单元,ADC1的结果放入数组4、5、6单元Display_Buffer[CH*4]=Result/100;Display_Buffer[CH*4+1]=Result/10%10;Display_Buffer[CH*4+2]=Result%10;}//主函数int main(){INT8U i;DDRA=0xFC;//配置AD转换端口ADC0、ADC1为输入DDRC=0xFF;PORTC=0x00;//配置数码管显示端口DDRD=0xFF;PORTD=0x00;ADCSRA=0xE6;//ADC转换置位,启动转换,64分频_delay_ms(3000);//延时等待系统稳定while(1){ADC_Convert(0);ADC_Convert(1);//对2个通道进行A/D转换for(i=0;i<8;i++){PORTC=0xFF;//先关闭段码PORTD=_BV(i);//发送数码管位码PORTC=SEG_CODE[Display_Buffer[i]];//发送数字段码if(i==0||i==4)PORTC&=0x7F;//对整数位加小数点_delay_ms(4);}} }。
数码管显示AD转换的电压值数码管显示秒表

电子科技大学微电子与固体电子学院实验报告实验名称现代电子技术综合实验姓名:詹朋璇学号:评分:教师签字电子科技大学教务处制电子科技大学实验报告学生姓名:詹朋璇学号:指导教师:熊万安实验地点: 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,0x79,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;}。
单片机实验——利用AD完成电压测量及显示

单片机实验——利用AD完成电压测量及显示1.实验目的(1)掌握A/D转换器的基本原理和使用方法。
(2)掌握二进制数和BCD码之间的数值转换方法。
2.预习要点(1)A/D转换器的基本原理和使用方法(2)二进制数和BCD码之间的数值转换方法3.实验设备计算机、单片机实验箱,万用表。
4.实验内容基本要求:利用电位器,在0~5V范围调节A/D转换器0809的输入端ADIN3的电压,在显示电路上显示00~50数值。
扩展要求:相同输入条件下,在显示电路上显示-25~+24的数值实验6ORG 0000HSJMP MAIN;****************************************************;主程序ORG 0030HMAIN:MOV SP,#70H;显示缓存区MOV 32H,#11 ;为了兼容之前的显示程序,所以就通过改变MOV 33H,#11 ;字型的方式让第3-8个数码管不亮,只显示前两位MOV 34H,#11MOV 35H,#11MOV 36H,#11MOV 37H,#11;初始化8155MOV DPTR,#0100HMOV A,#03HMOVX @DPTR,ALOOP:MOV DPTR,#6000H ;AD的地址,应接CS3MOV A,#00H ;选择通道0 IN0MOVX @DPTR,A ;启动AD,开始转换LCALL DELAY ;延时,等待转换完成,一般转换时间为100us左右LCALL ADCON ;读取数据并处理LCALL DISPLAY ;数码管显示SJMP LOOP;*****************************************;读取数据并处理子程序ADCON:MOVX A,@DPTR ;读取AD的输出XMOV B,#51 ;把00H-FFH之间的数据转换为0-50的数据DIV AB ;这个我会给大家讲讲,很简单的,这里就不注释了MOV 30H,AMOV A,BMOV B,#5DIV ABMOV 31H,ARET;*************************************;显示子程序DISPLAY:MOV R0,#30HMOV R3,#0FEHLD0:MOV DPTR,#0102H ;送字位MOV A,R3MOVX @DPTR,AMOV DPTR,#DTAB ;查表,送字形MOV A,@R0MOVC A,@A+DPTRMOV DPTR,#0101HMOVX @DPTR,ALCALL DELAYINC R0MOV A,R3JNB ACC.7,LD1RL AMOV R3,ALJMP LD0LD1:RET;***********************************************;字形表DTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;数字0-9DB 40H,00H ;40H为" - " 00H为不亮;**********************************************;延时1msDELAY:MOV R7,#02HDEL1:MOV R6,#0FFHDEL2:DJNZ R6,DEL2DJNZ R7,DEL1RET;**********************************************;显示子程序(另一种);这里给大家写本实验的另一种显示方法:;这种方法就是30H和31H分别写显示程序,显示完31H之后就;退出程序,很easy的啦,大家还可以多多试试自己编写别的程序;注:本子程序在主程序中并没有调用DISPLAY1:MOV DPTR,#0102HMOV A,#0BFHMOVX @DPTR,AMOV DPTR,#DTABMOV A,30HMOVC A,@A+DPTRMOV DPTR,#0101HMOVX @DPTR,ALCALL DELAYMOV DPTR,#0102HMOV A,#7FHMOVX @DPTR,AMOV DPTR,#DTABMOV A,31HMOVC A,@A+DPTRMOV DPTR,#0101HMOVX @DPTR,ALCALL DELAYRET;**********************************************;实验6扩展ORG 0000HSJMP MAIN;*********************************************;主程序ORG 0030HMAIN:MOV SP,#70H;显示缓存区MOV 32H,#11 ;为了兼容之前的显示程序,所以就通过改变MOV 33H,#11 ;字型的方式让第3-8个数码管不亮,只显示前两位MOV 34H,#11MOV 35H,#11MOV 36H,#11MOV 37H,#11;初始化8155MOV DPTR,#0100HMOV A,#03HMOVX @DPTR,ALOOP:MOV DPTR,#6000H ;;AD的地址,应接CS3MOV A,#00H ;选择通道0 IN0MOVX @DPTR,A ;启动AD,开始转换LCALL DELAY ;延时,等待转换完成,一般转换时间为100us左右LCALL ADCON ;读取数据并处理LCALL DISPLAY ;数码管显示SJMP LOOP;***************************************;AD数据读取并处理子程序ADCON:MOVX A,@DPTR ;读取AD的输出XCJNE A,#128,NEXT ;产生CyNEXT:JC NEXT1 ;判断要转化为0-25还是-25-0,然后决定要不要加负号CLR C ;因为后面用到减法,所以先要清零CySUBB A,#128MOV 30H,#11 ;为0-25之间,符号位什么都不显示SJMP NEXT2NEXT1:CLR C ;因为后面用到减法,所以先要清零CyMOV 62H,AMOV A,#128SUBB A,62HMOV 30H,#10 ;为-25-0之间,符号位显示负号NEXT2:MOV B,#51 ;下面是把0-128的数转换为0-25的数,十位存到31H 里,各位存到32H里DIV AB ;这个和实验6一样的MOV 31H,AMOV A,BMOV B,#5DIV ABMOV 32H,ARET;*************************************;显示子程序DISPLAY:MOV R0,#30HMOV R3,#0FEHLD0:MOV DPTR,#0102H ;送字位MOV A,R3MOVX @DPTR,AMOV DPTR,#DTAB ;查表,送字形MOV A,@R0MOVC A,@A+DPTRMOV DPTR,#0101HMOVX @DPTR,ALCALL DELAYINC R0MOV A,R3JNB ACC.7,LD1RL AMOV R3,ALJMP LD0LD1:RET;***********************************************;字形表DTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;数字0-9DB 40H,00H ;40H为“" 00H为不亮;**********************************************;延时1msDELAY:MOV R7,#02HDEL1:MOV R6,#0FFHDEL2:DJNZ R6,DEL2DJNZ R7,DEL1RET;**********************************************。
AD-DA转换带数码管显示

AD-DA转换带数码管显示/************************************************************** **************** ***** 标题: ************* DA-AD试验******************* **** 1.通过本例程了解并掌握AD-DA转换芯片的基本原理和使用** 2.了解掌握I2C总线接口的工作原理及一般编程方法。
** * * 连接方法:JP8 (P1)与J12用跳线连接**** 通过改变学习板上的2个电位器对应的2段模拟输入,实现模拟输入,学员观察数码管的数字变化情况* 通过改D[4]的值,实现模拟输出,学员观察学习板上DA处LED 的亮度变化**** 请学员认真消化本例程,懂得AD-DA 在C语言中的操作应用* *************************************************************** **************** ****/#include#include#define PCF8591 0x90 //PCF8591 地址//else IOsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83 ,0xC6,0xA1,0x86,0xbf,0xc7,0x8 c,0xc1, 0xff, 0xf7 };unsigned char AD_CHANNEL;unsigned long xdata LedOut[8];unsigned int D[32];/************************************************************** ***** DAC 变换, 转化函数*************************************************************** ****/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val){Start_I2c(); //启动总线SendByte(sla); //发送器件地址if(ack==0)return(0);SendByte(c); //发送控制字节if(ack==0)return(0);SendByte(Val); //发送DAC的数值if(ack==0)return(0);Stop_I2c(); //结束总线return(1);}/************************************************************** ***** ADC发送字节[命令]数据函数*************************************************************** ****/ bit ISendByte(unsigned char sla,unsigned char c) {Start_I2c(); //启动总线SendByte(sla); //发送器件地址if(ack==0)return(0);SendByte(c); //发送数据if(ack==0)return(0);Stop_I2c(); //结束总线return(1);}/************************************************************** ***** ADC读字节数据函数*************************************************************** ****/ unsigned char IRcvByte(unsigned char sla){ unsigned char c;Start_I2c(); //启动总线SendByte(sla+1); //发送器件地址if(ack==0)return(0);c=RcvByte(); //读取数据0Ack_I2c(1); //发送非就答位Stop_I2c(); //结束总线return(c);}//************************************************************* *****/ main(){ char i,j;while(1){/********以下AD-DA处理*************/switch(AD_CHANNEL){case 0: ISendByte(PCF8591,0x41);D[0]=IRcvByte(PCF8591)*2; //ADC0 模数转换1break;case 1: ISendByte(PCF8591,0x42);D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2break;case 2: ISendByte(PCF8591,0x43);D[2]=IRcvByte(PCF8591)*2; //ADC2 模数转换3break;case 3: ISendByte(PCF8591,0x40);D[3]=IRcvByte(PCF8591)*2; //ADC3 模数转换4break;case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC 数模转换break;}// D[4]=400; //数字--->>模拟输出D[4]=D[3];if(++AD_CHANNEL>4) AD_CHANNEL=0;/********以下将AD的值送到LED数码管显示*************/LedOut[0]=Disp_T ab[D[1]%10000/1000];LedOut[1]=Disp_T ab[D[1]%1000/100];LedOut[2]=Disp_T ab[D[1]%100/10]&0x7f;LedOut[3]=Disp_T ab[D[1]%10];LedOut[4]=Disp_T ab[D[0]%10000/1000];LedOut[5]=Disp_T ab[D[0]%1000/100]&0x7f;LedOut[6]=Disp_T ab[D[0]%100/10];LedOut[7]=Disp_T ab[D[0]%10];for( i=0; i<8; i++){ P1 = LedOut[i];switch(i){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;}for (j = 0 ; j<90 ;j++) { ;}}P1 = 0XFF;}}/*************************此部分为I2C总线的驱动程序*************************************/#include#include#include#define NOP() _nop_() /* 定义空指令*/#define _Nop() _nop_() /*定义空指令*/sbit SCL=P2^0; //I2C 时钟sbit SDA=P2^1; //I2C 数据bit ack; /*应答标志位*//************************************************************** *****起动总线函数函数原型: void Start_I2c();功能: 启动I2C总线,即发送I2C起始条件.********************************************************************/ void Start_I2c(){SDA=1; /*发送起始条件的数据信号*/_Nop();SCL=1;_Nop(); /*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0; /*发送起始信号*/_Nop(); /* 起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop();SCL=0; /*钳住I2C总线,准备发送或接收数据*/_Nop();_Nop();}/************************************************************** *****结束总线函数函数原型: void Stop_I2c();功能: 结束I2C总线,即发送I2C结束条件.*************************************************************** *****/ void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/_Nop(); /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于4μs*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1; /*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();}/************************************************************** *****字节数据发送函数函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
用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 课题研究背景与意义随着电子技术的发展,电子技术在各个领域的运用也越来越广泛。
原创数码管动态显示时间(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秒治疗指示灯闪烁。
工作中除复位键外其他键不能动作。
报警中可重复启动(设定状态)。
PIC之AD转换数码管显示

#include "PIC18.h"const unsigned char table1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};unsigned int Adresult=0; //AD转换计算结果unsigned int Ad_Sample_result=0; //AD转换采样结果unsigned char AD_Flag=0; // =1有新的AD数据转换完成unsigned int AD_Delay_count=0; // 间隔一定时启动AD ,不使AD采样过于频繁/* ****************************************************************** 函数名: initial()** 功能描述: 系统初始化子程序,放在程序首部*************************************************************** */void initial(){ TRISC=0;TRISD=0;INTCON=0x00; //* bit7-bit0:关总中断*/ADCON1=0X07; //* 设置数字输入输出口*/PIE1=0; //* PIE1 的中断不使能*/PIE2=0; //* PIE2 的中断不使能*/PIE3=0; //* PIE3 的中断不使能*/}/* **************************************************************** 函数名: AD_Initial()** 功能:A/D转化初始化子程序****************************************************************** */ void AD_Initial(){ADCON0=0x51; //* 选择通道为AN2,A/D处于工作状态,转换时钟8tosc */ADCON1=0X82; //* 转换结果右移,及ADRESH寄存器的高6位为"0",且//把RA2(AN2,直流输入通道)设置为模拟量输入方式,RA5设置为数字口*/ADIF=0; //* 清除A/D转换标志*/ADIE=1; //* A/D转换中断允许*/ADIP=1; //* AD中断高优先级*/TRISA=TRISA|0x04; //* 设置RA2(AN2通道)为输入方式*/}void delay_1ms(void){unsigned int n;for(n=0;n<50;n++){NOP();}}void delay_ms(unsigned int time){for(;time>0;time--){delay_1ms();}}/* **************************************************************** 函数名: Deal_AD()** 功能:AD转换完成后处理数据子程序****************************************************************** */ void Deal_AD(){unsigned int temp,g;Ad_Sample_result=ADRESL+(ADRESH<<8);//* 读取并存储A/D转换结果(10位,高6位为0)*/AD_Flag=0; //* AD转换完成标志清0 */Adresult=(Ad_Sample_result*50)>>10;//* 将AD采样结果转换为以两位数表示的值,即放大//10倍,乘以满该度值5V,除以满刻度转换值10位(1024)*/// temp=Adresult;// Adresult=(((temp/10)<<4)&0xf0)+(Adresult % 10);//* 转换为带一位小数的BCD码实际值如25表示2.5V,//本程序在0通道输入时直接加直流电压0-5V */PORTD=0X01;PORTC=table1[Adresult/10];RC7=0;//点亮小数点delay_ms(80);PORTD=0X02;PORTC=table1[Adresult%10];}/* **************************************************************** ** 函数名: interrupt HI_ISR()** 功能描述: 高优先级中断子程序:AD转换完成中断*************************************************************** */ void interrupt HI_ISR(){if(ADIF==1) //AD转换完成{ADIF=0; //清除中断标志AD_Flag=1; //置AD转换完成标志}}main(){initial(); //* 系统初始化子程序*/AD_Initial(); // A/D转换初始化//SPIinitial(); //* SPI初始化子程序*/IPEN=1; // 使能中断高低优先级INTCON=INTCON|0xc0; // 开总中断、开外围接口中断while(1){//display(); //显示子程序(SPI串行输出AD测量结果)if(AD_Flag==1) // AD采样完成Deal_AD(); // 处理AD数据if(AD_Delay_count>=0x3f){AD_Delay_count=0;ADCON0=ADCON0|0x04; //间隔一定时间启动直流输入通道AD采样}else AD_Delay_count++; // 不到AD间隔采样时间,继续延时}}。
单片机数码管秒表程序

单片机数码管秒表程序
数码管秒表是一种常见的计时工具,它利用单片机控制数码管的显示来实现计时功能。
下面我将为大家介绍一种基于单片机的数码管秒表程序。
程序的实现思路如下:首先,我们需要使用单片机的定时器来实现时间的计数。
通过设置定时器的计数周期和中断处理函数,我们可以在每个固定的时间间隔内进行一次计数。
然后,我们需要将计数的结果通过数码管进行显示。
为了方便显示,我们可以将计数结果分为小时、分钟和秒三个部分,分别显示在数码管的不同位上。
程序的具体实现步骤如下:
1. 初始化单片机的定时器,并设置计数周期为1秒。
2. 设置一个全局变量来保存计数的结果,初始值为0。
3. 在定时器的中断处理函数中,每次中断时将计数结果加1。
4. 在主函数中,设置一个循环来不断检测计数结果的变化,并将其转换为时、分、秒的形式。
5. 将转换后的时、分、秒分别显示在数码管的不同位上,通过控制数码管的引脚来实现。
通过以上步骤,我们就可以实现一个简单的数码管秒表程序。
当程序运行时,数码管会不断地显示计时结果,从0开始递增,以秒为单位。
当需要停止计时时,可以通过外部按键等方式来暂停或重置计数结果。
这种数码管秒表程序可以广泛应用于各种计时场景,比如运动比赛、实验计时等。
它的实现简单、成本低廉,并且可以精确地显示时间,非常实用。
希望通过以上介绍,大家对基于单片机的数码管秒表程序有了更深入的了解。
希望这个简单的程序能够帮助大家更好地实现计时功能,提高工作和学习的效率。
谢谢大家!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学微电子与固体电子学院实验报告实验名称现代电子技术综合实验姓名:詹朋璇学号:2011031030024评分:教师签字电子科技大学教务处制电子科技大学实验报告学生姓名:詹朋璇学号:2011031030024 指导教师:熊万安实验地点:211大楼308 实验时间:2014. 6.30 晚一、实验室名称:单片机技术综合实验室二、实验项目名称:数码管显示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; //禁止总中断EX1=1; //使能/INT1 中断EX0=1; //使能/INT0 中断EA=1; }//使能总中断中断服务程序:void INT0SVC () interrupt 0{if(cnt<=31) cnt++;}void INT1SVC () interrupt 2{if(cnt>=17) cnt--;}七、总结及心得体会1.利用单片机开发板上丰富的资源可以实现一个有一定功能的系统。
2.懂得利用中断可以使单片机的效率提高。
八、对本实验过程及方法、手段的改进建议实在是没有,都挺好的。
九、附录1、程序/*利用TLC549 A/D转换器实现电压测量与显示*/#include <reg51.h> //包含8051的SFR寄存器定义头文件#include <absacc.h> //扩展并行接口所需的绝对地址访问库函数#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_DA TA = 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,0x79,0x 71,0x40,0x00,0xff};// 0 1 2 3 4 5 6 7 8 9 a b cd 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=2.5Vx100 = 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=2.5Vx100 = 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=11.0592MHz) {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_DA TA )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;}。