本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
主机MEGA16L,代码如下
多机通讯与普通的USART通讯差不多,只不过注意几点:
1,需在复位时将UCSRA寄存器中的MPCM位置1
2,上位机发送地址数据时将第九位置1,这样一来,所有的从机都能通过中断接收到此数据啦各个从机判断接收到的数据是否与自己的地址相符,不符的返回,符合的(只能有1台符合)将MPCM位置0,以便正常的接收发给自己的数据.这些数据的第九位必须为0.其他的从机不会对这些数据产生中断.从而实现多机通讯.
上位机发送 UCSRB |= (1<<TXB8);及第九位数据是1的时候,从机能够能够产生中断,如果第九位0,则从机将数据忽略。如果你发的数据帧:
地址+数据1+数据2+...
你可以在从机接收到地址数据后,与本机的地址比较,如果相同。说明是发给本机的指令,你可以在中断中将本设置普通的数据模式,用以接收后面的数据。
上面的MEGA16程序是完整的程序,能够在ICCAVR上运行通过的。
下位机是MEGA8
- void uart0_init_mulmodel(void)
- {
- UCSRB = 0x00; //disable while setting baud rate
- UCSRA = 0x01; //mul. processor
- UCSRC = BIT(URSEL) | 0x06;
- UBRRL = 0x19; //set baud rate lo
- UBRRH = 0x00; //set baud rate hi
- UCSRB = 0x94; //9 bit data
- }
- void uart0_init_normodel(void)
- {
- UCSRB = 0x00; //disable while setting baud rate
- UCSRA = 0x00; //normal model
- UCSRC = BIT(URSEL) | 0x06;
- UBRRL = 0x19; //set baud rate lo
- UBRRH = 0x00; //set baud rate hi
- UCSRB = 0x94; //9 bit data
- }
- #pragma interrupt_handler uart0_rx_isr:12
- void uart0_rx_isr(void)
- {
- //uart has received a character in UDR
- rrr[rr] = UDR;
- rr++;
- receivetask();
- }
- //数据接收处理函数
- void R_KeLi(void)
- {
- kelitimer = 0;
- switch(rr){
- case 1:
- if(rrr[0] == addr){//判断地址是否与本机地址相等
- uart0_init_normodel();//如果相等,将本设置位普通模式来接收后面的数据,如果没有这句,后面的数据(第九位为0)将被忽略
- }
- else{
- rr = 0;
- }
- break;
- }
- }
复制代码 |