有个51单片机关于12864串口显示读写程序求助(c语言)

有个51单片机关于12864串口显示读写程序求助(c语言),第1张

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上!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10210686.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存