导航:首页 > 编程语言 > max541msp430程序

max541msp430程序

发布时间:2021-12-08 16:17:11

⑴ 用C语言编写程序使MSP430单片机实现数字时钟(显示年月日,时分秒,最好也能显示星期)

我以前倒是做过,不过程序还有点问题,调时间的时候容易过界,但正常走时候就正常了。开发环境用的IAR,单片机用f149,显示用的1602的四线模式。
你自己看着改程序吧,其实我也是51上移植过去的。

悲剧了,帖不下了.我帖在我博客里了啊,自己去找吧.
主程序
__________________________分隔线____________________________________

#include <msp430x14x.h>
#include "ds1302.h"
#include "LCD1602x4_mps.h"

#define DS1302_SECOND 0x81 //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE 0x83
#define DS1302_HOUR 0x85
#define DS1302_WEEK 0x8b
#define DS1302_DAY 0x87
#define DS1302_MONTH 0x89
#define DS1302_YEAR 0x8d

unsigned char DateString[11],TimeString[9],week_value[2],TempBuffer[7]; //
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;
char done,count,temp,flag,up_flag,down_flag;
//unsigned int temp_value=0,temp_max=0;temp_min=0; //温度值

void DateToStr(void) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{ unsigned char Year,Month,Day,Week;
Year=rtc_getyear();
Month=rtc_getmon();
Day=rtc_getdate();
Week=rtc_getday();

if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
{
DateString[0] = '2';
DateString[1] = '0';
DateString[2] = Year/10 + '0';
DateString[3] = Year%10 + '0';
}
else
{
DateString[0] = ' ';
DateString[1] = ' ';
DateString[2] = ' ';
DateString[3] = ' ';
}
DateString[4] = '/';
if(hide_month<2)
{
DateString[5] = Month/10 + '0';
DateString[6] = Month%10 + '0';
}
else
{
DateString[5] = ' ';
DateString[6] = ' ';
}
DateString[7] = '/';
if(hide_day<2)
{
DateString[8] = Day/10 + '0';
DateString[9] = Day%10 + '0';
}
else
{
DateString[8] = ' ';
DateString[9] = ' ';
}
if(hide_week<2)
{
week_value[0] = Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
}
else
{
week_value[0] = ' ';
}
week_value[1] = '\0';

DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
}

void TimeToStr(void) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
{ unsigned char Hour,Minute,Second;
Hour=rtc_gethour();
Minute=rtc_getmin();
Second=rtc_getsec();
if(hide_hour<2)
{
TimeString[0] = Hour/10 + '0';
TimeString[1] = Hour%10 + '0';
}
else
{
TimeString[0] = ' ';
TimeString[1] = ' ';
}
TimeString[2] = ':';
if(hide_min<2)
{
TimeString[3] = Minute/10 + '0';
TimeString[4] = Minute%10 + '0';
}
else
{
TimeString[3] = ' ';
TimeString[4] = ' ';
}
TimeString[5] = ':';
if(hide_sec<2)
{
TimeString[6] = Second/10 + '0';
TimeString[7] = Second%10 + '0';
}
else
{
TimeString[6] = ' ';
TimeString[7] = ' ';
}
DateString[8] = '\0';
}

void show_time() //液晶显示程序
{
TimeToStr(); //时间数据转换液晶字符
DateToStr(); //日期数据转换液晶字符
// ReadTemp(); //开启温度采集程序
// temp_to_str(); //温度数据转换成液晶字符
LCD_PutStr(TempBuffer,25); //显示温度
LCD_PutStr(DateString,0); //显示日期
LCD_PutStr(week_value,15); //显示星期
LCD_PutStr(" Week",10); //在液晶上显示 字母 week
LCD_PutStr(TimeString,16); //显示时间
}
////////////////////////////////////////////////////////////////////////////

void outkey() //跳出调整模式,返回默认显示
{ unsigned char Second;
if (!(P1IN&BIT0))
{
count=0;
hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
Second=dataread(DS1302_SECOND);
datawrite(0x8e,0x00); //写入允许
datawrite(0x80,Second&0x7f);
datawrite(0x8E,0x80); //禁止写入
done=0;//temp_max=0;sund=1;
while(!(P1IN&BIT0));
delay_nms(2);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Upkey()//升序按键
{
if(!(P1IN&BIT1))
{
switch(count)
{case 1:
temp=dataread(DS1302_SECOND); //读取秒数
temp=temp+1; //秒数加1
up_flag=1; //数据调整后更新标志
if((temp&0x7f)>0x59) //超过59秒,清零
temp=0;
break;
case 2:
temp=dataread(DS1302_MINUTE); //读取分数
temp=temp+1; //分数加1
up_flag=1;
if(temp>0x59) //超过59分,清零
temp=0;
break;
case 3:
temp=dataread(DS1302_HOUR); //读取小时数
temp=temp+1; //小时数加1
up_flag=1;
if(temp>0x23) //超过23小时,清零
temp=0;
break;
case 4:
temp=dataread(DS1302_WEEK); //读取星期数
temp=temp+1; //星期数加1
up_flag=1;
if(temp>0x7)
temp=1;
break;
case 5:
temp=dataread(DS1302_DAY); //读取日数
temp=temp+1; //日数加1
up_flag=1;
if(temp>0x31)
temp=1;
break;
case 6:
temp=dataread(DS1302_MONTH); //读取月数
temp=temp+1; //月数加1
up_flag=1;
if(temp>0x12)
temp=1;
break;
case 7:
temp=dataread(DS1302_YEAR); //读取年数
temp=temp+1; //年数加1
up_flag=1;
if(temp>0x99)
temp=0;
break;
default:break;
}

while(!(P1IN&BIT1));
delay_nms(2);
}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Downkey()//降序按键
{
if(!(P1IN&BIT2))
{
switch(count)
{case 1:
temp=dataread(DS1302_SECOND); //读取秒数
temp=temp-1; //秒数减1
down_flag=1; //数据调整后更新标志
if((temp&0x7f)>0x59) //小于0秒,返回59秒
temp=0x59;
break;
case 2:
temp=dataread(DS1302_MINUTE); //读取分数
temp=temp-1; //分数减1
down_flag=1;
if(temp>0x59)
temp=0x59; //小于0秒,返回59秒
break;
case 3:
temp=dataread(DS1302_HOUR); //读取小时数
temp=temp-1; //小时数减1
down_flag=1;
if(temp==0x00)
temp=0x23;
break;
case 4:
temp=dataread(DS1302_WEEK); //读取星期数
temp=temp-1; //星期数减1
down_flag=1;
if(temp==0x00)
temp=0x07;
break;
case 5:
temp=dataread(DS1302_DAY); //读取日数
temp=temp-1; //日数减1
down_flag=1;
if(temp==0x00)
temp=0x31;
break;
case 6:
temp=dataread(DS1302_MONTH); //读取月数
temp=temp-1; //月数减1
down_flag=1;
if(temp==0x00)
temp=0x12;
break;
case 7:
temp=dataread(DS1302_YEAR); //读取年数
temp=temp-1; //年数减1
down_flag=1;
if(temp>0x99)
temp=0x99;
break;
default:break;
}

while(!(P1IN&BIT2));
delay_nms(2);
}
}

void Setkey()//模式选择按键
{
if(!(P1IN&BIT3))
{
count=count+1; //Setkey按一次,count就加1
done=1; //进入调整模式
while(!(P1IN&BIT3));
delay_nms(2);
}

}

void keydone()//按键功能执行
{ unsigned char Second;
if(flag==0) //关闭时钟,停止计时
{ datawrite(0x8e,0x00); //写入允许
temp=dataread(DS1302_SECOND);
datawrite(0x80,temp|0x80);
datawrite(0x8e,0x80); //禁止写入
flag=1;
}
Setkey(); //扫描模式切换按键
switch(count)
{
case 1:do //count=2,调整秒
{
outkey(); //扫描跳出按钮
Upkey(); //扫描加按钮
Downkey(); //扫描减按钮
if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x80,temp|0x80); //写入新的秒数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}

hide_sec++; //位闪计数
if(hide_sec>3)
hide_sec=0;
show_time(); //液晶显示数据
}while(count==2);break;
case 2:do //count=3,调整分
{
hide_sec=0;
outkey();
Upkey();
Downkey();
if(temp>0x60)
temp=0;
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x82,temp); //写入新的分数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_min++;
if(hide_min>3)
hide_min=0;
show_time();
}while(count==3);break;
case 3:do //count=4,调整小时
{
hide_min=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x84,temp); //写入新的小时数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_hour++;
if(hide_hour>3)
hide_hour=0;
show_time();
}while(count==4);break;
case 4:do //count=5,调整星期
{
hide_hour=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x8a,temp); //写入新的星期数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_week++;
if(hide_week>3)
hide_week=0;
show_time();
}while(count==5);break;
case 5:do //count=6,调整日
{
hide_week=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x86,temp); //写入新的日数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_day++;
if(hide_day>3)
hide_day=0;
show_time();
}while(count==6);break;
case 6:do //count=7,调整月
{
hide_day=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x88,temp); //写入新的月数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_month++;
if(hide_month>3)
hide_month=0;
show_time();
}while(count==7);break;
case 7:do //count=8,调整年
{
hide_month=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x8c,temp); //写入新的年数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_year++;
if(hide_year>3)
hide_year=0;
show_time();
}while(count==8);break;
case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态
Second=dataread(0x80);
datawrite(0x8e,0x00); //写入允许
datawrite(0x80,Second&0x7f);
datawrite(0x8E,0x80); //禁止写入
done=0; //temp_max=0;sund=1;
break; //count=7,开启中断,标志位置0并退出
default:break;

}

}
////////////////////////////////////////////////////////////////////////////

void rtcinit ()
{
rtc_wp(0);
rtc_stop(0);
rtc_charger(1,1);
}

void sysinit ()
{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P4OUT = 0xff;
P4DIR = 0xff;
P5OUT = 0x0f;
P5DIR = 0xf0;
P6OUT = 0xfc;
P6DIR = 0xfc;
}

void main ()
{ unsigned char temp;
sysinit ();
rtcinit ();
LCD_init(); //液晶初始化
_EINT();
while (1)
{
while(done==1)
keydone(); //进入调整模式
while(done==0)
{
temp=rtc_getsec();
delay_nms(10);
if(temp!=rtc_getsec())
show_time(); //液晶显示数据
flag=0;
Setkey(); //扫描各功能键
}

}

}

⑵ 求解MSP430单片机 的一段程序!!!!

这个是哪个系列的单片机,给具体型号?
你用的是什么编译器?
我在MSPX13X,MSPX14X,MSPX14X1里面都找不到你上面写的这样的寄存器,你最好把原始的寄存器名称贴上来,否则爱莫能助。

⑶ msp430控制max262,做低通滤波器

5Hz还不如电容电阻搭一个电路,用这个芯片的效果不会很好

⑷ MSP430的编程,明明是例子,为什么有error……大侠帮忙啊~谢谢啊~!!!!找出问题追加分~拜托拜托了~

应该是你程序的RAM空间不够。。 能用Uint的 就不要用INT 能用char的就不要用INT

⑸ 关于MSP430的中断函数服务程序

你在主函数里边把串口中断和总中断打开就是了,它自己进去.也是就是硬件提供中断请求,然后cpu响应,然后从中断向量表查出相关的入口地址,就进去了.

⑹ 求单片机msp430x14x config.h头文件

config.h 430单片机头文件代码最后的复制代码保存到电脑的方式实现下载:

⑺ 使用MSP430,我想使用为ACLK,频率为12KHZ作为外围模块时钟。但是程序不能运行,哪位帮忙看下

你是想输出时钟吗?我贴一个TI例程给你看看,希望有帮助,还有就是430F149 aclk的输出引脚一般是p5.6,你参考芯片引脚进行改进比较好
//******************************************************************************
// MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK
//
// Description: Output buffered MCLK, SMCLK and ACLK.
// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2
// //* XTAL's REQUIRED - NOT INSTALLED ON FET *//
// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//
//
// MSP430F149
// -----------------
// /|\| XIN|-
// | | | 32k
// --|RST XOUT|-
// | |
// | XT2IN|-
// | | XTAL (455k - 8Mhz)
// |RST XT2OUT|-
// | |
// | P5.4|-->MCLK = DCO Max
// | P5.5|-->SMCLK = XT2
// | P5.6|-->ACLK = 32kHz
//
// M. Buccini
// Texas Instruments Inc.
// Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include <msp430x14x.h>
void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer
DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO
BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL
BCSCTL2 |= SELS; // SMCLK = XT2
P5DIR |= 0x70; // P5.6,5,4 outputs
P5SEL |= 0x70; // P5.6,5,5 options
while(1)
{
}
}

⑻ 求msp430单片机基于max262的滤波程序

#include"msp430fg4618.h"
#definea0BIT0
#definea1BIT1
#definea2BIT2
#definea3BIT3
#defined0BIT4
#defined1BIT5
#definewrBIT6
#definectrlportP5OUT

//addr的取值范围0-15,dat的取值范围0-3
voidmax262writedat(ucharaddr,uchardat)
{
ctrlport=addr+dat*16;
delay_us(5);
ctrlport|=wr;
delay_us(10);
}

//mode=M1M0,q=Q6Q5Q4Q3Q2Q1Q0,ratio=F5F4F3F2F1F0
voidmax262setA(ucharmode,ucharq,ucharratio)
{
max262writedat(0,mode-1);
max262writedat(4,q&0x03);//Q1Q0
max262writedat(5,(q>>2)&0x03);//Q3Q2
max262writedat(6,(q>>4)&0x03);//Q5Q4
max262writedat(7,(q>>6)&0x03);//Q6
max262writedat(1,ratio&0x03);//F1F0
max262writedat(2,(ratio>>2)&0x03);//F3F2
max262writedat(3,(ratio>>4)&0x03);//F5F4
}
voidmax262setB(ucharmode,ucharq,ucharratio)
{
max262writedat(8,mode-1);
max262writedat(12,q&0x03);//Q1Q0
max262writedat(13,(q>>2)&0x03);//Q3Q2
max262writedat(14,(q>>4)&0x03);//Q5Q4
max262writedat(15,(q>>6)&0x03);//Q6
max262writedat(9,ratio&0x03);//F1F0
max262writedat(10,(ratio>>2)&0x03);//F3F2
max262writedat(11,(ratio>>4)&0x03);//F5F4
}
//初始化后滤波器A和B的参数:mode3(LP,BP,HP),Q=1,fclk/f0=40.84
voidmax262init()
{
P5DIR=0xff;
ctrlport=0x00;
max262setA(3,64,0);
max262setB(3,64,0);
}

⑼ MSP430中__enable_interrupt()实现函数在哪里,怎么看不到

1)$(_WINCEROOT)\PLATFORM\smdk2410\DRIVERS\PWRBTN文件夹下面的三个文件pwrbtn2410.c、 pwrbtn2410.h和pwrbtn2410.def,这个PowerButton驱动是通过流驱动实现的,实现的过程很简单,下面会详细说明。
2)$(_WINCEROOT)\PLATFORM\smdk2410\INC\oalintr.h,定义非内核模式的中断号( non-kernel interrupt identifiers )
3)$(_WINCEROOT)\PLATFORM\smdk2410\KERNEL\HAL\cfw.c,这里面主要实现了 OEMInitInterrupts、OEMInterruptEnable、OEMInterruptDisable、 OEMInterruptDone这几个重要的中断函数。
4)$(_WINCEROOT)\PLATFORM\smdk2410\KERNEL\HAL\ARM\armint.c,这里主要实现了OEMInterruptHandler这个中断处理函数。
下面我简单分析一下中断处理过程。
a) 首先你为自己的硬件(键盘,按键等需要使用的中断)定义一个中断名称,比如这个电源按键就起了一个中断名称SYSINTR_POWER,然后在oalintr.h里面把它定义成SYSINTR_FIRMWARE+n的形式
比如: #define SYSINTR_POWER (SYSINTR_FIRMWARE+13)
n必须小于SYSINTR_MAXUMUM or SYSINTR_FIRMWARE+23

阅读全文

与max541msp430程序相关的资料

热点内容
ps肉色代码 浏览:258
快穿以肉为主 浏览:376
券商的数据分析工程师怎么样 浏览:31
日本武士恐怖电影 浏览:120
电影电视剧小孩子的恋爱 浏览:383
怎么下载pptv网络电视 浏览:3
邵氏论理电影 浏览:142
ps怎么导成制作文件 浏览:273
文件夹和桌面同步快捷方式 浏览:187
阿里云如何上传压缩文件 浏览:244
李彩谭作品大全 浏览:955
可迅雷下载的免费网站你懂得 浏览:951
贵州数据公司前景如何 浏览:293
格信网络技术有限公司电话 浏览:598
桌面上整理的文件都去哪里了 浏览:848
微信2016年业绩报告 浏览:312
文件对比软件免费的 浏览:891
女主姓沈的现代重生小说 浏览:439
求三角形面积的c程序 浏览:678
网络信任是如何 浏览:362

友情链接