找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3170|回复: 0
打印 上一主题 下一主题
收起左侧

2012蓝桥杯_ct107d单片机设计与开发项目模拟试题及参考程序

[复制链接]
跳转到指定楼层
楼主
ID:165764 发表于 2017-2-21 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
竞赛时间: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.25 V时,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"
#define uchar unsigned char
#define uint unsigned int

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
uchar code smg_du[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code smg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code smg_du1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f};        //有小数点的段选
sbit SDA = P2^1;
sbit SCL = P2^0;
sbit s7=P3^0;
sbit s6=P3^1;

uchar tflag,dspflag,qian,bai,shi,ge,qian1,bai1,shi1,ge1,num,temp,bb;
uint t,aa,date;

void delayms(uint x)
{
uchar t;
while(x--)for(t=0;t<120;t++);
}

void keyscan()
{
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);
}
}
}

void display(uchar we,uchar du)
{
P0 = 0xFF;        //消影子
P2 |= 0xE0;
P2 &= 0x1F;

P0 = smg_du[du];
P2 |= 0xE0;
P2 &= 0x1F;
P0 =smg_we[we];
P2 |= 0xC0;
P2 &= 0x3F;

}
/////////////////////////////////////////////////////////////////
void iic_start(void)
{
SDA = 1;
_nop_();
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}

void iic_stop(void)
{
SDA = 0;
_nop_();
SCL = 1;
somenop;
SDA = 1;
}

void ack()
{
unsigned char i;
SCL=1;somenop;while((SDA==1)&&(i<200))i++;SCL=0;
}

void iic_sendbyte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
SDA = 1;
else
SDA = 0;
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
ack();
}

unsigned char iic_recbyte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}

unsigned char adc_pcf8591(void)
{
unsigned char temp;

iic_start();
iic_sendbyte(0x91);
temp = iic_recbyte();
iic_stop();

return temp;
}
void init_pcf8591(void)
{
iic_start();
iic_sendbyte(0x90);
iic_sendbyte(0x01);
iic_stop();
delayms(10);
}
////////////////////////////////////////////////////////////////
void main()
{       
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;
}
}
}

void isr_t0(void) interrupt 1        //数码管显示
{
tflag++;
aa++;
if(aa==400)        //10ms t++
{
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);
}       
}
}

void T1_timer() interrupt 3        //LED PCF8591
{
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;
}
}
}


评分

参与人数 1黑币 +6 收起 理由
芦苇劫 + 6 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表