低年级组------张磊组
1、作品介绍
该软件是基于STC12C5A60S2单片机,该软件主要分两个部分,一个部分是:电子钟部分,软件主要是依靠DS1302时钟芯片进行时钟软件设计。另一部分:测量电阻部分,主要是依靠STC12C5A60S2内部自带ADC功能进行设计完成的。该软件可以显示年、月、日、时、分、秒、星期、闹钟、测量电阻的阻值的信息,可以通过两个独立按键设置年、月、日、时、分、秒、星期、闹钟、测量电阻的阻值的信息。如果时间、测量电阻和设定的时间、设定的电阻相同,将通过闪烁LED进行提示。
2、作品图片
3、视频
4、部分代码
1、主程序代码
uchar i;
float adc1,adc2;
lcd1602init(); //初始化液晶
adcinit(); //初始化ADC
i=ds1302addrrbyte(0x8d); //读回年寄存器的值
if(i==0) //年寄存器为0,DS1302就初始化,不为零就不初始化
ds1302init();
while (1)
{
adc1=adcres(1);
adc2=adcres(2);
res(adc1,adc2);
keyscan();
alarm();
}
2、2路ADC代码
float
adcres(uchar ch)
{
uint result=0;
float vin=0,
bai=0,shi=0,ge=0;
ADC_CONTR=adcpower|adcspendhh|ch|adcstart; //开AD转换
while(!ADC_CONTR&adcflag); //等待转换完成
result=ADC_RES<<2;
result|=ADC_RESL;//
ADC_CONTR=0xe9; //不关AD电源,flag清零,开AD转换
vin=result*5/1024; //处理后为浮点数
return vin;
}
3、ADC数据处理
uint res(float
num1,float num2)
{
uint xy=0;
xy=1000*(num1-num2)/num2;
return xy;
}
4、功能按键代码
case 1:
lcd1602writecom(0x80+0x40+6); //设置按键按动一次,秒位置显示光标
lcd1602writecom(0x0f); //光标为闪烁
temp=(second)/10*16+(second)%10; //秒数据写入DS1302
ds1302addrwbyte(0x8e,0x00);
ds1302addrwbyte(0x80,0x80|temp);
ds1302addrwbyte(0x8e,0x80);
break;
case 2: lcd1602writecom(0x80+0x40+0x03); //按2次minute位置显示光标
break;
……(其他按键相似此处不列出)
case 9:
lcd1602writecom(0x0c);
temp=(second)/10*16+(second)%10;
ds1302addrwbyte(0x8e,0x00);
ds1302addrwbyte(0x80,0x00|temp); //second数据写入DS1302
ds1302addrwbyte(0x8e,0x80);
default :
;
5、加键代码
case 1:
second++;//设置键按动1次,调秒
if(second==60)
second=0;//秒超过59,再加1,就归零
lcd1602writetwo(0x80+0x40+0x06,second);//令LCD在正确位置显示
ds1302addrwbyte(0x8e,0x00); //允许写,禁止写保护
ds1302addrwbyte(0x80,((second/10)<<4|(second%10))); //秒寄存器写入调整后的秒BCD码
ds1302addrwbyte(0x8e,0x80); //打开写保护
lcd1602writecom(0x80+0x40+0x07);//写入数据后,光标自动右移,要返回
break;
……(其他按键相似此处不列出)
case 8:
lhour++;
if(lhour==24)
lhour=0;
lcd1602writetwo(0x80+0x0a,lhour);//令LCD在正确的位置显示
temp=(lhour)/10*16+(lhour)%10;//十进制转换成DS1302要求的DCB码
ds1302addrwbyte(0x8e,0x00);//允许写,禁止写保护
ds1302addrwbyte(0xe0,temp);//小时寄存器写入调整后的小时BCD码
ds1302addrwbyte(0x8e,0x80);//打开写保护
lcd1602writecom(0x80+0x0a);//写入数据后,回位
break;
6、从DS1302读时间代码
void
ds1302gettime(systemtime *time)
{
uchar readvalue;
readvalue=ds1302addrrbyte(DS1302_SECOND);
time->second=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(DS1302_MINUTE);
time->minute=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(DS1302_HOUR);
time->hour=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(DS1302_DAY);
time->day=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(DS1302_WEEK);
time->week=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(DS1302_MONTH);
time->month=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(DS1302_YEAR);
time->year=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(0xc1);
time->lminute=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(0xe1);
time->lhour=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(0xf1);
time->res1=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue=ds1302addrrbyte(0xd1);
time->res2=((readvalue&0x70)>>4)*10+(readvalue&0x0f);
}
|