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

上传人:b****6 文档编号:7586019 上传时间:2023-05-11 格式:DOCX 页数:11 大小:68.57KB
下载 相关 举报
数码管显示转换的电压值数码管显示秒表.docx_第1页
第1页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第2页
第2页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第3页
第3页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第4页
第4页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第5页
第5页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第6页
第6页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第7页
第7页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第8页
第8页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第9页
第9页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第10页
第10页 / 共11页
数码管显示转换的电压值数码管显示秒表.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《数码管显示转换的电压值数码管显示秒表.docx》由会员分享,可在线阅读,更多相关《数码管显示转换的电压值数码管显示秒表.docx(11页珍藏版)》请在冰点文库上搜索。

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

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

Documentserialnumber【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

 

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

电子科技大学微电子与固体电子学院

实验报告

实验名称现代电子技术综合实验

姓名:

詹朋璇

学号:

评分:

教师签字

电子科技大学教务处制

电子科技大学

实验报告

学生姓名:

詹朋璇学号:

指导教师:

熊万安

实验地点:

211大楼308实验时间:

2014.晚

一、实验室名称:

单片机技术综合实验室

实验项目名称:

数码管显示A/D转换的电压值&数码管显示秒表

二、实验学时:

12

三、实验目的与任务:

1、熟悉系统设计与实现原理

2、掌握KEILC51的基本使用方法

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、软件设计

2按下

1按下

1按下1按下2按下

 

思考题:

按键改用外部中断模式,电路如何修改(画示意图)程序如何修改,写出中断服务程序。

答:

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

开启中断:

SysInit()

{…

EA=0;用单片机开发板上丰富的资源可以实现一个有一定功能的系统。

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

六、对本实验过程及方法、手段的改进建议

实在是没有,都挺好的。

七、附录

1、程序

/*

利用TLC549A/D转换器实现电压测量与显示

*/

#include<>//包含8051的SFR寄存器定义头文件

#include<>//扩展并行接口所需的绝对地址访问库函数

#defineLED_digXBYTE[0x9000]//8位数码管显示器的位选输出控制

#defineLED_segXBYTE[0x8000]//8位数码管显示器的段码(字形码)输出控制

#defineKEY_INXBYTE[0x8000]

//定义TLC549操作接口

sbitADC_CS=P1^7;

sbitADC_DATA=P1^6;

sbitADC_CLK=P1^5;

codeunsignedchardisp_seg[]=//显示段码

{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5f,0x79,0x71,0x40,0x00,0xff};

//0123456789abcdef-blank,全亮

unsignedcharDispBuf[8];//定义显示缓冲区(由定时中断程序自动扫描)

unsignedcharkey_value,flag;//定义键盘返回值,任务标志

unsignedchary1000,y100,y10,y;//定义秒表的个位,十分位,百分位,千分位

unsignedshortmbiao;//定义秒表计数单元

voiddelay(intms);//延时大约1ms

unsignedcharReadAdc(void);//读取A/D转换结果

voidAdcInit(void);//初始化ADC接口

voidkey_scan(void);

voidmain()

{

unsignedchari=0;

unsignedcharvolt,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);}

elseif(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的中断服务函数

*/

voidT1INTSVC()interrupt3

{

codeunsignedcharcom[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

staticunsignedcharn=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);

else

LED_seg=~disp_seg[DispBuf[n]];//更新扫描数据

}

if(flag==1)

{if(n==5)

LED_seg=~(disp_seg[DispBuf[n]]|0x80);

else

if(n==4)

LED_seg=~(disp_seg[DispBuf[n]]);//更新扫描数据,

else

LED_seg=~disp_seg[DispBuf[n]];//更新扫描数据

}

if(flag==2)

{

LED_seg=~disp_seg[DispBuf[n]];//更新扫描数据

}

LED_dig=~com[n];//重新显示

key_scan();

n++;

n&=0x07;

}

voiddelay(intms)

{

unsignedinti,j;

for(i=0;i

{

for(j=0;j<100;j++)

;

}

}

/*

函数:

ReadAdc()

功能:

读取A/D转换结果

返回:

8位ADC代码

*/

unsignedcharReadAdc(void)

{

unsignedchard;//读取得ADC结果

unsignedcharn;//ADCbit位计数

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;

returnd;

}

/*

函数:

AdcInit()

功能:

初始化ADC接口

*/

voidAdcInit(void)

{

ADC_CS=1;

ADC_CLK=0;

ADC_DATA=1;

ReadAdc();//空读一次,用于启动一次A/D转换过程

}

voidkey_scan(void)

{

unsignedcharkey_in;

key_in=KEY_IN;

switch(key_in)

{

case0xff:

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的中断服务函数

*/

voidT0INTSVC()interrupt1

{

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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2