标题:
MSP430单片机实现秒表,使用proteus8.7仿真
[打印本页]
作者:
xuhe123
时间:
2019-4-4 16:57
标题:
MSP430单片机实现秒表,使用proteus8.7仿真
程序中用到两个时钟。
MCLK设置为8MHZ
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真图.jpg
(141.25 KB, 下载次数: 132)
下载附件
2019-4-4 16:56 上传
定时器A0时钟选择SMCLK,32768HZ,可在proteus中设置
功能描述: 数码管显示秒、分。在显示过程中如果按下按键,则触发中断,停止计数,
再按一次,秒表继续计数。
开发中遇到的问题:在同时显示两个以上数码管时,由于P2端口的数据没有全部置位(共阳极数码管),
导致显示不完整,相同部分缺失。
解决办法,在扫描显示切换时,增加中间过渡数据如下
void display(int sec, int min){
//数码管显示数字缓存
uchar buf[] = {0, 0, 0, 0};
buf[0] = sec%10;
buf[1] = sec/10%10;
buf[2] = min%10;
buf[3] = min/10%10;
P2OUT = SEG[buf[0]];
P3OUT = 0x08;
delay_ms8M(1);
P2OUT = 0xff;// 将P2端口线恢复成0xff,这一点很重要
//可以消除跳变导致的显示错误
P2OUT = SEG[buf[1]];
P3OUT = 0x04;
delay_ms8M(1);
P2OUT = 0xff;
P2OUT = SEG[buf[2]];
P3OUT = 0x02;
delay_ms8M(1);
P2OUT = 0xff;
P2OUT = SEG[buf[3]];
P3OUT = 0x01;
delay_ms8M(1);
P2OUT = 0xff;
}
复制代码
中断函数定义
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void){
if(KEYIN == 0){
delay_ms8M(20);
flag = ~flag;
delay_ms8M(5);
if(!flag){
TACCTL0 &= ~CCIE;//中断失能,关闭
}else{
TACCTL0 |= CCIE;//开启
}
}
P1IFG = 0;
delay_ms8M(5);
}
#pragma vector = TIMERA0_VECTOR
__interrupt void TIMER0_ISR(void){
sec++;
display_flag = ~display_flag;
if(sec == 60){
sec = 0;
min++;
}
}
复制代码
端口初始化
void init_seg_port(void){
P2DIR = 0XFF;
P2OUT = SEG[0];
P3DIR = 0XFF;
P3OUT = 0X00;
}
void init_exti_port(void){
P1DIR &= ~BIT0;
P1IES |= BIT0;
P1IE |= BIT0;
P1IFG &= ~BIT0;//清零 复位
}
复制代码
全部资料51hei下载地址:
MSP430_秒表.zip
(435.05 KB, 下载次数: 90)
2019-4-4 16:56 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
hurray
时间:
2019-12-3 14:10
太难了这个
作者:
luchenzhijia
时间:
2020-5-13 22:52
好东西,学习了,期待!
作者:
SuperJcl
时间:
2020-5-31 21:17
请问内个限流电阻怎么找呀?
作者:
1193
时间:
2020-6-5 13:50
为啥没有复位
作者:
msp8086
时间:
2021-5-25 17:00
我照着楼主的教程试了一下,成功运行了,但是发现秒表跑的速度奇快,请问可以在main.c这个文件里调整速度吗?有点不懂那个.hex文件和.c文件的关系
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1