C51单片机程序编写

C51单片机程序编写,第1张

#include <reg51h> // 包含51单片机寄存器定义的头文件

#include <intrinsh> //包含_nop_()函数定义的头文件

#define OP_READ 0xa1 // 器件地址以及读取 *** 作,0xa1即为1010 0001B

#define OP_WRITE 0xa0 // 器件地址以及写入 *** 作,0xa1即为1010 0000B

sbit SDA=P3^4; //将串行数据总线SDA位定义在为P34引脚

sbit SCL=P3^3; //将串行时钟总线SDA位定义在为P33引脚

/

函数功能:延时1ms

(3j+2)i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

/

void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/

函数功能:延时若干毫秒

入口参数:n

/

void delaynms(unsigned char n)

{

unsigned char i;

for(i=0;i<n;i++)

delay1ms();

}

/

函数功能:开始数据传送

/

void start()

// 开始位

{

SDA = 1; //SDA初始化为高电平“1”

SCL = 1; //开始数据传送时,要求SCL为高电平“1”

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

SDA = 0; //SDA的下降沿被认为是开始信号

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)

}

/

函数功能:结束数据传送

/

void stop()

// 停止位

{

SDA = 0; //SDA初始化为低电平“0” _n

SCL = 1; //结束数据传送时,要求SCL为高电平“1”

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

SDA = 1; //SDA的上升沿被认为是结束信号

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

SDA=0;

SCL=0;

}

/

函数功能:从AT24Cxx读取数据

出口参数:x

/

unsigned char ReadData()

// 从AT24Cxx移入数据到MCU

{

unsigned char i;

unsigned char x; //储存从AT24Cxx中读出的数据

for(i = 0; i < 8; i++)

{

SCL = 1; //SCL置为高电平

x<<=1; //将x中的各二进位向左移一位

x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中

SCL = 0; //在SCL的下降沿读出数据

}

return(x); //将读取的数据返回

}

/

函数功能:向AT24Cxx的当前地址写入数据

入口参数:y (储存待写入的数据)

/

//在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0

bit WriteCurrent(unsigned char y)

{

unsigned char i;

bit ack_bit; //储存应答位

for(i = 0; i < 8; i++) // 循环移入8个位

{

SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S

//因为传送时高位在前,低位在后

_nop_(); //等待一个机器周期

SCL = 1; //在SCL的上升沿将数据写入AT24Cxx

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

SCL = 0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲

y <<= 1; //将y中的各二进位向左移一位

}

SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,

//以让SDA线转由接收设备(AT24Cxx)控制

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

SCL = 1; //根据上述规定,SCL应为高电平

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

_nop_(); //等待一个机器周期

ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节

//若送高电平,表示没有接收到,传送异常

SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)

return ack_bit; // 返回AT24Cxx应答位

}

/

函数功能:向AT24Cxx中的指定地址写入数据

入口参数:add (储存指定的地址);dat(储存待写入的数据)

/

void WriteSet(unsigned char add, unsigned char dat)

// 在指定地址addr处写入数据WriteCurrent

{

start(); //开始数据传递

WriteCurrent(OP_WRITE); //选择要 *** 作的AT24Cxx芯片,并告知要对其写入数据

WriteCurrent(add); //写入指定地址

WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据

stop(); //停止数据传递

delaynms(4); //1个字节的写入周期为1ms, 最好延时1ms以上

}

/

函数功能:从AT24Cxx中的当前地址读取数据

出口参数:x (储存读出的数据)

/

unsigned char ReadCurrent()

{

unsigned char x;

start(); //开始数据传递

WriteCurrent(OP_READ); //选择要 *** 作的AT24Cxx芯片,并告知要读其数据

x=ReadData(); //将读取的数据存入x

stop(); //停止数据传递

return x; //返回读取的数据

}

/

函数功能:从AT24Cxx中的指定地址读取数据

入口参数:set_addr

出口参数:x

/

unsigned char ReadSet(unsigned char set_addr)

// 在指定地址读取

{

start(); //开始数据传递

WriteCurrent(OP_WRITE); //选择要 *** 作的AT24Cxx芯片,并告知要对其写入数据

WriteCurrent(set_addr); //写入指定地址

return(ReadCurrent()); //从指定地址读出数据并返回

}

/

函数功能:主函数

/

main(void)

{

SDA = 1; // SDA=1,SCL=1,使主从设备处于空闲状态

SCL = 1;

WriteSet(0x23,0x55); //在指定地址“0x36”中写入数据“0x0f”

P0=ReadSet(0x23); //从指定地址“0x36中读取数据并送P1口显示

}

记得给分哈

51单片机,数据块传送程序设计,汇编语言程序怎么写?

将 RAM 中 2000H~2FFFH 存储内容的

前一半复制到 3000H~37FFH 存储区和 3800H~3FFFH 存储区,

后一半复制到 4000H~47FFH 存储区和 4800H~ 4FFFH 存储区

----------------------------

RAM 中 2000H~2FFFH 的前一半是:2000H~27FFH,

送到:3000H~37FFH、4000H~47FFH。

MOV R0, #0

MOV R2, #20H

MOV R3, #30H

MOV R4, #40H

LOP1:

 MOV P2, R2

 MOVX A, @R0 ;A←(P2P0=2000H)

 MOV P2, R3

 MOVX @R0, A ;(P2P0=3000H)←A

 MOV P2, R4

 MOVX @R0, A ;(P2P0=4000H)←A

 DJNZ R0, LOP1

INC R2

INC R3

INC R4

CJNE R4, #48H, LOP1

SJMP $

----------------------------

后一半传送,与前一半雷同,改改初始地址即可。

点阵原理就是一个LED的两端都接IO,当正极为1,负极为0时点亮相应的LED。

下面是8×8的LED点阵程序,参考一下吧

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

uchar code TAB[]={

0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,

0x00,0x82,0xFE,0x82,0x80,0xC0,0x00,0x00,

0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0x00,

0x02,0x0E,0x72,0x80,0x70,0x0E,0x02,0x00,

0x00,0x82,0xFE,0x92,0xBA,0x82,0xC6,0x00,

0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00

};

/delay(uint t)

{

uint a,b;

for(a=0;a<t;a++)

for(b=0;b<110;b++);

} /

void main(void)

{

uint i,j,xx;

uchar bittemp=0x01;

while(1)

{

for(i=0;i<40;i++)

{

for(xx=0;xx<500;xx++)

{

bittemp=0x80;

for(j=0;j<8;j++)

{

P2=0x00; //消隐

P0= ~TAB[i+8-j];

P2 = bittemp;

bittemp >>= 1;

}

}

}

}

}

#include<reg51h>

#include "intrinsh"

#include "absacch"

#define uchar unsigned char

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff};//0-9

unsigned char disdat[4]="2018";

sbit key=P3^0;

void ext0() interrupt 0

{

key++;

key%=3;

}

void t1isr() interrupt 3 //显示

{

TH1=0xec;

TL1=0x78;

P0=0xff;

P2=0x01<<scanled;

P0=~ledtab[disdat[3]];

scanled++;

scanled%=4;

}

main()

{

TMOD=0x10;

TH1=0xec;

TL1=0x78;

TR1=1;

ET1=1;

EA=1;

while(1)

{

if(key==0)

{

disdat[]="0423";

while(key==0);

disdat[]="2018";

}

}

}

好像跟我做的这个东西一样

不过我的通信协议有4种,而却可以动态选择,

尤其是模拟的I2C协议和SPI,他可以和所有的标准I2C器件或SPI器件同在总线上, *** 作一样

串口是最简单的一种,

>

#include <reg52h>       // 51单片机头文件

#include <intrinsh>   // 循环移位指令需要的头文件

void delay_ms(unsigned int);   

unsigned char flag;

unsigned int fd;

void main(void)          // main 主函数

{

      

 while(1)      

 {

  flag=0xfe;      // 因为51单片机的灌电流能力强,假设你的0为亮,1为灭。

  for(fd = 0; fd < 5; fd++)     //led灯从右向左流动, 5个循环

  {

   P1=flag;     // P1 为你开发板连接跑马灯的端口

   delay_ms(300);    //延时300毫秒

   flag=_cror_(flag,1);         //左移1位,_cror_为循环左移指令

  }

  flag=0x03;

  for(fd = 0; fd < 5; fd++)     // 两个 led灯从右向左流动, 5个循环

  {

   P1=flag;     // P1 为你开发板连接跑马灯的端口

   delay_ms(300);    //延时300毫秒

   flag=_cror_(flag,1);         //左移1位,_cror_为循环左移指令

  }

 } 

}

void delayms(unsigned int ms)   //延时函数 参数ms  为毫秒数 

{

 unsigned int i,j;

 for(i = ms; i > 0; i--)        

  for(j = 110; j > 0; j--);

}

(头文件包含 #include <reg52h>,写个延时函数,也可以用中断作定时器,单片机控制led引脚,就ok了) //临时写的,如有问题,可以加我

以上就是关于C51单片机程序编写全部的内容,包括:C51单片机程序编写、51单片机,数据块传送程序设计,汇编语言程序怎么写、单片机C51 LED点阵显示驱动程序设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9297971.html

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

发表评论

登录后才能评论

评论列表(0条)

保存