国信长天 ct107d单片机设计与开发项目模拟试题及参考程序 小区自动售水机Word文档下载推荐.docx
《国信长天 ct107d单片机设计与开发项目模拟试题及参考程序 小区自动售水机Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《国信长天 ct107d单片机设计与开发项目模拟试题及参考程序 小区自动售水机Word文档下载推荐.docx(15页珍藏版)》请在冰点文库上搜索。
设定按键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.画出程序流程图,保存在考生文件夹中。
2^按照设计要求完成程序设计任务,并将工程文件保存在考生文件夹中。
硬件调试
三.硬件调试
将编译通过的程序下载到处理器芯片中,进行硬件调试。
1.按键控制功能实现〔15分)
2^数码管显示功实现〔20分)
3^继电器功能实现〔5分)
4^AD采集及LED控制功能实现〔15分)
参考程序
#include"
reg52.h"
intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
#definesomenop{_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)
if(s6==0)
date=t/2;
TR0=0;
P0=0;
num=2;
s6);
voiddisplay(ucharwe,uchardu)
P0=0xFF;
//消影子
P2|=0xE0;
P2&
=0x1F;
P0=smg_du[du];
P0=smg_we[we];
P2|=0xC0;
=0x3F;
/////////////////////////////////////////////////////////////////
voidiic_start(void)
SDA=1;
_nop_();
SCL=1;
somenop;
SDA=0;
SCL=0;
voidiic_stop(void)
voidack()
unsignedchari;
SCL=1;
somenop;
while((SDA==1)&
&
(i<
200))i++;
SCL=0;
voidiic_sendbyte(unsignedcharbyt)
for(i=0;
i<
8;
i++)
{
if(byt&
0x80)
else
byt<
<
=1;
ack();
unsignedchariic_recbyte(void)
unsignedcharda;
da<
if(SDA)
da|=0x01;
returnda;
unsignedcharadc_pcf8591(void)
unsignedchartemp;
iic_start();
iic_sendbyte(0x91);
temp=iic_recbyte();
iic_stop();
returntemp;
voidinit_pcf8591(void)
iic_sendbyte(0x90);
iic_sendbyte(0x01);
delayms(10);
////////////////////////////////////////////////////////////////
voidmain()
{
P0=0xff;
P2=0x80;
P0=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;
num=3;
//超出标志
}
voidisr_t0(void)interrupt1//数码管显示
tflag++;
aa++;
if(aa==400)//10mst++
aa=0;
t++;
if(t==10000)
P0=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&
P0=smg_du1[bai];
P0=smg_we[5];
P2|=0xC0;
if(dspflag==1)
display(6,shi);
if(dspflag==2)
display(7,ge);
if(dspflag==3)
display(4,qian);
if(dspflag==4)
P0=smg_du1[0];
P0=smg_we[1];
if(dspflag==5)
display(2,5);
if(dspflag==6)
display(3,0);
if(num==2)//算费标志
if(tflag==4)//1ms
dspflag++;
qian1=date/1000;
bai1=date%1000/100;
shi1=date%100/10;
ge1=date%10;
P0=smg_du1[bai1];
display(6,shi1);
display(7,ge1);
display(4,qian1);
P0=smg_we[1];
if(num==3)
if(tflag==4)//100ms
P0=smg_du1[9];
display(6,9);
display(7,9);
display(4,4);
voidT1_timer()interrupt3//LEDPCF8591
bb++;
if(bb==8)
bb=0;
temp=adc_pcf8591();
if(temp<
64)
P0=0xfe;
if(temp>
P0=0xff;
}