您需要 登录 才可以下载或查看,没有账号?注册
收藏0 举报
fang355 打赏了 5.00 元 2017-08-03 理由:期待进一步的解析! 谢谢
查看全部评分
datouyuan 打赏了 5.00 元 2017-08-03 理由:只要自己愿意多加思考,论坛上会有大把人愿意帮助你。
fang355 发表于 2017-8-3 11:10 分析的很透彻! 大师, 我这个问题出现这里, 可否帮解决或更改?
#include<reg52.h> #include<intrins.h> sbit SPK=P3^7; sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; unsigned char keystep=1,keydelay,frg,i; void DelayUs2x(unsigned char t); void DelayMs(unsigned char t); #define FOSC 12.0//11.0592 //晶振频率 #define MACHINE_NUM 12 //SH88F2051 STC_MCU 定时器1T/12T可选 #define M_NUM 12 //SH88F2051 STC_MCU 为1T,老51为12T #define TICKS_PER_SEC 100.0 //每秒100次,10mS一次 #define TICK_COUNT ( (unsigned int)(FOSC*1000000L/MACHINE_NUM/TICKS_PER_SEC) ) #define T_RELOAD_LO ( (unsigned char) ((0x10000-TICK_COUNT) & 0x00ff) ) #define T_RELOAD_HI ( (unsigned char) ((0x10000-TICK_COUNT) >> 8) ) bit b_frg_; unsigned char _frg_; void bj_on(void) { b_frg_=0; _frg_=0; // TR0=1; Init_Timer0(); } void bj_off(void) { TR0=0; } void Init_Timer1(void) { TMOD &= 0x0f; TMOD |= 0x10; TH1 = T_RELOAD_HI; ET1 = 1; TR1 = 1; // EA = 1; } void Timer1_isr(void)interrupt 3 //T1中断 约10mS执行一次 { TH1 = T_RELOAD_HI; if(TR0) { frg=_frg_; if(b_frg_) _frg_--; else _frg_++; if((_frg_>=245)&&(_frg_==0)) b_frg_=!b_frg_; } } void Init_Timer0(void) //初始函数 { TMOD=0x01; TH0=0xfe; TL0=frg; EA=1; ET0=1; TR0=1; } //void bj() // 报警子函数 //{ // Init_Timer0();// 必须的 // for(i=0;i<245;i++) // { // DelayMs(10); // frg=i; // } // for(i=245;i>0;i--) // { // DelayMs(10); // frg=i; // } // SPK=~SPK; //} main() //主函数 { TMOD=0x01; EA=1; ET0=1; //Init_Timer0(); Init_Timer1();//yuan for(; ;) //相当于while(1) { if(k3==0) //ok ! 实现了 开关的触发一次开 再触发一次停的功能 . { DelayMs(10); while(!k3);//松手按键弹起后 计数 { keystep++; if(keystep==2) keystep=0; } switch(keystep) { case 0: bj_on(); break; // case 1: bj_off(); break; // } } } } void DelayUs2x(unsigned char t) //延时函数 { while(--t); } void DelayMs(unsigned char t) { while(t--) { DelayUs2x(245); DelayUs2x(245); } } void Timer0_isr(void)interrupt 1 //TR0 中断发音函数 { TMOD=0x01; TH0=0xfe; TL0=frg; SPK=~SPK; }
if((_frg_>=245)||(_frg_==0)) b_frg_=!b_frg_;
datouyuan 发表于 2017-8-4 09:03 我4楼地板的代码中的“if((_frg_>=245)&&(_frg_==0)) b_frg_=!b_frg_;” 应改为
hanlie2345678 发表于 2017-8-3 15:54 大师你分享的这个很不错,建议你用MDT的单片机来写会方便很多!
datouyuan 发表于 2017-8-3 15:40 多用个定时器做10mS延时。 更专业的代码要充分利用这个公用定时器。比如按键扫描、数码管显示,长延时等 ...
fang355 发表于 2017-8-4 13:46 很好的 程序!非常感激你 细心的列出源程序! 触发开关很好地实现了我的要求, 能连续报警了 ...
fang355 发表于 2017-8-4 14:54 高人! 怎么在T1中断内 好像使用到T0的中断, 难道是T1调用T0 好像也不对吧!? T0优先 ...
datouyuan 发表于 2017-8-4 15:43 在中断函数中使用其它函数时要小心些。注意,我没有在中断中调用函数。 没听说在中断中控制别的中断,获 ...
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
等级类勋章
发帖类勋章
时间类勋章
6
48
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号