基于MSP430的多功能数字时钟C程序设计Word格式文档下载.docx
- 文档编号:22480267
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:31
- 大小:59.15KB
基于MSP430的多功能数字时钟C程序设计Word格式文档下载.docx
《基于MSP430的多功能数字时钟C程序设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于MSP430的多功能数字时钟C程序设计Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。
#defineDS18B20_CONVERT_TEM0X44
#defineDS18B20_EECALL_EEPROM0XB8
#defineDS18B20_READ_POWER_SUPPLY0XB4
//===========================DS18B20相关变量====================================
chartemp_data[2]={0x00,0x00};
chardispaly[32];
///////////////////////////////////////////////
charp_key1=255;
charn_key1=255;
charp_key2=255;
charn_key2=255;
charp_key3=255;
charn_key3=255;
charcount1=0;
charcount2=0;
charmode=0;
#definepush_key11
#definepush_key22
#definepush_key33
#definekey1_in(P1IN&
BIT0)
#definekey2_in(P1IN&
BIT1)
#definekey3_in(P5IN&
#definekey_buffsize8
charkey_buff[key_buffsize];
charkey_indexW=0;
charkey_indexR=0;
charkey_count=0;
voidkey_inbuff(charkey);
chargetkey();
voidscan_io();
voiddelay_ms(unsigneddly)
{
inti,j;
for(i=0;
i<
dly;
i++)
for(j=0;
j<
1000;
j++);
}
//////////////////////初始化
#defineled1_1P2OUT|=BIT3;
#defineled1_0P2OUT&
=~BIT3;
#defineled2_1P2OUT|=BIT7;
#defineled2_0P2OUT&
=~BIT7;
#defineled3_1P6OUT|=BIT1;
#defineled3_0P6OUT&
=~BIT1;
#defineled4_1P6OUT|=BIT2;
#defineled4_0P6OUT&
=~BIT2;
#defineBeep_0P6OUT&
#defineBeep_1P6OUT|=BIT3;
charhour=0;
charmin=0;
charsec=0;
charCLKhour=0;
charCLKmin=0;
charclkmode=0;
chardispmode=0;
unsignedinttime=0;
voidinit_sysclk()
unsignedchari;
BCSCTL1&
=~XT2OFF;
do
{
IFG1&
=~OFIFG;
0xee;
i++);
}while(IFG1&
OFIFG);
BCSCTL2|=SELM_2;
//MCLK8MDS18B20的转换需要该时钟频率
BCSCTL2|=SELS;
;
//SMCLK8M
voidinit_TB()
TBCTL=TBCLR;
TBCTL|=TBSSEL_2+MC_1+ID_3;
//1M
TBCCTL0=CCIE;
TBCCR0=1000;
//1msint
voidio_set()
P6DIR|=BIT1+BIT2+BIT3;
P2DIR|=BIT3+BIT7;
P1DIR&
=~(BIT0+BIT1);
P5DIR&
=~BIT0;
voiddisplay()
P4OUT=0X80;
order();
if(hour<
12)
write_char('
a'
);
m'
}
if(hour>
=12)
p'
'
lcd1602_disp_byte(hour);
if(count2==0)
:
'
if(count2==1)
lcd1602_disp_byte(min);
lcd1602_disp_space();
voiddisplayCLK()
if(CLKhour<
if(CLKhour>
lcd1602_disp_byte(CLKhour);
lcd1602_disp_byte(CLKmin);
//////////////////////
voidkey_inbuff(charkey)//键盘部分程序
if(key_count>
=key_buffsize)return;
_DINT();
key_count++;
key_buff[key_indexW]=key;
if(++key_indexW>
=key_buffsize)key_indexW=0;
_EINT();
chargetkey()
charkey;
if(key_count==0)return(0);
key_count--;
key=key_buff[key_indexR];
if(++key_indexR>
=key_buffsize)key_indexR=0;
return(key);
voidscan_io()
p_key1=n_key1;
n_key1=key1_in;
p_key2=n_key2;
n_key2=key2_in;
p_key3=n_key3;
n_key3=key3_in;
if((p_key1==0)&
&
(n_key1!
=0)){key_inbuff(push_key1);
if((p_key2==0)&
(n_key2!
=0)){key_inbuff(push_key2);
if((p_key3==0)&
(n_key3!
=0)){key_inbuff(push_key3);
#pragmavector=WDT_VECTOR
__interruptvoidWDT_ISR(void)
scan_io();
//////////////////////////////
//==============================================================================
voidDS18B20_IO_set(void)
P6SEL&
=0x7f;
//===========================DS18B20延时========================================
voidDS1820_delay(inti)
while(i--);
//========================================长延时================================
voidDelay(ints)
unsignedinti,j;
i<
s;
i++);
j<
j++);
//==========================DS18B20复位=========================================
voidds18b20_reset(void)
{
DS18B20_OUT;
//
OUT_DS18B20_1;
OUT_DS18B20_0;
DS1820_delay(3000);
//500us
DS18B20_IN;
//设置为输入
DS1820_delay(40);
while(P6IN&
BIT7);
DS1820_delay(300);
}
//========================DS18B20读操作函数=====================================
chards18b20_read(void)
chari;
chartemp=0;
8;
temp>
>
=1;
if(P6IN&
BIT7)
temp|=0x80;
DS1820_delay(4);
DS1820_delay(50);
return(temp);
//========================DS18B20写操作函数=====================================
voidds18b20_write(charDate)
//DS1820_delay(6);
if(Date&
0x01)
else
Date>
DS1820_delay(8);
//======================DS18B20温度转换函数=====================================
voidDs18b20Convert(void)
ds18b20_reset();
ds18b20_write(0xCC);
//DS18B20_SKIP_ROM
ds18b20_write(0x44);
//DS18B20_CONVERT_TEM
Delay(200);
//DS18B20_SKIP_ROM
ds18b20_write(0xBE);
//DS18B20_READ_RAM
temp_data[0]=ds18b20_read();
//先读转换结果的低八位
temp_data[1]=ds18b20_read();
//读转换结果的高八位
//=========================温度换算处理=========================================
voidwork_temp()
charn=0;
if(temp_data[1]>
127)
temp_data[1]=(256-temp_data[1]);
//负值
temp_data[0]=(256-temp_data[0]);
n=1;
dispaly[6]=((temp_data[0]&
0xf0)>
4)|((temp_data[1]&
0x0f)<
<
4);
dispaly[5]=dispaly[6]/100;
//百位
dispaly[4]=dispaly[6]%100;
//
dispaly[2]=dispaly[4]/10;
//十位
dispaly[1]=dispaly[4]%10;
//个位
switch(temp_data[0]&
0x0f)//小数位
case0x0f:
dispaly[0]=9;
break;
case0x0e:
case0x0d:
dispaly[0]=8;
case0x0c:
case0x0b:
dispaly[0]=7;
case0x0a:
dispaly[0]=6;
case0x09:
case0x08:
dispaly[0]=5;
case0x07:
dispaly[0]=4;
case0x06:
case0x05:
dispaly[0]=3;
case0x04:
case0x03:
dispaly[0]=2;
case0x02:
dispaly[0]=1;
case0x01:
case0x00:
default:
if(n)//负值时显示aa,正直显示dd
dispaly[3]=11;
//
elsedispaly[3]=10;
/////////////////////////////////////主程序
voidmain()
WDTCTL=WDT_ADLY_16;
init_sysclk();
init_TB();
init_lcd1602();
display();
io_set();
DS18B20_IO_set();
Beep_1;
led1_0;
led2_0;
led3_0;
led4_0;
IE1|=WDTIE;
Ds18b20Convert();
while
(1)
//采集温度
work_temp();
//算法处理结果存在dispaly数组里
key=getkey();
if(key==push_key1)
count2=0;
while
(1)//selctmode
if(key==push_key1)count1++;
if(count1==2)count1=0;
if(count1==0){mode=0;
led1_1;
led2_0;
TBCCTL0&
=~CCIE;
if(count1==1){mode=1;
led1_0;
led2_1;
TBCCTL0|=CCIE;
if(key==push_key2)break;
//presskey2togetout
if(mode==0)
while
(1)//settime
if(key==push_key1)hour++;
if(key==push_key2)min++;
if(min==60)min=0;
if(hour==24)hour=0;
if(key==push_key3)break;
//presskey3togetout
TBCCTL0|=CCIE;
if(mode==1)
while
(1)//setCLKtime
if(key==push_key1)CLKhour++;
if(key==push_key2)CLKmin++;
if(min==60)CLKmin=0;
if(hour==24)CLKhour=0;
displayCLK();
mode=0;
if(key==push_key2)
clkmode++;
if(clkmode==2)clkmode=0;
if(clkmode==0)led3_0;
if(clkmode==1)led3_1;
/*while
(1)
if(key==push_key1)clkmode++;
}*/
if(clkmode==1)//脑钟会鸣响分钟
if(CLKhour==hour&
CLKmin==min)
Beep_0;
//callpolicetwice
delay_ms(800);
if(key==push_key3)
dispmode++;
if(dispmode==2)dispmode=0;
//if(dispmode==1)lcd1602_dispnum(dispaly);
if(dispmode==1)lcd1602_dispnum(dispaly);
#pragmavector=TIMERB0_VECTOR//timrbint
__interruptvoidTB_ISR(void)
time++;
if(time==1000)
count2++;
if(count2==2)count2=0;
time=0;
sec++;
if(sec==60)
sec=0;
min++;
if(min==60)
min=0;
hour++;
if(hour==24)
hour=0;
if(dispmode==0&
mode==0)display();
//DS18B20.c
//#include"
#def
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MSP430 多功能 数字 时钟 程序设计