完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
08年后有10多年没有使用过51单片机,后面陆陆续续用过PIC、AVR、LM3S、STM32就没有再使用过51单片机,51我们读书时的入门启蒙芯片,学的还是汇编,想到要用STC15还担心用不起来,但STC的烧写工具提供很例程,需要什么功能直接拷出来就行,还挻方便,只是51单片机调试实在麻烦,只能打印或都通过一个调试IO口查看程序的运行状态。
以下就是这个时序的定义,家电类的芯片,连串口都会觉得成本高,所以只能通过2个IO模拟通讯,看到实际的时序,还可以省一个IO,一个IO也可实现通讯 开始为低电平,然后是高电平,信号线空闲是高电平,就是只要测出2250us的信号是高还是低就可以知道数据 L 750uS H 2250uS 1 L 2250uS H 750uS 0 一组数据结束维持至少8mS高电平, 显示板下发给电源板为6个8位数据一组,0.5S发送一次 1、 开机,BIT7标志位为总开关,低成4位为档位值 2、 风扇转速, 值为42以上为全速 3、 功率校准值。0-50 此值记存在显示板芯片上。 4、 转盘继电器与发热管继电器, BIT0 BIT1 5、 以上4个数据总和低8位数值 6、 0x5A固定位 电源板上传给显示板为9个8位数据一组,接收正确数据就马上上传 1、 故障代码 2、 电压AD 3、 炉面AD 4、 IGBT AD 5、 电流AD 6、 脉冲数 7、 电压 8、 以上7个数总和低8位数值 9、 0X5a固定位 备注:通讯口线序:TX-RX-5V-GND 由于硬件已经不能再更改,不然使用捕捉功能是最省事,只能使用普通的IO加定时器方式 启动定时器发送完成后,再更改定时器周期使能快速读取接收IO状态 以下是完整的程序: sim_com.c #include “sim_com.h” #include “gpio.h” #include 《stdio.h》 #include “drvuart.h” #ifdef DEUBG #define SIM_COM_DEBUG //#define sim_com_debug vUartSenddata #else #endif #define SHORT_TIME 0xdfdf //位短半周期时间 #define LONG_TIME 0x9ecd //位长半周期时间 #define DET_PERIOD 0xfdd7 //接收检测周期时间 #define SIM_COM_SEND_PIN P01 //发送脚 #define SIM_COM_SEND_PORT 0 //发送脚端口 #define SIM_COM_RECV_PIN P00 //接收脚 #define SIM_COM_RECV_PORT 0 //接收脚端口 #define SIM_COM_TOTAL_SEND_BIT 48 //发送位数 #define SIM_COM_TOTAL_RECV_BIT 72 //接收位数 #define SIM_COM_TOTAL_SEND_BYTE 6 //发送缓冲字节数 #define SIM_COM_TOTAL_RECV_BYTE 9 //接收缓冲字节数 #define SIM_COM_HEADER 0x5a //u8 bit_value[SIM_COM_TOTAL_SEND_BIT]; u8 send_value[SIM_COM_TOTAL_SEND_BYTE]; u8 recv_value[SIM_COM_TOTAL_RECV_BYTE]; sim_com_state_t sim_com_state; u8 sim_com_checksum(u8 *ptr, u8 len) { u8 checksum=0,i; for( i=0; i《len; i++ ){ checksum += *ptr; ptr++; } return checksum; } void sim_com_isr() interrupt 1 using 2 { if( sim_com_state.recving==0 ){ if( sim_com_state.send_bit《SIM_COM_TOTAL_SEND_BIT ) SIM_COM_SEND_PIN = ~SIM_COM_SEND_PIN; //发送下半段高电平 if( sim_com_state.send_half ){ sim_com_state.send_half = 0; if( (send_value[sim_com_state.send_bit/8]&(0x80》》(sim_com_state.send_bit%8))) != 0 ){ T0_Load(LONG_TIME); } else{ T0_Load(SHORT_TIME); } sim_com_state.send_bit++; } else{ //发送下一位上半段低电平 if( sim_com_state.send_bit《SIM_COM_TOTAL_SEND_BIT ){ sim_com_state.send_half = 1; if( (send_value[sim_com_state.send_bit/8]&(0x80》》(sim_com_state.send_bit%8))) != 0 ){ T0_Load(SHORT_TIME); } else{ T0_Load(LONG_TIME); } } //48位发送完毕 else{ SIM_COM_SEND_PIN = 1; sim_com_state.recving = 1; T0_Load(DET_PERIOD); #ifdef SIM_COM_DEBUG P35 = 1; #endif } } } else{ static u8 low_flag=0,high_flag=0; static u8 low_cnt=0,high_cnt = 0; static u8 io; T0_Load(DET_PERIOD); if( SIM_COM_RECV_PIN==0 ){ low_cnt++; low_flag = 1; io = 0; } else{ high_cnt++; high_flag = 1; io = 1; } //低电平过后处于高电平边沿,计算低电平时间 if( low_flag==1 && SIM_COM_RECV_PIN==1 ){ low_flag = 0; if( low_cnt》35 && low_cnt《45 ){ recv_value[sim_com_state.recv_bit/8]《《=1; sim_com_state.recv_bit++; } low_cnt = 0; } //高电平过后处于低平电边沿,计算高电平时间 if( high_flag==1 && SIM_COM_RECV_PIN==0 ){ high_flag = 0; if( high_cnt》35 && high_cnt《45 ){ recv_value[sim_com_state.recv_bit/8]《《=1; recv_value[sim_com_state.recv_bit/8] |= 0x01; sim_com_state.recv_bit++; } high_cnt = 0; } if( high_cnt》150 ){ #ifdef SIM_COM_DEBUG P35 = 0; #endif Timer0_InterruptDisable(); Timer0_Stop(); high_cnt = 0; sim_com_state.recv_bit = 0; sim_com_state.recving = 0; sim_com_state.sending=0; sim_com_state.recv_comp = 1; } } } void sim_com_send_start(void) { sim_com_state.sending = 1; sim_com_state.send_bit = 0; sim_com_state.recving = 0; //发送第一位上半段低电平 SIM_COM_SEND_PIN = 0; sim_com_state.send_half = 1; if( (send_value[sim_com_state.send_bit/8]&(0x80》》(sim_com_state.send_bit%8))) != 0 ){ T0_Load(SHORT_TIME); } else{ T0_Load(LONG_TIME); } Timer0_Run(); Timer0_InterruptEnable(); } void sim_com_send(u8 *ptr,u8 len) { if( sim_com_state.sending==0 ) { memcpy(send_value,ptr,sizeof(sim_com_send_t)-2); send_value[4] = sim_com_checksum(ptr,len); send_value[5] = SIM_COM_HEADER; sim_com_send_start(); } else{ return; } } void sim_com_process_recv(void) { if( sim_com_state.recv_comp == 1 ){ sim_com_receive_t *recv_ptr = (sim_com_receive_t *)recv_value; sim_com_state.recv_comp = 0; if( recv_ptr-》fixed==SIM_COM_HEADER && (recv_ptr-》checksum == sim_com_checksum(recv_value,sizeof(sim_com_receive_t)-2)+6) ){ u8 i; for( i=0; i《sizeof(sim_com_receive_t); i++) vUartSenddata(recv_value[i]); } memset(recv_value,0,sizeof(sim_com_receive_t)); } } void sim_com_init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pin = SIM_COM_SEND_PIN; GPIO_InitStructure.Mode = GPIO_OUT_PP; GPIO_Inilize(SIM_COM_SEND_PORT, &GPIO_InitStructure); GPIO_InitStructure.Pin = SIM_COM_RECV_PIN; GPIO_InitStructure.Mode = GPIO_HighZ; GPIO_Inilize(SIM_COM_RECV_PORT, &GPIO_InitStructure); #ifdef SIM_COM_DEBUG GPIO_InitStructure.Pin = P35; GPIO_InitStructure.Mode = GPIO_OUT_PP; GPIO_Inilize(3, &GPIO_InitStructure); #endif Timer0_1T(); //定时器时钟1T模式 Timer0_AsTimer(); Timer0_16bit(); memset(&sim_com_state,0,sizeof(sim_com_state_t)); } sim_com.h #ifndef __SIM_COM_H__ #define __SIM_COM_H__ #include “cpu.h” typedef struct _sim_com_send{ struct{ u8 pos:4; u8 sw:4; }sw_pos; u8 speed; u8 power_cal; struct{ u8 turnplate:1; u8 heating_tube:1; u8 reserve:6; }relay; u8 checksum; u8 fixed; }sim_com_send_t; typedef struct _sim_com_receive{ u8 err_code; u8 vol_ad; u8 stove_ad; u8 igbt_ad; u8 cur_ad; u8 pluse; u8 vol; u8 checksum; u8 fixed; }sim_com_receive_t; typedef struct _sim_com_state{ u8 sending; //发送与接收过程中都置1,接收完成或超时清0 u8 send_bit; //发送位计数 u8 send_half; //发送一个位中的高电平半段 u8 recving; //接收中,发送完成后置1,接收完成或超时清0 u8 recv_bit; //接收位计数 u8 recv_comp; //接收数据完成,通知应用层处理 }sim_com_state_t; extern void sim_com_init(void); extern void sim_com_send(u8 *ptr,u8 len); extern void sim_com_process_recv(void); #endif 电源板返回的时序 程序还是很简洁的,对外接口只有初始化、发送、数据处理3个函数,而且发送接收都使用定时器的定时间隔处理,接收完成后通过标志位通讯应用程序处理,不会阻塞到应用的执行 |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
329浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 09:02 , Processed in 1.602970 second(s), Total 81, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号