
if(a&(1<<(i-1))) RW_SID=1;
表示1左移i-1位再于a进行与运算,i=8的情况下i-1=7,1左移7位就是0x80。再跟a与运算(全1出1有0出0)即可获得a的最高位。以此类推可以取出a的所有位。
if(RW_SID==1) dat|=(1<<(i-1));
当RW_SID端口为1时把1左移i-1位跟dat或运算。i=8的情况下1左移i-1位正好是0x80,再经过与运算保存最高位,循环移位再或运算就能读取到全部位保存在dat里面
可以写成
//写部分
if(a&0x80)//取出a的最高位
RW_SID=1;//如果是1则输出1
else
RW_SID=0;//否则输出0
a<<=1;//a整体左移,让第7位补到最高位的位置,循环取出
E_CLK=1;
delay(100);
E_CLK=0;
delay(100);
//读部分
E_CLK=1;
delay(100);
dat<<=1;//接收1次数据后左移。第一次为0的情况影响数据
if(RW_SID)//当端口为高的时候
dat++;//dat+1相当于dat|=1 当端口为0的时候默认左移最低位是补零的,所以不用管
E_CLK=0;//循环8次后第一次接受到的数据就在最高位了
delay(100);
效果是一样的相对来说比较好理解
首先,你要用软件允许中断,即C语言中EA=1;//允许总中断ES=1;//允许串口中断汇编中可用SETBEA;允许总中断SETBES;允许串口中断当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。
当然,单片机发送完一帧数据,TI也会置1,同样会产生中断!一般我们在发送数据时要关中断,因为一般你不用在发送时不用处理数据;接收数据时要开中断,以便你在中断服务程序中将接收到的数据进行存储并处理。补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在数据缓冲器SBUF中,如果你之前有允许串行口中断,RI就会置1,向单片机CPU申请中断,并进入中断服务程序,即你问题中的serial()函数,做完这个函数后就会自动返回断点。
如果你没有允许中断,便不会产生串行中断。
其实,你的问题有个错误:别的中断都是某个I/O口电平变化产生。
这只是外部中断产生条件,不过,你之前也需要用软件允许外部中断。
另外,常见的51系列单片机有5个中断源三种中断5:
1、外部中断0和1;
2、定时器/计数器溢出中断0和1;
3、串行口中断。
另外,STC51系列还有定时器/计数器T2中断,A/D转换中断,PWM中断,串行中断2等等。你还有什么不懂的可以自己多翻一翻书,学到后面去了你就明白了。
你的问题中那个serial()函数中P1=SBUF;是把接收的数据送到并行P1口,然后那条RI=0;是不可少的,这是用软件清零RI,准备再次接受一帧数据产生中断,如果你没有这条语句,就会进入死循环,出不来了。有什么问题还可以Q我(1445090023),希望能给我评个最佳答案。
本SD卡读写系统中的接口电路采用的STCl2C5A60S2单片机控制,并通过软件编程实现SPI模式的数据传输(包括串行时钟、数据的输入和输出)。在SPI模式下。单片机与SD卡的连接主要有四根线(包括时钟线,两根数据传输线和一根片选线),
通常,SD卡有两种总线模式,即SD总线模式和SPI总线模式。其中SD总线模式采用四条数据线并行传输数据,数据传输速率高,但是传输协议复杂,只有少数单片机才提供有此接口,而用软件方法模拟SD总线又比较繁琐,会降低SD卡的数据传输速率;而SPI总线模式只有一条数据传输线。传输协议简单,易于实现,虽然数据传输速率较低,但绝大多数中高档单片机都提供有SPI总线,同时由于其易于用软件方法来模拟。因此,本设计采用SPI总线模式。
SPI总线技术是MOTOROIA公司推出的一种同步串行总线接口,是目前单片机应用系统中最常用的几种串行扩展接口之一。 SPI总线主要通过三根线进行数据传输,包括同步时钟线SCK、主机输入/从机输出数据线MISO、主机输出/从机输人数据线MOSI。另外,它还有一条低电平有效的从机片选线CS,片选信号以及同步时钟脉冲由主机提供。SPI总线模式的数据是以字节为单位进行传输的,主机与SD卡的各种通信都由主机控制。
软件设计
SD卡的初始化
SD卡从上电到对SD卡进行正确的读写 *** 作,往往都需要一个上电初始化的过程。SD卡上电后,主机必须先向SD卡发送74个时钟周期,以完成SD卡的上电过程。通常SD卡上电后会自动进入SD总线模式,并在SD总线模式下向SD卡发送复位命令(CMD0)。
SD卡的读写
SD卡的数据传输主要通过块读写来实现。块长度默认为512 KB。当RAM中已存放由模数转换模块传来的512 KB数据时,单片机便向SD卡写入此块数据。块读取时,可发送命令CMDl7,接收到的应答信号为0x00。这样就可以直接接收数据了,接收到的数据的第1个字节为数据令牌0xfe,后面的为接收到的数据,当输出口变为高电平时。表明读取 *** 作完成。
装数据读出以后,通过单片机处理,把结果在液晶上显示。
标准的一般都是这个程序
#include <reg52h>
#include <mathh>
#define lcd_data P1
sbit cs1=P2^3;
sbit cs2=P2^4;
sbit di=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
void delay(int t)
{
int i,j,k;
for(i=0;i<t;i++)
{ for(j=0;j<255;j++)
k++;}
}
void write_com_l(unsigned int command)
{
cs1=1;
rw=0;
di=0;
lcd_data=command;
e=1;
e=0;
cs1=0;
}
void write_data_l(unsigned int data0)
{
cs1=1;
rw=0;
di=1;
lcd_data=data0;
e=1;
e=0;
cs1=0;
}
void write_com_r(unsigned int command)
{
cs2=1;
rw=0;
di=0;
lcd_data=command;
e=1;
e=0;
cs2=0;
}
void write_data_r(unsigned int data0)
{
cs2=1;
rw=0;
di=1;
lcd_data=data0;
e=1;
e=0;
cs2=0;
}
void disp0()
{
unsigned int i,j;
for (i=0;i<8;i++)
{write_com_l(0xb8+i);
write_com_r(0xb8+i);
write_com_l(0x40);
write_com_r(0x40);
for (j=0;j<64;j++)
{write_data_l(0xaa);
write_data_r(0xaa);
}
}
}
void disp1()
{
unsigned int i,j;
for (i=0;i<8;i++)
{write_com_l(0xb8+i);
write_com_r(0xb8+i);
write_com_l(0x40);
write_com_r(0x40);
for (j=0;j<64;j++)
{write_data_l(0x55);
write_data_r(0x55);
}
}
}
void disp2()
{
unsigned int i,j;
for (i=0;i<8;i++)
{write_com_l(0xb8+i);
write_com_r(0xb8+i);
write_com_l(0x40);
write_com_r(0x40);
for (j=0;j<64;j++)
{write_data_l(0x0f);
write_data_r(0x0f);
}
}
}
void disp3()
{
unsigned int i,j;
for (i=0;i<8;i++)
{write_com_l(0xb8+i);
write_com_r(0xb8+i);
write_com_l(0x40);
write_com_r(0x40);
for (j=0;j<64;j++)
{write_data_l(0xf0);
write_data_r(0xf0);
}
}
}
void init_lcd() //初始化LCD清屏
{
write_com_l(0x3e);
write_com_r(0x3e);
write_com_l(0x3f);
write_com_r(0x3f);
write_com_l(0xc0);
write_com_r(0xc0);
write_com_l(0xb8);
write_com_r(0xb8);
write_com_l(0x40);
write_com_r(0x40);
for(;1;)
{
disp0();
delay(0x0ff);
disp1();
delay(0x0ff);
disp2();
delay(0x0ff);
disp3();
delay(0x0ff);
}
}
void main()
{
IE=0x81;
init_lcd();
}
void innt0 () interrupt 0
{
do {}while(1);
}
以上就是关于有个51单片机关于12864串口显示读写程序求助(c语言)全部的内容,包括:有个51单片机关于12864串口显示读写程序求助(c语言)、12864显示屏发送数据时要关中断、最近要做一个51单片机SD卡的读写用12864显示!哪位大神能说下原理,怎么才能把SD卡的东西显示到12864上!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)