西安交大可报温报时电子钟设计报告Word格式文档下载.docx
- 文档编号:19289401
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:44
- 大小:85.89KB
西安交大可报温报时电子钟设计报告Word格式文档下载.docx
《西安交大可报温报时电子钟设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《西安交大可报温报时电子钟设计报告Word格式文档下载.docx(44页珍藏版)》请在冰豆网上搜索。
利用“miaomiao”系列变量作为判定条件保证只执行一次程序;
●对显示变量display_buffer直接进行加一操作进位产生错乱:
引入buffer_temp[]数组,替代校正;
●语音芯片不能连续播放多段语音:
每段播放后延时适当时间;
●为使得”on”、”off”的右下角显示小数点时对SEGMENT直接进行“位与”操作只能显示"
o8.”、”of8”.等:
引入变量s过渡;
●整点报时会连续两次播放语音:
只在分钟显示为“59”时使得miaomiao_play变量为一,播放后置为零,保证只播放一次;
●报温时可能读取到设定工作温度上限(39摄氏度)的温度值且实际此时温度在上限之内:
在tmread()函数里增加循环读取部分直至读到正常数值;
●其他组组员(于晨曦同学)提出的建议与提示:
温度读取时间较长不宜加入定时中断显示;
每次显示前对位码或段码(取决于置数顺序)先置零,以解决数码管残影问题。
6、PCB板原理图及接线图
见验收文件夹PPT,由于打印问题在此不作展示。
7、源程序代码
#include<
at89x52.h>
stdio.h>
absacc.h>
intrins.h>
#defineSEGMENTXBYTE[0xdfff]
#defineBIT_LEDXBYTE[0xbfff]
#definefosc11.0592
#definetime02500
#defineuintunsignedint
//语音部分定义开始
unsignedcharbdataSR0_L;
unsignedcharbdataSR0_H;
unsignedcharbdataSR1;
unsignedcharAPCL=0,APCH=0;
unsignedcharPlayAddL=0,PlayAddH=0;
unsignedcharRecAddL=0,RedAddH=0;
sbitCMD=SR0_L^0;
sbitFULL=SR0_L^1;
sbitPU=SR0_L^2;
sbitEOM=SR0_L^3;
sbitINTT=SR0_L^4;
sbitRDY=SR1^0;
sbitERASE=SR1^1;
sbitPLAY=SR1^2;
sbitREC=SR1^3;
unsignedcharISD_SendData(unsignedchardat);
voidISD_PU(void);
voidISD_Rd_Status(void);
voidISD_WR_APC2(unsignedcharapcdatl,apcdath);
voidISD_SET_PLAY(unsignedcharSaddl,Saddh,Eaddl,Eaddh);
sbitSS=P1^4;
sbitSCK=P1^7;
sbitMOSI=P1^5;
sbitMISO=P1^6;
voidISD_Init(void);
voiddelay(unsignedintt);
unsignedcharget_address(unsignedchark);
//快速获取部分语音地址函数
//语音部分定义结束
//温度部分定义开始
sbitTMDAT=P3^4;
voiddmsec(unsignedintcount);
voidtmreset(void);
voidtmstart(void);
voidtmdisplay(void);
voidtmread(void);
//温度读取函数
unsignedchartmrtemp(void);
unsignedcharcodeseg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsignedcharcodetran_code[]={0,1,2,3,4,5,6,7,8,9};
//类型转换数组
unsignedcharlast;
intlast_shi=2,last_ge=6;
//温度部分定义结束
//时间部分定义开始
unsignedchardatadisplay_bit,display_buffer[8],display_buffer1[8],ring[8]={1,5,0,0,0,1,0,0};
unsignedchardatatime0_h,time0_1,TEMP;
unsignedintidatatime0_times;
unsignedcharget_code(unsignedchari);
voiddisplay(void);
voidinitial_ds1302();
unsignedcharread_ds1302(charcommand);
voidopen_write_bit();
voidclose_write_bit();
voidread_time();
voidset_time();
voidreset_time();
//校正确认功能函数
voidread_date();
sbitSCL_DS1302=P2^0;
sbitIO_DS1302=P2^1;
sbitRST_DS1302=P2^2;
unsignedcharbdatadata_ds1302;
sbitbit_data0=data_ds1302^0;
sbitbit_data7=data_ds1302^7;
unsignedcharbdatax;
sbitx0=x^0;
sbitx7=x^7;
//时间部分定义结束
//功能部分定义开始
sbitkey1=P1^0;
//切换功能
unsignedcharmodecg;
//工作模式指示变量
sbitkey2=P1^1;
//切换显示
unsignedchardisplaycg;
//切换显示指示变量
sbitkey3=P1^2;
//切换校正位
unsignedchartime_ajflag;
//时钟校正位指示变量
unsignedchartime_bitadjust;
//时钟校正位显示变量
unsignedchardate_ajflag;
//日历校正位指示变量
unsignedchardate_bitadjust;
//日历校正位显示变量
unsignedcharring_ajflag;
//闹钟校正位指示变量
unsignedcharring_bitadjust;
//闹钟校正位显示变量
sbitkey4=P1^3;
//加位键
sbitkey5=P3^2;
//确认或关闭闹钟键
unsignedcharmiaomiao_1,miaomiao_2,miaomiao_3,miaomiao_4,miaomiao_5,miaomiao_play;
//防止多次执行步骤指示变量
unsignedcharj,s;
//j为部分程序循环指示变量,s为为解决onoff的加小数点显示问题而定义的SEGMENT过渡变量
inttime_t=400;
//数码管闪烁计数变量
unsignedcharbuffer_temp[8],play_adr[8],wendu_shi,wendu_ge;
//分别为校正功能过渡变量数组、语音播报地址变量、温度十位类型过渡变量及温度个位类型过渡变量
//功能部分定义结束
main()
{
modecg=0;
displaycg=0;
BIT_LED=0;
date_ajflag=0;
ring_ajflag=0;
time_ajflag=0;
miaomiao_1=1;
miaomiao_2=1;
miaomiao_3=1;
miaomiao_4=1;
miaomiao_5=1;
miaomiao_play=1;
//以上为各新定义变量的初始化
TEMP=TMOD;
TEMP=TEMP&
0XF0;
TMOD=TEMP|0X01;
time0_times=-time0*fosc/12;
time0_h=(time0_times/256);
time0_1=(time0_times%256);
TH0=time0_h;
TL0=time0_1;
initial_ds1302();
display_bit=0x01;
display_buffer[5]=0x05;
display_buffer[4]=0x03;
display_buffer[3]=0x09;
display_buffer[2]=0x05;
display_buffer[1]=0x01;
display_buffer[0]=0x02;
display_buffer1[7]=0x06;
display_buffer1[6]=0x00;
display_buffer1[5]=0x05;
display_buffer1[4]=0x00;
display_buffer1[3]=0x07;
display_buffer1[2]=0x01;
display_buffer1[1]=0x00;
display_buffer1[0]=0x02;
set_time();
ISD_Init();
dmsec
(1);
tmread();
TR0=EA=ET0=1;
do{
if(key1==0)
{
if(miaomiao_1){
modecg++;
modecg=modecg%2;
//切换工作模式:
0:
显示模式;
1:
校正、定闹模式
miaomiao_1=0;
if(displaycg==0&
&
modecg==1){
for(j=0;
j<
8;
j++)
buffer_temp[j]=display_buffer[j];
}
if(displaycg==2&
buffer_temp[j]=display_buffer1[j];
if(displaycg==1&
ET0=1;
//从主程序的温度显示进入定时中断
buffer_temp[j]=ring[j];
else
if(key2==0)
if(miaomiao_2){
displaycg++;
displaycg=displaycg%3;
//切换显示部分:
时钟;
温度/定闹;
2:
日历
miaomiao_2=0;
//每次切换对buffer_temp[]赋予当前的变量值
}
//温度显示时需关闭定时器
modecg==0){
ET0=0;
//进入温度显示时应关闭定时中断
tmdisplay();
if(key5==0)
if(miaomiao_5){
if((ring[0]==display_buffer[0]&
ring[1]==display_buffer[1]&
ring[2]==display_buffer[2]&
ring[3]==display_buffer[3]&
ring[5]==1)&
modecg==0&
displaycg==0)
ring[5]=0;
//关闭闹钟
reset_time();
//校正确认
miaomiao_5=0;
//整点报温报时功能;
if((display_buffer[2]==0&
display_buffer[3]==0&
display_buffer[4]==0&
display_buffer[5]==0)&
displaycg==0){
if(miaomiao_play==1){
miaomiao_play=0;
//报时部分
ISD_SET_PLAY(73,0,95,0);
if(display_buffer[0]==0){
dmsec(500);
play_adr[1]=get_address(display_buffer[1]);
ISD_SET_PLAY(play_adr[1],0,play_adr[1]+5,0);
dmsec(800);
ISD_SET_PLAY(96,0,104,0);
if(display_buffer[0]==1&
display_buffer[1]==0){
ISD_SET_PLAY(61,0,66,0);
if(display_buffer[0]==2&
ISD_SET_PLAY(159,0,164,0);
display_buffer[1]!
=0){
dmsec(700);
dmsec(600);
//报温部分
dmsec(1400);
ISD_SET_PLAY(125,0,144,0);
if(wendu_shi==0){
dmsec(800);
play_adr[1]=get_address(wendu_ge);
ISD_SET_PLAY(119,0,124,0);
if(wendu_shi==1&
wendu_ge==0){
if(wendu_shi==2&
if(wendu_shi==3&
ISD_SET_PLAY(165,0,170,0);
wendu_ge!
dmsec(500);
}
else{
if(display_buffer[2]==5&
display_buffer[3]==9)//增加此判定条件是为了解决语音重复播报问题
}while
(1);
voidtime0_int(void)interrupt1
TL0=time0_1;
read_time();
modecg==0)
read_date();
//闪烁功能
if(ring[0]==display_buffer[0]&
ring[5]==1)
if(time_t>
200){
BIT_LED=0x00;
SEGMENT=0x00;
time_t--;
else{
display();
if(time_t==0)
time_t=400;
//时间部分开始
unsignedcharget_code(unsignedchari)
unsignedcharp;
switch(i){
case0:
p=0x3F;
break;
case1:
p=0x06;
case2:
p=0x5B;
case3:
p=0x4F;
case4:
p=0x66;
case5:
p=0x6D;
case6:
p=0x7D;
case7:
p=0x07;
case8:
p=0x7F;
case9:
p=0x67;
case10:
p=0x77;
case11:
p=0x7C;
case12:
p=0x39;
case13:
p=0x5E;
case14:
p=0x79;
case15:
p=0x71;
default:
return(p);
unsignedcharget_address(unsignedchark)
switch(k){
case0x00:
p=1;
case0x01:
p=7;
case0x02:
p=13;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安 交大 可报温 报时 电子钟 设计 报告