完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题是这样的,DS12C887设置为有脉冲输出作为测试信号,主要的是想要IRQ信号,来回复位。每500ms产生一次周期中断。那么,主程序中,在中断函数中,读取了C寄存器的值,但是IRQ依旧无法复位。也尝试更改了ds12c887中的SETtiME和GETTIME,依旧还是不行。不知道怎么才能实现。
|
|
相关推荐
8个回答
|
|
#include"DS12C887.h"
#include"NixieLight.h" unsigned int hour1; //用于存储小时的第一位 unsigned int hour2; //用于存储小时的第二位 unsigned int minute1;//用于存储分钟的第一位 unsigned int minute2;//用于存储分钟的第二位 extern struct SYSTEMTIME SetDS12C887Time;//声明两个在DS12C887.c中定义的结构体变量 extern struct SYSTEMTIME ReadDS12C887Time; extern struct ALARM Alarm;//声明在DS12C887.c中定义的结构体变量 void Delay(unsigned int aa) { for(unsigned int i=0;i } void DisplayTime() { AllCOM_OFF; if(hour1==0) P4OUT=0x00; //消隐 else P4OUT=Nixielight_Tab[hour1]; //第一位显示 COM1_ON; Delay(8); AllCOM_OFF; P4OUT=Nixielight_Tab[hour2]; //第二位显示 COM2_ON; Delay(8); AllCOM_OFF; P4OUT=Nixielight_Tab[minute1]; //第三位显示 COM3_ON; Delay(8); AllCOM_OFF; P4OUT=Nixielight_Tab[minute2]; //第四位显示 COM4_ON; Delay(8); } void main() { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P4DIR |= 0xff; //P4口控制数码管的7个段,所以提前设置为输出 P3DIR |= 0xff; //P3口控制数码管的4个位选通,所以提前设置为输出 P3OUT&=0x00; P3OUT|=(BIT4+BIT5); P1DIR |= BIT0+BIT1+BIT2+BIT3; //P1口的低4位控制DS12C887的DS、AS、CS和R/W,提前设置为输出 //---------------------I/O口接收来自DS12C887的中断--------------------------- P1DIR &= ~BIT4; //P1.4为输入 P1IES |= BIT4; //下降沿触发 P1IE |= BIT4; //使能P1.4中断 _EINT(); //使能总中断 //--------------------------------------------------------------------------// //----------------------------时钟有关程序----------------------------------- SetDS12C887Time.Second=0x00; SetDS12C887Time.Minute=0x00; SetDS12C887Time.Hour=0x17; SetDS12C887Time.Week=0x01; SetDS12C887Time.Day=0x05; SetDS12C887Time.Month=0x0C; SetDS12C887Time.Year=0x10; //Alarm.Second=0x05; //10S产生一次中断,在中断服务程序中读取时间 //Alarm.Minute=0xFE; //Alarm.Hour=0xFF; DS12C887_Init(); SetTime(); //SetAlarm(); //--------------------------------------------------------------------------// while(1) { /* GetTime(); hour1=ReadDS12C887Time.Hour/10; hour2=ReadDS12C887Time.Hour%10; minute1=ReadDS12C887Time.Minute/10; minute2=ReadDS12C887Time.Minute%10;*/ DisplayTime(); } } //在I/O口中断程序中,读取时间值,清除中断标志,并转换为数码管要显示的数字 #pragma vector=PORT1_VECTOR __interrupt void P1_ISR(void) { if(P1IFG&BIT4) { P3OUT^=0x30; GetTime(); ReadData(0x0C); //读C寄存器,清除DS12C887中断标志 // _NOP(); } hour1=ReadDS12C887Time.Hour/10; hour2=ReadDS12C887Time.Hour%10; minute1=ReadDS12C887Time.Minute/10; minute2=ReadDS12C887Time.Minute%10; P1IFG=0; //清除I/O口中断标志 return; } #include"DS12C887.h" struct SYSTEMTIME SetDS12C887Time;//定义两个结构体变量,用于设置和读取时间 struct SYSTEMTIME ReadDS12C887Time; struct ALARM Alarm;//定义闹钟变量,用于产生闹钟中断,在中断程序中读取时间 void WriteData(unsigned char address,unsigned char data) { DATA_OUT; OutData=0x00; //先将地址清零 _NOP(); OutData=address;//送地址 //以下程序严格按照数据手册上时序图编写,请对照数据手册看程序 RW_SetHigh; CS_SetHigh; DS_SetHigh; _NOP(); AS_SetHigh; CS_SetLow; _NOP(); AS_SetLow; _NOP(); RW_SetLow; OutData=data; _NOP(); RW_SetHigh; _NOP(); CS_SetHigh; _NOP(); AS_SetHigh; } unsigned char ReadData(unsigned char address) { unsigned char data; DATA_OUT; OutData=0x00; //先将地址清零 _NOP(); OutData=address;//送地址 //以下程序严格按照数据手册上时序图编写,请对照数据手册看程序 RW_SetHigh; CS_SetHigh; DS_SetHigh; _NOP(); AS_SetHigh; CS_SetLow; _NOP(); AS_SetLow; _NOP(); DS_SetLow; _NOP(); DATA_IN; data=InData; _NOP(); DS_SetHigh; _NOP(); CS_SetHigh; _NOP(); AS_SetHigh; return(data); } void DS12C887_Init() { WriteData(0x0A,0x2F); //打开振荡器,开始计时 WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制 } void SetTime() { WriteData(0x0B,0xCE); //禁止更新 WriteData(DS12C887_Second,SetDS12C887Time.Second); WriteData(DS12C887_Minute,SetDS12C887Time.Minute); WriteData(DS12C887_Hour,SetDS12C887Time.Hour); WriteData(DS12C887_Week,SetDS12C887Time.Week); WriteData(DS12C887_Day,SetDS12C887Time.Day); WriteData(DS12C887_Month,SetDS12C887Time.Month); WriteData(DS12C887_Year,SetDS12C887Time.Year); WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制 } void SetAlarm() { WriteData(0x0B,0x96); //禁止更新 WriteData(DS12C887_SecondAlarm,Alarm.Second); WriteData(DS12C887_MinuteAlarm,Alarm.Minute); WriteData(DS12C887_HourAlarm,Alarm.Hour); WriteData(0x0B,0x16); //正常更新,使能更新中断,二进制码格式,24小时制 } void GetTime() { WriteData(0x0B,0xCE); //禁止更新 //ReadDS12C887Time.Second=ReadData(DS12C887_Second); ReadDS12C887Time.Minute=ReadData(DS12C887_Minute); ReadDS12C887Time.Hour=ReadData(DS12C887_Hour); //ReadDS12C887Time.Week=ReadData(DS12C887_Week); //ReadDS12C887Time.Day=ReadData(DS12C887_Day); //ReadDS12C887Time.Month=ReadData(DS12C887_Month); //ReadDS12C887Time.Year=ReadData(DS12C887_Year); WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制 } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
抱歉,之前发成压缩包了
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
3027个成员聚集在这个小组
加入小组2913 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3567 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2335 浏览 1 评论
4794 浏览 1 评论
2571 浏览 1 评论
1311浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3567浏览 2评论
2913浏览 1评论
1492浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:43 , Processed in 1.523771 second(s), Total 94, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号