高分求单片机高手帮写一段简单的C51程序

高分求单片机高手帮写一段简单的C51程序,第1张

你试试看

#include <reg52h>

#define uint unsigned int

#define uchar unsigned char

uchar Receive_Buffer[6];

uchar Buf_Index = 0;

uchar Time_cnt=0;

uchar DRV_OUT=0;

sbit val_out=P1^0;

uchar code DSY_CODE[]=

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00

};

sbit d1=P3^3;

sbit d2=P3^4;

sbit d3=P3^5;

sbit d4=P3^6;

sbit d5=P3^7;

void Delay(uint x)

{

uchar i;

while(x--)

{

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

}

}

void Init_UART_TIMER(void)

{

  TMOD = 0x21;

  SCON = 0x50;

  TH1 = 0xFD;

  TL1 = TH1;

TH0=0x4C;

TL0=0x00;

ET0=1;

TR0=1;

    PCON = 0x00;

  ES = 1;

TR1 = 1;

  EA = 1;

}

void display(void)

{

uchar i;

// Receive_Buffer[0]=i;

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

{

 P0=0x00;

 switch(i)

 {

  case 0:

   d1=0;d2=1;d3=1;d4=1;d5=1;break;

  case 1:

   d1=1;d2=0;d3=1;d4=1;d5=1;break;

  case 2:

   d1=1;d2=1;d3=0;d4=1;d5=1;break;

  case 3:

   d1=1;d2=1;d3=1;d4=0;d5=1;break;

  case 4:

   d1=1;d2=1;d3=1;d4=1;d5=0;break;

  default:

   break;

 }

 if(i==2)

     P0 = DSY_CODE[Receive_Buffer[i]]|0x80;

 else

  P0 = DSY_CODE[Receive_Buffer[i]];

 Delay(5);

}

}

void check_val()

{

if((Receive_Buffer[1]==3) &&(Receive_Buffer[2]<=5))   val_out = 1;

else  if ((Receive_Buffer[1]==3) &&(Receive_Buffer[2]>=8)) val_out = 0;

}

void main()

{

P0 = 0x00;

Init_UART_TIMER();

while(1)

{

display();

  check_val();

}}

void Serial_INT() interrupt 4

{

uchar c;

if(RI)

{

ES = 0;

RI = 0;

c  = SBUF;

if(c>='0' && c<='9')

{

  Receive_Buffer[Buf_Index]=c-'0';

 Buf_Index++;

 if (Buf_Index == 5)

  Buf_Index=0;

}

ES = 1;

}

}

void Timer0Interrupt(void) interrupt 1

{

  uchar s = ("#140\r");

uchar i = 0;

TH0=0x4C;

TL0=0x00;

Time_cnt++;

if(Time_cnt == 10)

{

while(s[i]!='\0')

{

  SBUF = s[i];

 while(TI == 0);

 TI = 0;

 i++;

}

Time_cnt=0;

}

}

void EX_INT0() interrupt 0

{

uchar s = ("#140\r");

uchar i = 0;

while(s[i]!='\0')

{

 SBUF = s[i];

while(TI == 0);

TI = 0;

i++;

}

}

C51开发流程:

第一:必须对C51单片机内部外设和内部寄存器了解,因为写程序需要控制单片机内部寄存器,再去控制外设。

第二:设计单片机的硬件,单片机IO控制你的硬件

第三:画出流程图执行大概的框架

下面就是按照你的流程图去设计程序。

如果不是“天祥”的板子,这程序是不行的。

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

如果是“天祥”的,那么可以试试下面的显示程序,我增加了两行消隐的语句,经过实验,可以正常显示“按一下键,数字递增”的效果。

void

display(a,

b)

{

num

=

t;

a

=

num

/

10;

b

=

num

%

10;

dula

=

1;

p0

=

table[a];

dula

=

0;

wela

=

1;

p0

=

0xfe;

wela

=

0;

delay(10);

wela

=

1;

p0

=

0xff;

wela

=

0;

//关闭显示

dula

=

1;

p0

=

table[b];

dula

=

0;

wela

=

1;

p0

=

0xfd;

wela

=

0;

delay(10);

wela

=

1;

p0

=

0xff;

wela

=

0;

//关闭显示

}

C51些单片机程序插入汇编指令的方法如下:

1、以#pragma asm开始,以#pragma endasm结束,

用pragma asm和#pragma endasm这两个伪指令将汇编代码包起来。

比如:

2、但是如果直接这样嵌入汇编代码的时候,编译时会报错,错误代码是:

'asm/endasm' requires src-control to be active

解决办法是:在工程中,按如图所示 *** 作。

3、如果勾选椭圆圈中的两项,这样就可以了。

#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口显示

}

记得给分哈

以上就是关于高分求单片机高手帮写一段简单的C51程序全部的内容,包括:高分求单片机高手帮写一段简单的C51程序、简述c51程序开发流程、C51单片机递增程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存