国信长天 ct107d单片机设计与开发项目模拟试题及参考程序 小区自动售水机.docx
《国信长天 ct107d单片机设计与开发项目模拟试题及参考程序 小区自动售水机.docx》由会员分享,可在线阅读,更多相关《国信长天 ct107d单片机设计与开发项目模拟试题及参考程序 小区自动售水机.docx(15页珍藏版)》请在冰豆网上搜索。
国信长天ct107d单片机设计与开发项目模拟试题及参考程序小区自动售水机
竞赛时间:
5小时
题号
一
二
二
总分
配分
15分
30分
55分
100分
得分
功能简述
通过竞赛硬件平台模拟小区自动售水机的工作流程:
通过按键控制售水机水流出和停止;通过数码管显示费率、出水量及总费用;通过光敏电阻检测环境亮度,在亮度过低的情况下,自动开灯。
系统硬件电路主要由单片机控制电路、数码管显示电路、奶转换电路及功能按键组成。
系统框图如图1所示:
图1.系统框图
I2C总线驱动程序、CT107D考试平台电路原理图以及本题所涉及到的芯片数据手册,可参考计算机上的电子文档。
程序流程图及相关工程文件请以考生号命名,并保存在计算机上的考生文件夹中(文件夹名为考生准考证号,文件夹位于Windows桌面上)
设计任务及要求
1.按键控制单元
设定按键S7为出水控制按键,当S7按下后,售水机持续出水〈继电器接通,指示灯L10点亮设定按键S6为停水控制按键,当S6按下后,停止出水〈继电器断开,指示灯L10熄灭X
1.数码管显示单元
通过4位数码管DS1显示费率,单位为元丨升,保留2位有效数字;
通过4位数码管DS2显示当前出水总量(出水时,单位为升)和总价(停止时,单位为元按下出水按键S7后,清除数码管DS2显示数据,数码管DS2实时显示出水量(保留两位有效数字〕,在出水状态下,再次按下S7,不会影响出水状态,直到按下停止按键S6为止;按下停止出水按键S6后,数码管DS2显示总价(保留两位有效数字X例:
当S7按下后,数码管示意图如图2所示:
图之.售水机出水状态数码管显示
当按键86按下后,数码管示意图如图3所示:
图3^售水机出停水态数码管显示
3^入0转换单元
通过光敏电阻RD1和AD转换芯片PCF8591组成的亮度检测电路〈亮度值转换为PCF8591光敏电阻通道的电压〕检测环境亮度;当:
PCF8591光敏电阻通道输入电压小于1.25V时,L1点亮,大于1.25V时,L1熄灭。
4^系统说明
1.假定水价为0.5元/升,出水速度为100毫升/秒;
1.一次出水总量达到99.99L时,继电器自动断开,数码管显示DS2显示价格。
项目名称
得分
评卷人
电路设计
一.电路原理图设计
根据设计任务要求,设计“接口电路”原理图,并标明元器件参数;8CH只文件保存在考生文件夹中(文件夹以考生的准考证号命名〕。
〔15分)
项目名称
得分
评卷人
程序设计
二.程序编写及流程图绘制
1.画出程序流程图,保存在考生文件夹中。
〔15分)
2^按照设计要求完成程序设计任务,并将工程文件保存在考生文件夹中。
〔15分)
项目名称
得分
评卷人
硬件调试
三.硬件调试
将编译通过的程序下载到处理器芯片中,进行硬件调试。
1.按键控制功能实现〔15分)
2^数码管显示功实现〔20分)
3^继电器功能实现〔5分)
4^AD采集及LED控制功能实现〔15分)
参考程序
#include"reg52.h"
#include"intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
#definesomenop{_nop_();_nop_();_nop_();_nop_();_nop_();}
ucharcodesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharcodesmg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
ucharcodesmg_du1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f};//有小数点的段选
sbitSDA=P2^1;
sbitSCL=P2^0;
sbits7=P3^0;
sbits6=P3^1;
uchartflag,dspflag,qian,bai,shi,ge,qian1,bai1,shi1,ge1,num,temp,bb;
uintt,aa,date;
voiddelayms(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
voidkeyscan()
{
if(s7==0)
{
delayms(10);
if(s7==0)
{
P0=0x10;P2=0xa0;P2=0;
TR0=1;num=1;t=0;
while(!
s7);
}
}
if(s6==0)
{
delayms(10);
if(s6==0)
{
date=t/2;TR0=0;
P0=0;P2=0xa0;P2=0;
num=2;
TR0=1;
while(!
s6);
}
}
}
voiddisplay(ucharwe,uchardu)
{
P0=0xFF;//消影子
P2|=0xE0;
P2&=0x1F;
P0=smg_du[du];
P2|=0xE0;
P2&=0x1F;
P0=smg_we[we];
P2|=0xC0;
P2&=0x3F;
}
/////////////////////////////////////////////////////////////////
voidiic_start(void)
{
SDA=1;
_nop_();
SCL=1;
somenop;
SDA=0;
somenop;
SCL=0;
}
voidiic_stop(void)
{
SDA=0;
_nop_();
SCL=1;
somenop;
SDA=1;
}
voidack()
{
unsignedchari;
SCL=1;somenop;while((SDA==1)&&(i<200))i++;SCL=0;
}
voidiic_sendbyte(unsignedcharbyt)
{
unsignedchari;
for(i=0;i<8;i++)
{
if(byt&0x80)
SDA=1;
else
SDA=0;
somenop;
SCL=1;
byt<<=1;
somenop;
SCL=0;
}
ack();
}
unsignedchariic_recbyte(void)
{
unsignedcharda;
unsignedchari;
for(i=0;i<8;i++)
{
SCL=1;
somenop;
da<<=1;
if(SDA)
da|=0x01;
SCL=0;
somenop;
}
returnda;
}
unsignedcharadc_pcf8591(void)
{
unsignedchartemp;
iic_start();
iic_sendbyte(0x91);
temp=iic_recbyte();
iic_stop();
returntemp;
}
voidinit_pcf8591(void)
{
iic_start();
iic_sendbyte(0x90);
iic_sendbyte(0x01);
iic_stop();
delayms(10);
}
////////////////////////////////////////////////////////////////
voidmain()
{
P0=0xff;P2=0x80;P2=0;
P0=0;P2=0xa0;P2=0;//关蜂鸣器
TMOD=0x22;
TH0=0x06;
TL0=0x06;
TH1=0x06;
TL1=0x06;
ET0=1;
EA=1;
ET1=1;TR1=1;
init_pcf8591();
while
(1)
{
keyscan();
if(t==10000)
{
TR0=0;
P0=0;P2=0xa0;P2=0;
num=3;//超出标志
TR0=1;
}
}
}
voidisr_t0(void)interrupt1//数码管显示
{
tflag++;
aa++;
if(aa==400)//10mst++
{
aa=0;
t++;
if(t==10000)
{
P0=0;P2=0xa0;P2=0;
}
qian=t/1000;bai=t%1000/100;shi=t%100/10;ge=t%10;
}
if(num==1)//计时标志
{
if(tflag==4)//1ms动态显示
{
tflag=0;
dspflag++;
if(dspflag==7)
dspflag=0;
if(dspflag==0)
{
P0=0xFF;P2|=0xE0;P2&=0x1F;
P0=smg_du1[bai];P2|=0xE0;P2&=0x1F;
P0=smg_we[5];P2|=0xC0;P2&=0x3F;
}
if(dspflag==1)
display(6,shi);
if(dspflag==2)
display(7,ge);
if(dspflag==3)
display(4,qian);
if(dspflag==4)
{
P0=0xFF;P2|=0xE0;P2&=0x1F;
P0=smg_du1[0];P2|=0xE0;P2&=0x1F;
P0=smg_we[1];P2|=0xC0;P2&=0x3F;
}
if(dspflag==5)
display(2,5);
if(dspflag==6)
display(3,0);
}
}
if(num==2)//算费标志
{
if(tflag==4)//1ms
{
tflag=0;dspflag++;
if(dspflag==7)
{
dspflag=0;
qian1=date/1000;bai1=date%1000/100;shi1=date%100/10;ge1=date%10;
}
if(dspflag==0)
{
P0=0xFF;P2|=0xE0;P2&=0x1F;
P0=smg_du1[bai1];P2|=0xE0;P2&=0x1F;
P0=smg_we[5];P2|=0xC0;P2&=0x3F;
}
if(dspflag==1)
display(6,shi1);
if(dspflag==2)
display(7,ge1);
if(dspflag==3)
display(4,qian1);
if(dspflag==4)
{
P0=0xFF;P2|=0xE0;P2&=0x1F;
P0=smg_du1[0];P2|=0xE0;P2&=0x1F;
P0=smg_we[1];P2|=0xC0;P2&=0x3F;
}
if(dspflag==5)
display(2,5);
if(dspflag==6)
display(3,0);
}
}
if(num==3)
{
if(tflag==4)//100ms
{
tflag=0;dspflag++;
if(dspflag==7)
{
dspflag=0;
}
if(dspflag==0)
{
P0=0xFF;P2|=0xE0;P2&=0x1F;
P0=smg_du1[9];P2|=0xE0;P2&=0x1F;
P0=smg_we[5];P2|=0xC0;P2&=0x3F;
}
if(dspflag==1)
display(6,9);
if(dspflag==2)
display(7,9);
if(dspflag==3)
display(4,4);
if(dspflag==4)
{
P0=0xFF;P2|=0xE0;P2&=0x1F;
P0=smg_du1[0];P2|=0xE0;P2&=0x1F;
P0=smg_we[1];P2|=0xC0;P2&=0x3F;
}
if(dspflag==5)
display(2,5);
if(dspflag==6)
display(3,0);
}
}
}
voidT1_timer()interrupt3//LEDPCF8591
{
bb++;
if(bb==8)
{
bb=0;
temp=adc_pcf8591();
if(temp<64)
{
P0=0xfe;P2=0x80;P2=0;
}
if(temp>64)
{
P0=0xff;P2=0x80;P2=0;
}
}
}