基于MSP430的多功能数字时钟C程序设计.doc_第1页
基于MSP430的多功能数字时钟C程序设计.doc_第2页
基于MSP430的多功能数字时钟C程序设计.doc_第3页
基于MSP430的多功能数字时钟C程序设计.doc_第4页
基于MSP430的多功能数字时钟C程序设计.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

硬件连接图源程序如下:/主程序/*功能:1、KEY1循环选择设置时间模式和设置闹钟模式。 选择设置时间模式时P2.3口灯亮,选择设置闹 钟模式时P2.7口的灯亮。KEY2按下退出模式选 择,同时进入时间/闹钟设置,按KEY1小时位加 ,按KEY2分钟位加。 2、KEY3按下退出时间/闹钟设置,同时显示温度, 循环按KEY3可切换温度与时间的显示。 3、未进入设置模式状态时,KEY2可循环选择闹钟 的开启和关闭。注:在闹钟设置状态下,时钟并没有停止,是不停的走动的。且在时间走动显示过程中,小时和分钟之间的分隔符号每秒闪烁次。小时进制。*/#includemsp430x14x.h#includelcd1602.h/=DS18B20端口=#define OUT_DS18B20_0 P6OUT &=BIT7 /输出#define OUT_DS18B20_1 P6OUT |= BIT7 /输出#define DS18B20_IN P6DIR &=BIT7 /方向设置为输入#define DS18B20_OUT P6DIR |= BIT7 /方向设置为输出/=DS18B20寄存器指令=#define DS18B20_READ_ROM 0x33#define DS18B20_MATCH_ROM 0X55#define DS18B20_SKIP_ROM 0XCC#define DS18B20_SEARCH_ROM 0XF0#define DS18B20_ALARM_SEARCH_ROM 0XEC#define DS18B20_WRITE_RAM 0X40#define DS18B20_READ_RAM 0XBE#define DS18B20_COPY_RAM 0X48 #define DS18B20_CONVERT_TEM 0X44#define DS18B20_EECALL_EEPROM 0XB8#define DS18B20_READ_POWER_SUPPLY 0XB4/=DS18B20相关变量=char temp_data2=0x00,0x00;char dispaly32;/char p_key1=255;char n_key1=255;char p_key2=255;char n_key2=255;char p_key3=255;char n_key3=255;char count1=0;char count2=0;char mode=0;#define push_key1 1#define push_key2 2#define push_key3 3#define key1_in (P1IN&BIT0)#define key2_in (P1IN&BIT1)#define key3_in (P5IN&BIT0)#define key_buffsize 8char key_buffkey_buffsize;char key_indexW=0;char key_indexR=0;char key_count=0;void key_inbuff(char key);char getkey();void scan_io();void delay_ms(unsigned dly) int i,j; for(i=0;idly;i+) for(j=0;j1000;j+);/初始化#define led1_1 P2OUT |=BIT3;#define led1_0 P2OUT &=BIT3;#define led2_1 P2OUT |=BIT7;#define led2_0 P2OUT &=BIT7;#define led3_1 P6OUT |=BIT1;#define led3_0 P6OUT &=BIT1;#define led4_1 P6OUT |=BIT2;#define led4_0 P6OUT &=BIT2;#define Beep_0 P6OUT &=BIT3;#define Beep_1 P6OUT |=BIT3;char hour=0;char min=0;char sec=0;char CLKhour=0;char CLKmin=0;char clkmode=0;char dispmode=0;unsigned int time=0;void init_sysclk() unsigned char i; BCSCTL1 &=XT2OFF; do IFG1 &=OFIFG; for(i=0;i0xee;i+); while(IFG1&OFIFG); BCSCTL2 |=SELM_2;/MCLK 8M DS18B20的转换需要该时钟频率 BCSCTL2 |=SELS;/SMCLK 8Mvoid init_TB() TBCTL=TBCLR; TBCTL |=TBSSEL_2+MC_1+ID_3;/1M TBCCTL0=CCIE; TBCCR0=1000; /1 ms intvoid io_set() P6DIR |=BIT1+BIT2+BIT3; P2DIR |=BIT3+BIT7; P1DIR &=(BIT0+BIT1); P5DIR &=BIT0;void display() P4OUT=0X80; order(); if(hour=12) write_char(p); write_char(m); write_char( ); lcd1602_disp_byte(hour); if(count2=0) write_char(:); if(count2=1) write_char( ); lcd1602_disp_byte(min); lcd1602_disp_space();void displayCLK() P4OUT=0X80; order(); if(CLKhour=12) write_char(p); write_char(m); write_char( ); lcd1602_disp_byte(CLKhour); write_char(:); lcd1602_disp_byte(CLKmin); lcd1602_disp_space();/void key_inbuff(char key) /键盘部分程序 if(key_count=key_buffsize)return; _DINT(); key_count+; key_buffkey_indexW=key; if(+key_indexW=key_buffsize)key_indexW=0; _EINT();char getkey() char key; if(key_count=0)return(0); _DINT(); key_count-; key=key_buffkey_indexR; if(+key_indexR=key_buffsize)key_indexR=0; _EINT(); return(key);void scan_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);#pragma vector=WDT_VECTOR_interrupt void WDT_ISR(void) scan_io();/=void DS18B20_IO_set(void) P6SEL&=0x7f; /=DS18B20延时= void DS1820_delay(int i)while(i-);/=长延时=void Delay(int s)unsigned int i,j;for(i=0; is; i+);for(j=0; js; j+);/=DS18B20复位=void ds18b20_reset(void) DS18B20_OUT; / OUT_DS18B20_1; OUT_DS18B20_0; DS1820_delay(3000); /500us OUT_DS18B20_1; DS18B20_IN; /设置为输入 DS1820_delay(40); while(P6IN&BIT7); DS18B20_OUT; OUT_DS18B20_1; DS1820_delay(300); /=DS18B20读操作函数=char ds18b20_read(void) char i; char temp=0; for(i=0;i=1; OUT_DS18B20_1; DS18B20_IN; if(P6IN&BIT7) temp|=0x80; DS1820_delay(4); DS18B20_OUT; DS1820_delay(50); return (temp);/=DS18B20写操作函数=void ds18b20_write(char Date) char i; DS18B20_OUT; for(i=0;i=1; DS1820_delay(8); /=DS18B20温度转换函数=void Ds18b20Convert(void) ds18b20_reset(); ds18b20_write(0xCC);/DS18B20_SKIP_ROM ds18b20_write(0x44);/DS18B20_CONVERT_TEM Delay(200); ds18b20_reset(); ds18b20_write(0xCC); /DS18B20_SKIP_ROM ds18b20_write(0xBE); /DS18B20_READ_RAM temp_data0=ds18b20_read();/先读转换结果的低八位 temp_data1=ds18b20_read();/读转换结果的高八位/=温度换算处理=void work_temp()char n=0; if(temp_data1127)temp_data1=(256-temp_data1);/负值temp_data0=(256-temp_data0);n=1;dispaly6=(temp_data0&0xf0)4)|(temp_data1&0x0f) 0; iq0-);/ 延时,等待XT2起振 while (IFG1 & OFIFG) != 0);/ 判断XT2是否起振 BCSCTL2 =SELM1+SELS; / MCLK,SMCLK时钟为XT2*/=void DS18B20_IO_set(void) P6SEL&=0x7f; /=DS18B20延时= void DS1820_delay(int i)while(i-);/=长延时=void Delay(int s)unsigned int i,j;for(i=0; is; i+);for(j=0; js; j+);/=DS18B20复位=void ds18b20_reset(void) DS18B20_OUT; / OUT_DS18B20_1; OUT_DS18B20_0; DS1820_delay(3000); /500us OUT_DS18B20_1; DS18B20_IN; /设置为输入 DS1820_delay(40); while(P6IN&BIT7); DS18B20_OUT; OUT_DS18B20_1; DS1820_delay(300); /=DS18B20读操作函数=char ds18b20_read(void) char i; char temp=0; for(i=0;i=1; OUT_DS18B20_1; DS18B20_IN; if(P6IN&BIT7) temp|=0x80; DS1820_delay(4); DS18B20_OUT; DS1820_delay(50); return (temp);/=DS18B20写操作函数=void ds18b20_write(char Date) char i; DS18B20_OUT; for(i=0;i=1; DS1820_delay(8); /=DS18B20温度转换函数=void Ds18b20Convert(void) ds18b20_reset(); ds18b20_write(0xCC);/DS18B20_SKIP_ROM ds18b20_write(0x44);/DS18B20_CONVERT_TEM Delay(200); ds18b20_reset(); ds18b20_write(0xCC); /DS18B20_SKIP_ROM ds18b20_write(0xBE); /DS18B20_READ_RAM temp_data0=ds18b20_read();/先读转换结果的低八位 temp_data1=ds18b20_read();/读转换结果的高八位/=温度换算处理=void work_temp()char n=0; if(temp_data1127)temp_data1=(256-temp_data1);/负值temp_data0=(256-temp_data0);n=1;dispaly6=(temp_data0&0xf0)4)|(temp_data1&0x0f)4);dispaly5=dispaly6/100;/百位dispaly4=dispaly6%100;/dispaly2=dispaly4/10;/十位dispaly1=dispaly4%10;/个位switch(temp_data0&0x0f)/小数位case 0x0f:dispaly0=9;break;case 0x0e:dispaly0=9;break;case 0x0d:dispaly0=8;break;case 0x0c:dispaly0=8;break;case 0x0b:dispaly0=7;break;case 0x0a:dispaly0=6;break;case 0x09:dispaly0=6;break;case 0x08:dispaly0=5;break;case 0x07:dispaly0=4;break;case 0x06:dispaly0=4;break;case 0x05:dispaly0=3;break;case 0x04:dispaly0=3;break;case 0x03:dispaly0=2;break;case 0x02:dispaly0=1;break;case 0x01:dispaly0=1;break;case 0x00:dispaly0=1;break;default:break; if(n)/负值时显示aa,正直显示dddispaly3=11;/ else dispaly3=10;/lcd1602.c#includemsp430x14x.h#define set(x) P6OUT |=x#define clr(x) P6OUT &=x#define rs BIT6#define rw BIT5#define e BIT4const char lcd_tab=0,1,2,3,4,5,6,7,8,9;void init_lcd1602();void lcd1602_disp_byte(unsigned char num);/可以显示void lcd1602_disp_space();void write_char(char ch);void order();void data();void delay();void init_lcd1602() P6DIR |=BIT4+BIT5+BIT6; P4DIR=0XFF; P4OUT=0X01; order(); P4OUT=0X38; order(); P4OUT=0X0C; order(); P4OUT=0X06; order(); /P4OUT=0X80; /order();void lcd1602_dispnum(char *ptr) char disp_buff4; char i,ch; for(i=0;i4;i+) disp_buffi=*ptr; ptr+; P4OUT=0X80; order(); ch=disp_buff3; if(ch=11)write_char(lcd_tabch); ch=disp_buff2; wr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论