国信长天ctd单片机设计方案与开发项目模拟试题及参考程序小区自动售水机Word文档下载推荐.docx
《国信长天ctd单片机设计方案与开发项目模拟试题及参考程序小区自动售水机Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《国信长天ctd单片机设计方案与开发项目模拟试题及参考程序小区自动售水机Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
参考程序
#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。
}