完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用atmega88单片机,用中断的方式接收PC发送过来的数据再while(1)中判断,接收到特定字符之后再发送一个数据,但是总是发送的数据是错误的。具体如图所示: #include /********************************* 功能:UART初始化 *********************************/ #define RS485_TX (PORTC|=BIT(PC3)) #define RS485_RX (PORTC&=BIT(PC3)) #define CS_ON (PORTC|=BIT(PC0)) #define CS_OFF (PORTC&=~BIT(PC0)) #define SID_ON (PORTC|=BIT(PC1)) #define SID_OFF (PORTC&=~BIT(PC1)) #define CLK_ON (PORTC|=BIT(PC2)) #define CLK_OFF (PORTC&=~BIT(PC2)) unsigned char rx_data; /******************************* 功能:Nms延时函数 ********************************/ void delay (unsigned int i) { int x=0,y=0; for (x=0;x for (y=0;y<1140;y++); } /******************************* 功能:IO口初始化 ********************************/ void init_io (void) { DDRB=0XEF; //MISO为输入其余的为输出 DDRC=BIT(PC0)|BIT(PC1)|BIT(PC2)|BIT(PC3)|~BIT(PC4)|~BIT(PC5);//0,1,2 口配置为输出为12864的控制端口,3为输出为RS485通信协议的控制端,5口为SCL输出 PORTC=0X03; DDRD=BIT(PD1); } /******************************* 功能:传送一个字节的数据 ********************************/ void Writebyte_12864 (unsigned char data) { unsigned char i; CS_OFF; delay(1); CS_ON; for (i=0;i<8;i++) { CLK_OFF; if (data&0x80) SID_ON; else SID_OFF; data<<=1; CLK_ON; CLK_OFF; } } /******************************* 功能:位12864写入命令 ********************************/ void WriteCom_12864 (unsigned char com) { CS_ON; delay(1); Writebyte_12864(0xF8); Writebyte_12864(com&0xF0); Writebyte_12864((com<<4)&0xF0); CS_OFF; } /******************************* 功能:12864写入命令 ********************************/ void WriteData_12864 (unsigned char data) { CS_ON; delay(1); Writebyte_12864(0xFA); Writebyte_12864(data&0xF0); Writebyte_12864((data<<4)&0xF0); CS_OFF; } /******************************* 功能:配置12864 ********************************/ void LCD_12864_config (void) { WriteCom_12864 (0x30); delay (1); WriteCom_12864 (0x06); delay (1); WriteCom_12864 (0x0C); delay (1); } /******************************* 功能:显示8位长度的数字,以及定点小数输出 ********************************/ void display_diangding (long i,unsigned char n) { long a[8]; unsigned char j; a[0]=i/10000000; a[1]=i%10000000/1000000; a[2]=i%1000000/100000; a[3]=i%100000/10000; a[4]=i%10000/1000; a[5]=i%1000/100; a[6]=i%100/10; a[7]=i%10; WriteCom_12864 (0x91); for (j=0;j<8-n;j++) { WriteData_12864(0x30+a[j]); delay(1); } WriteData_12864 (0x20+14); for (;j<8;j++) { WriteData_12864(0x30+a[j]); delay(1); } } /******************************* 功能:显示2位16进制的数字 ********************************/ void display16_2 (unsigned char i,unsigned char weizhi) { unsigned char shi,ge; shi=i/16; ge=i%16; WriteCom_12864 (weizhi); if (shi<10) { WriteData_12864(0x30+shi); } else { WriteData_12864(0x40+shi-9); } if (ge<10) { WriteData_12864(0x30+ge); } else { WriteData_12864(0x40+ge-9); } } /********************************* 功能:UART初始化函数 *********************************/ void uart_init(void) { UCSR0A=0x00; UCSR0B=0x00; UCSR0C=0x00; UBRR0H=0; UBRR0L=51; //UCSR0B=(1< /********************************* 功能:UART发送函数 *********************************/ void uart_tx (unsigned char data) { RS485_TX; while ((!(UCSR0A & (1< } void main () { init_io (); LCD_12864_config (); CLI(); uart_init(); SEI(); while (1) { display_diangding (66666666,0); if (rx_data==0x11) { display_diangding (999999,0); delay (2000); uart_tx (0x45); rx_data=0; //UCSR0B=(1< } } /*************************** 串口中断服务子程序 ***************************/ #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC void uart0_rx_isr(void) { rx_data=UDR0; display_diangding (77777777,0); delay (2000); /*uart_tx (33); if (rx_data==0x11) { display_diangding (999999,0); delay (2000); } else { display_diangding (52135,0); delay (2000); }*/ } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5122 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7767 浏览 0 评论
3026 浏览 2 评论
3103 浏览 1 评论
10053 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 05:33 , Processed in 0.536479 second(s), Total 57, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号