数码管显示AD转换的电压值数码管显示秒表
- 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
#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_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 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); //延时大约1ms
unsigned 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.5V
x100 = volt/100;
x10 = (volt - x100*100)/10;
x = (volt - x100*100)%10;