完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789 #define uchar unsigned char uchar ch; void delay1ms(x) //0.5ms { int y,z; for(y=x;y>0;y--) for(z=60;z>0;z--); } void init_uart() { TMOD=0X20; //定时器/计算器工作模式寄存器 TH1=0XFD; //timer high 1 TL1=0XFD; //timer low 1 TR1=1; //定时器T1的运行控制位 SCON=0X50; //串行控制寄存器 EA=1; //CPU的总中断允许控制位 ES=1; //串行口中断允许位 } void main() { init_uart(); while(1) { P3=ch; P2=digtal1[8]; delay1ms(1000); } } void UART_interrupt() interrupt 4 { if(RI) { RI=0; //接收中断请求标志位 ch=SBUF; } } |
|
相关推荐
22个回答
|
|
用串口助手可以正确收发数据,LED显示也正常,可能是你的显示程序有问题。
#include #define uchar unsigned char unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789 uchar ch; uchar flag; //接收完成标志, /* void delay1ms(x) //0.5ms { int y,z; for(y=x;y>0;y--) for(z=60;z>0;z--); } */ void init_uart() { TMOD=0X20; //定时器/计算器工作模式寄存器 TH1=0XFD; //timer high 1 TL1=0XFD; //timer low 1 TR1=1; //定时器T1的运行控制位 SCON=0X50; //串行控制寄存器 EA=1; //CPU的总中断允许控制位 ES=1; //串行口中断允许位 } void main() { init_uart(); while(1) { if(flag==1) //接收完成标志为1 { ES=0; //关串口中断 flag=0; //接收完成标志清0 SBUF=ch; //发送数据 while(!TI); //等待发送中断请求标志位为1 TI=0; //发送中断请求标志位清0 ES=1; //开串口中断 } P1=~ch; //LED显示收到的数据 // P2=digtal1[8]; // delay1ms(1000); } } void UART_interrupt() interrupt 4 { RI=0; //接收中断请求标志位 ch=SBUF; //获取SBUF接收到的数据 flag=1; //接收完成标志置1 }
最佳答案
评分 |
|
|
|
虽然不懂,也要来帮顶顶。哈哈
|
|
|
|
期待大神们来解决
|
|
|
|
wulinwl 发表于 2017-6-27 13:51 大神呀,我搞了一天,被你一下就搞定了,谢谢,真心谢谢!!!!! |
|
|
|
wulinwl 发表于 2017-6-27 13:51 大神呀,我搞了一天,被你一下就搞定了,谢谢,真心谢谢!!!!! |
|
|
|
wulinwl 发表于 2017-6-27 13:51 大神,请问为什么这里P3=~ch;要取反呢 |
|
|
|
wulinwl 发表于 2017-6-27 13:51 大神,请问为什么这里P3=~ch;要取反呢 |
|
|
|
wulinwl 发表于 2017-6-27 13:51 大神,请问为什么这里P3=~ch;要取反呢 |
|
|
|
wulinwl 发表于 2017-6-27 13:51 大神,请问为什么这里P3=~ch;要取反呢 |
|
|
|
wulinwl 发表于 2017-6-27 13:51 大神,请问为什么这里P3=~ch;要取反呢 |
|
|
|
|
|
|
|
原来如此,另外我还想问一下为什么非要那个接收完成标志呢? |
|
|
|
|
|
|
|
这是演示程序,因为是把接收到的数据返还给上位机(PC),以判断串口收发是否正确,所以必须等接收完成后才能转发。 |
|
|
|
|
|
|
|
串口收发分文本模式和HEX模式,文本模式发送a8返回的还是a8。HEX模式发送a8返回的是A8,发送a返回的是0A,发送8返回的是08,就是16进制表示的8位2进制数据。 |
|
|
|
能不能再帮我看一下,最后五行红色部分,串口送过来的数据放在p3就可以,放到p2就不可以了,这怎么解决。
void delay1ms(x) //0.5ms { int y,z; for(y=x;y>0;y--) for(z=60;z>0;z--); }void init_uart() { TMOD=0x20; //定时器/计算器工作模式寄存器 TH1=0xFD; //timer high 1 TL1=0xFD; //timer low 1 TR1=1; //定时器T1的运行控制位 SCON=0x50; //串行控制寄存器 EA=1; //CPU的总中断允许控制位 ES=1; //串行口中断允许位 } void UART_R() interrupt 4 { RI=0; Serial_digtal[ch++]=SBUF; if(ch==N) //获取SBUF接收到的数据 flag=1; } void main() { init_uart(); while(1) { if(flag==1) //接收完成标志为1 { ES=0; //关串口中断 for(ch=0;ch SBUF=Serial_digtal[ch]; //发送数据 while(!TI); //等待发送中断请求标志位为1 TI=0; } //发送中断请求标志位清0 ES=1; //开串口中断 ch=0; flag=0; //接收完成标志清0 } // P2=~Serial_digtal[0]; // P3=digtalW[2]; P3=~Serial_digtal[0]; P2=digtal1[6]; delay1ms(10); } } |
|
|
|
虽然不懂,也要来帮顶顶
|
|
|
|
试着莣记 发表于 2017-6-28 17:19 #include #define uchar unsigned char #define uint unsigned int //unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789 ***it dula=P2^6; //段锁存 ***it wela=P2^7; //位锁存 uchar code table[]={ //共阴数码管 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar swan,wan,qian,bai,shi,ge; uchar ch; uchar flag; //接收完成标志, uchar count=0; //计数变量 void display1();//显示程序声明 void init_uart() { TMOD=0X20; //定时器/计算器工作模式寄存器 TH1=0XFD; //timer high 1 TL1=0XFD; //timer low 1 TR1=1; //定时器T1的运行控制位 SCON=0X50; //串行控制寄存器 EA=1; //CPU的总中断允许控制位 ES=1; //串行口中断允许位 } void main() { init_uart(); while(1) { if(flag==1) //接收完成标志为1 { ES=0; //关串口中断 flag=0; //接收完成标志清0 SBUF=ch; //发送数据 while(!TI); //等待发送中断请求标志位为1 TI=0; //发送中断请求标志位清0 ES=1; //开串口中断 } P1=~ch; //P1接8位LED显示收到的数据 /*************数据分解***************/ swan = ch/100000; // 十万位 wan = (ch%100000)/10000; // 万位 qian = (ch%10000)/1000; // 千位 bai = (ch%1000)/100; // 百位 shi = (ch%100)/10; // 十位 ge = ch%10; // 个位 display1(); //6位数码管显示程序 } } void UART_interrupt() interrupt 4 { RI=0; //接收中断请求标志位 ch=SBUF; //获取SBUF接收到的数据 flag=1; //接收完成标志置1 } void display1()//显示程序 { count++; if(count>=6) count=0; switch(count) { case 0: dula=0; P0=table[swan]; //显示十万位 dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; break; case 1: dula=0; P0=table[wan]; //显示万位 dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; break; case 2: P0=table[qian]; //显示千位 dula=1; dula=0; P0=0x7b; wela=1; wela=0; break; case 3: P0=table[bai]; //显示百位 dula=1; dula=0; P0=0x77; wela=1; wela=0; break; case 4: P0=table[shi]; //显示十位 dula=1; dula=0; P0=0xef; wela=1; wela=0; break; case 5: P0=table[ge]; //显示个位 dula=1; dula=0; P0=0xdf; wela=1; wela=0; break; } } |
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
1924 浏览 1 评论
2988 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2183 浏览 2 评论
2559 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
3683 浏览 5 评论
644浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
2779浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-19 17:51 , Processed in 0.824810 second(s), Total 98, Slave 84 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号