四路定时控制器设计心得体会

本文分享了作者在实训中的经验,强调了在程序设计和硬件电路设计中注意细节的重要性,如正确计算参数、电路仿真、软件调试步骤和技巧,以及如何解决实际问题,如定时器编程中的闪烁显示优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过这次实训 我发现在现实设计中还需要注意很多的细节 包括程序设计
和硬件设计都要我们小心仔细 一个地方出错就可能会整个系统失效。
在硬件设计时,我们得注意 方面: ,我们在设计电路时一定要事先把相
关的参数计算正确,否则焊出来的电路毛病百出; 如果有条件一定要进行仿真
模拟,这样可以对自己设计的电路有一定的监测作用; 最后在焊接电路时一定
先进行模拟排布,达到美观实用可靠。
在软件调试过程中我们需要注意四方面,就拿我们这个定时器电路来说吧,
,先整体把握,先把主要的重要的程序段写出来,先进行调试,调试成功后,
在进行下一步操作,切不可一下子把程序全部写完,在调试监测; ,写程序时
最好按功能分段进行处理,一方面美观,有条理,另一方面也方便我们进行调试
和修改; ,关于定时器程序,一方面我们必须把计数初值计算正确,另一方面
得把程序的逻辑时间很清楚, ,对于按键监测,我们最好加上消抖程序,谨防
按键操作时,出现混乱情况;
在写调整时间程序时,当按选择键择选要调整时还是秒或分时,看不出是要
调整那一位为了方便用户看出现在是在调整那一位,就必须使调整位闪烁,但显
示的时候已经用动态显示,如果直接改显示时间,就会使所有的位都闪烁,这样
根本就不能实现,后面经过和同学讨论,我使不调的位显示 到 次再显示调整
位 次,这样做最后就可以实现了,而且这样做还可以改变闪烁速度。在软件设
计时,还遇到了许多问题,毕竟想像和现实还是有很大的区别的 然而到了最后
这些问题都一一被解决了,我也在这次实训中学会了很多东西,总结出自已的一
套解决问题的方法,这让我觉得自已有了很大的收获,为今后的学习和工作打下
了坚定的基础。
在ClassWizard中响应ID为~Dlg中的WM_TIMER消息。 使用SetTimer(nIDEvent,time,NULL)来建立一个定时器,关闭定时器用KillTimer(nIDEvent)函数。 然后可以响应ON_WM_TIMER消息来响应一个定时器完成一次记时后的程序。 响应方式如下: void CTimeDlg::OnTimer(UINT nIDEvent) { if(nIDEvent==1000)//间隔为5秒 { //处理事件 } elseif(nIDEvent==1001)//间隔为10秒 { //处理事件 } CDialog::OnTimer(nIDEvent); } 以下是给出一个串口通信定时检查接收数据的部分代码 void CMyDlg::OnOpenCom() { // TODO: Add your control notification handler code here if( f_open_com==true ) { f_open_com = false; GetDlgItem(IDC_OPEN_COM)->SetWindowText("打开通信端口"); CloseHandle(hComm); KillTimer(1000); /// 关闭定时器 return ; } SetTimer(1000, 1000, NULL); ///nIDEvent==1000,time=5000ms const char *ComNo; DCB dcb; string temp("COM1"); ComNo = temp.c_str(); hComm = CreateFile( ComNo , GENERIC_READ|GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , 0 , 0); if( hComm==INVALID_HANDLE_VALUE ) /// 如果端口未打开 { MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK); return ; } /// 将dcb地址传入,以取得通信参数 GetCommState(hComm,&dcb); /// 得知目前通信状态 dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; /// 字节为8 dcb.Parity = NOPARITY; /// Parity为None dcb.StopBits = ONESTOPBIT; /// 1个停止位 if( !SetCommState( hComm , &dcb)){ MessageBox("通信端口设置出错!" , "Set Error" , MB_OK ); CloseHandle(hComm); return; } GetDlgItem(IDC_OPEN_COM)->SetWindowText("关闭通信端口"); f_open_com = true; } void CMyDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default char inbuff[1024]; DWORD nBytesRead , dwError; COMSTAT cs; /// 取得状态 ClearCommError( hComm , &dwError , &cs); /// 数据是否大于所准备的缓冲区 if( cs.cbInQue > sizeof(inbuff) ) { PurgeComm(hComm , PURGE_RXCLEAR ); /// 清除通信端口数据 return ; } ReadFile(hComm , inbuff , cs.cbInQue , &nBytesRead , NULL ); //接收通信端口的数据 inbuff[cs.cbInQue] = '\0'; MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK); m_Receive.Format("%s",inbuff); UpdateData(false); CDialog::OnTimer(nIDEvent); } 李杨: for(int i=0; ;i++ ) { ... Sleep(5); if(i>...) {AfxMessageBox("错误XXX"); return;} }//跳出后记得停止一些机器动作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a66889999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值