数码管显示转换的电压值数码管显示秒表Word文档格式.docx

上传人:b****5 文档编号:18580510 上传时间:2022-12-28 格式:DOCX 页数:11 大小:68.57KB
下载 相关 举报
数码管显示转换的电压值数码管显示秒表Word文档格式.docx_第1页
第1页 / 共11页
数码管显示转换的电压值数码管显示秒表Word文档格式.docx_第2页
第2页 / 共11页
数码管显示转换的电压值数码管显示秒表Word文档格式.docx_第3页
第3页 / 共11页
数码管显示转换的电压值数码管显示秒表Word文档格式.docx_第4页
第4页 / 共11页
数码管显示转换的电压值数码管显示秒表Word文档格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数码管显示转换的电压值数码管显示秒表Word文档格式.docx

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

数码管显示转换的电压值数码管显示秒表Word文档格式.docx

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寄存器定义头文件

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

#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;

=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=volt*250/256;

x100=volt/100;

x10=(volt-x100*100)/10;

x=(volt-x100*100)%10;

DispBuf[0]=y1000;

DispBuf[1]=0;

DispBuf[5]=x100;

DispBuf[6]=16;

DispBuf[7]=2;

if(key_value==8&

=200){flag=0;

}

elseif(key_value==7&

=200){flag=2;

while(key_value==7);

}

while(flag==2)

{

TR0=!

TR0;

if(key_value==7){flag=1;

}

}

函数:

T1INTSVC()

功能:

定时器T1的中断服务函数

voidT1INTSVC()interrupt3

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

staticunsignedcharn=0;

TR1=0;

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)

if(n==4)

LED_seg=~(disp_seg[DispBuf[n]]);

//更新扫描数据,

else

//更新扫描数据

if(flag==2)

LED_dig=~com[n];

//重新显示

key_scan();

n++;

n&

=0x07;

voiddelay(intms)

unsignedinti,j;

ms;

i++)//延时大约1ms(fosc=

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!

ADC_CS=1;

returnd;

AdcInit()

初始化ADC接口

voidAdcInit(void)

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;

case~0x02:

key_value=2;

case~0x04:

key_value=3;

case~0x08:

key_value=4;

case~0x10:

key_value=5;

case~0x20:

key_value=6;

case~0x40:

key_value=7;

case~0x80:

key_value=8;

default:

定时器T0的中断服务函数

voidT0INTSVC()interrupt1

TR0=0;

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-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1