table[num++] = SBUF; 这个语句是不是要放在循环中,只接收一个字符吗? |
51大神 发表于 2016-3-30 17:17 生成了 ![]() |
123go 发表于 2016-3-30 15:47 有没有生成hex文件, |
需要设置好端口和波特率。 |
程序能仿真应该没什么问题 你可能是板子上的端口没对应 |
要想传输正确,需要具备的就是端口,波特率,字节数,校验位等。 |
老凯哥 发表于 2016-3-30 15:35 端口有没有设置对 |
老凯哥 发表于 2016-3-30 15:34 单片机为什么没反应,其他的单片机可以用 |
#include<reg52.h> #define uint unsigned int #define uchar unsigned char #define LCD_DB P0 uchar dat0[]={" gaoyankai "}; uchar dat1[]={" 20132815859 "}; uchar table[6]; uchar sedtab[11]={"20132815859"}; uchar flag; //显示标志位 uint num; sbit LCD_RS=P2^0; //端口可根据需要更改,以下同 sbit LCD_RW=P2^1; sbit LCD_E=P2^2; //********US延时函数************ void delay_n40us(uint n) { uint i; uchar j; for(i=n;i>0;i--) for(j=0;j<2;j++); } //********MS延时函数************ void delay(uint ms) { uchar i; while(ms--) for(i=0;i<123;i++); } //********写指令函数************ void LCD_write_command(uchar com) { LCD_DB=com; LCD_RS=0;//指令 LCD_RW=0;//写入 LCD_E=1;//允许 LCD_E=0; delay_n40us(1); } //********写数据函数************* void LCD_write_data(uchar dat) { LCD_DB=dat; LCD_RS=1;//数据 LCD_RW=0;//写入 LCD_E=1;//允许 LCD_E=0; delay_n40us(2); } //*******显示一个字符函数********* void LCD_disp_char(uchar x,uchar y,uchar dat) { uchar address; if(y==1) address=0x80|x; else address=0xc0|x; LCD_write_command(address); LCD_write_data(dat); } void LCD_init() { LCD_write_command(0x38);//设置 8位格式,2行,5x7 LCD_write_command(0x0c);//整体显示,关光标,不闪烁 LCD_write_command(0x06);//设定输入方式,增量不移位 LCD_write_command(0x01);//清除屏幕显示 delay_n40us(100);// 2ms } //在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s //串口接收中断允许,发送中断禁止 void Uart_Init() //串口初始化函数 { SCON=0x50; //串口方式1 ,允许接收 TMOD=0x20; //T1工作于方式2 PCON=0x00; //波特率不倍增 TL1=0xfd; //波特率9600 TH1=0xfd; //波特率设置 EA=1; //开总中断 ES=1; //开串口接收中断 TR1 = 1; //定时器开启 } void PutStr(uchar *pstr,uchar len) //字符发送函数 { uchar i; for(i=0;i<len;i++) { SBUF=*pstr; pstr++; while(TI==0); TI=0; } } //********主函数************ void main() { uchar i,j,k; Uart_Init(); //串口初始化 while(1) { if(flag==0) //液晶不显示 { } else { LCD_init(); //液晶初始化 for(j=0;j<40;j++) { LCD_write_command(0x1c); //设置全屏左移 for(i=0;i<16;i++) { LCD_disp_char(i+16,1,dat0[i]); //写入数据 LCD_disp_char(i+16,2,dat1[i]); } delay(100); //延时 } for(k=0;k<6;k++) //清空接收数组 { table[k]='0'; } flag=0; //标志位 num=0; } } } void Com() interrupt 4 //串口接受中断处理函数 { if(RI==0) return; //如果没有接收中断标志,返回 ES=0; //关闭串口中断 RI=0; //清串行中断标志位 table[num++] = SBUF; //接收缓冲器中的字符 if(table[0]==0xB8 && table[1]==0xDF && table[2]==0xD1 && table[3]==0xE5 && table[4]==0xBF && table[5]==0xAD) //读取初始状态 { flag=1; //显示 PutStr(sedtab,11); //发送学号 } else { flag=0; //不显示 } ES=1; //开启串口中断 } |