当前位置

首页 > 综合知识 > 51单片机c语言怎么写

51单片机c语言怎么写

推荐人: 来源: 秒知社 阅读: 9.66K 次
1.求大神在keil上帮写51单片机C语言程序

//第一个实验:

51单片机c语言怎么写

//假设8个LED阴极指向单片机,D11连接P0.1,D12连接P0.2 。 D18连接P0.7

//假设K1按键在P2.3引脚

#include<reg51.h>

#include<intrins.h>

sbit k1=P2^3;//假设K1按键在P2.3引脚

void main()

{

P0=0xfe;

while(1)

{

if(k1==0)

{

while(k1==0);

P0=_crol_(P0,1);

}

}

}

//第二个实验:

//假设8个LED阴极指向单片机,D11连接P0.1,D12连接P0.2 。 D18连接P0.7

#include<reg51.h>

char led[]={0xfe,0xff,0xfd,0xff,0xfb,0xff,0xf7,0xff,0xef,0xff,0xdf,0xff,0xbf,0xff,0x7f,0xff};

void main()

{

char i=0;

char counter=0;

TMOD=0x01;//T0 工作方式1

TH0=(655356-50000)/256;//延时50ms

TL0=(655356-50000)%256;//延时50ms

TR0=1;//启动T0

while(1)

{

if(TF0==1)//查询

{

TH0=(655356-50000)/256;//重新延时50ms

TL0=(655356-50000)%256;//重新延时50ms

counter++;

if(counter==10)//延时0.5秒

{

counter=0;//重新开始新一轮0.5秒延时

i++;

if(i==16)

{

i=0;

}

P0=led[i];//点灯

}

}

}

}

2.51单片机用C语言编写

#include<reg51.h>

sbit a = P1^2; //定义单片机对蜂鸣器的输出端口

sbit key = P3^2; //定义单片机对按键的端口 S19

void delay_short() //短延时函数 大约100us 用于设置蜂鸣器的频率

{

unsigned int i;

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

}

void delay_long() //长延时函数 大约20ms 用于按键的软件消抖和2次声响之间的间隔

{

unsigned int j;

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

}

void work(unsigned time) //蜂鸣器使能函数,参数为需要发声的时间 参数越大响的时间越长 不能超过65535

{

unsigned int m = time;

unsigned int n = 0;

while(m)

{

a = ~a;

delay_short();

m--;

}

for(n=0;n<30;n++) //大约延时 1S左右

{

delay_long();

}

}

void main()

{

while(1)

{

if(key == 0) //软件消抖

{

delay_long();

if(key == 0)

{

work(2000);

work(2000);

work(2000);

work(500);

work(500);

work(500);

work(500);

work(500);

}

}

}

}

上面是实现要求的所有源程序,另外纠延时控制的是发声的频率,并不是发声的时间长短,发声的时间长短可以通过循环来实现,具体见源程序。另外单片机的I/O口的负载能力是不足以驱动蜂鸣器的,需要借助放大芯片,我用的是ULN20003 下面附上我的硬件连接图

图片不是很清楚 估计是SOSO的问题 然后就是把IN和单片机的P1^2口连起来就可以

有上面问题可以联系我 363396124 加的时候请说明来意

3.51单片机的优先级怎么用C语言怎么写

正常情况下,优先顺序为:

外部中断0

定时器0

外部中断1

定时器1

串口

定时器2

IP中的位控制中断优先级,分别为:

PX0:外部中断0

PT0:定时器0

PX1:外部中断1

PT1:定时器1

PS:串口

PT2:定时器2

当其为1时,该位对应的中断将设为高优先级。

中断响应是:同级中断比如IP各位都为0 或都为1时,同时到达时优先按如上顺序响应中断,当一个中断在执行时,其他中断只能排队等候。

当其中一位为1比如PS=1时,那么无论为0的任何中断在执行中都将被打断,优先响应高级中断。

因此,要保证需要的中断享有至高权限,将相应的控制位设为1就可以了,比如串口优先保证那么初始化时加入:

PS=1;就OK。

4.求写一个单片机(AT89C51)C语言程序

用C啊,我想想:

1、和硬件有点儿关系,这个你清楚么?

2、假设LED连接到P1口吧。第一个灯接到P1.0。阴极接IO,阳极接5V。

#include <reg51.h>

bit SecFlag;

unsigned char mS;

void Display(unsigned char num,unsigned char sec)

{

num%=8;

P1=~(1<<num);

while(sec--!=0)

{

TR0=1;

while(SecFlag==0);SecFlag=0;

TR0=0;

}

}

main()

{

unsigned char i;

TMOD=1;IE=0x82;

while(1)

{

Display( (i++)%8,1);

}

}

void ISRT0(void) interrupt 1

{

TH0=(-50000)>>8;TL0=-50000;

mS++;

if(mS>20){mS=0;SecFlag=1;}//12MHz, 50mS定时中断,1秒计时。

}

你很容易扩展出任意要求的闪烁流水灯啦。

Display(2,1);

Display(1,1);

Display(3,2);

Display(1,2);

……放到while里面就好了。祝你玩得开心。

5.单片机c语言

//下面三行分别将uchar、uint、ulong定义为 unsigned char、unsigned int和unsigned long 方便使用

#define uchar unsigned char //定义一下方便使用

#define uint unsigned int

#define ulong unsigned long

#include //包括一个52标准内核的头文件

sbit P10 = P1^0; //将P10定义单片机的P1.0口,控制的LED灯,

sbit K1= P3^2; //将K1定义为按键K1

uchar scale;//用于保存占空比的输出0的时间份额,总共10份

char code dx516[3] _at_ 0x003b;//这是为了仿真设置的

//模拟PWM输出控制灯的10个亮度级别

void main(void) // 主程序

{

uint n;

//下面几行是定时器的初始化,初始化的数据OxF3和0x98,数据是通过计算得到的,公式我忘了

RCAP2H =0xF3; //赋T2的预置值的高位,溢出1次是1/1200秒钟

RCAP2L =0x98;//赋T2的预置值的低位

TR2=1; //启动定时器

ET2=1; //打开定时器2中断

EA=1; //打开总中断

while(1) //程序循环

{ ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作

//for循环只是起个延时的作用

for(n=0;n

scale++;//就是说每次for循环延时结束后scale占空比增加一次,直到scale==10

if(scale==10)scale=0;

}

}

//1/1200秒定时器2中断 中断程序独立的,不管何时只要中断的条件到了就调用它,本程序的条件是 定时器T2的定时到了

timer2() interrupt 5

{

static uchar tt; //tt用来保存当前时间在一秒中的比例位置

TF2=0;

tt++;

if(tt==10) //每1/120秒整开始输出低电平

{

tt=0;

if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影

P10=0;

}

if(scale==tt) //按照当前占空比切换输出高电平

P10=1;

}

6.单片机C语言入门

1,首先要学习C语言基础,就相当于80%会单片机了,因为现在所有8/16/32位(51系列,MSP430系列,ARM系列)都是使用C语言。

2,听起来单片机比较陌生,不是因为不懂,而是不知道方法和流程。现简单说说,仅供参考;

3,看一下单片机功能:包换内部FLASH、RAM、TIMER、INT、ADC、USB、ISP/IAR等。

4,编译环境、编程软件KEIL。

5,打开开发板的例子程序,在KEIL编译,下载到板,看结果和说明是不是相符,达到这样效果时,心里肯定很激动,这时真正学会了单片机,成功了。

6,然后再学会看电路图,电路图其实很简单,就是一根线从一个地方连接到另一个地方,写代码时,只记住单片机是哪一个管脚,然后对它写代码即可。

总结:实验很重要,要多参与这样的项目开发,方能进步。

7.51单片机 c语言看门狗程序怎么写

看门狗在51单片机电路里的作用是防止程序 “跑飞”、“死机”后,系统不动作,而采取复位的办法“唤醒”系统。

89S51、89S52系列单片机自带有看门狗功能,片内数据区A6H寄存器具有看门狗功能,使用很简单:#include。sfr WDTRST = 0xA6;。

void main() { WDTRST=0x1E;;//初始化看门狗 WDTRST=0xE1;//初始化看门狗 for(;;) { WDTRST=0x1E;;//喂狗指令 WDTRST=0xE1;//喂狗指令 } } 可见,你只要在程序的大循环体内加一条喂狗指令就行。但这种看门狗功能有限,不是很可靠的,它依靠晶振工作,一旦晶振不起振,就无效了。

实践中多采用外部看门狗的方法,可以选用的芯片很多:MAX708、MAX813 、X25045。..具体编程就要看芯片的参考资料了。

例如:X25045是SPI总线的看门狗芯片,复位端和单片机复位端连接,SPI数据输入你可以选择合适的IO接口。WREN 0x06 设置写允许位 WRDI 0x04 复位写允许位 RDSR 0x05 读状态寄存器 WRSR 0x01 写状态寄存器 READ 0x03/0x0b 读操作时内部EEPROM页地址 WRITE 0x02/0x0a 写操作时内部EEPROM页地址 #include sbit CS= P2^7; sbit SO= P2^6; sbit SCK= P2^5; sbit SI= P2^4; #define WREN 0x06 // #define WRDI 0x04 // #define RDSR 0x05 // #define WRSR 0x01 // #define READ0 0x03 // #define READ1 0x0b // #define WRITE0 0x02 // #define WRITE1 0x0a // #define uchar unsigned char uchar ReadByte() //read a byte from device { bit bData; uchar ucLoop; uchar ucData; for(ucLoop=0;ucLoop<8;ucLoop++) { SCK=1; SCK=0; bData=SO; ucData<<=1; if(bData) { ucData|=0x01; } } return ucData; } void WriteByte(uchar ucData)//write a byte to device { uchar ucLoop; for(ucLoop=0;ucLoop<8;ucLoop++) { if((ucData&0x80)==0) //the MSB send first {SI=0;} else {SI=1;} SCK=0; SCK=1; ucData<<=1; } } uchar ReadReg() //read register { uchar ucData; CS=0; WriteByte(RDSR); ucData=ReadByte(); CS=1; return ucData; } uchar WriteReg(uchar ucData) //write register { uchar ucTemp; ucTemp=ReadReg(); if((ucTemp&0x01)==1) //the device is busy return 0; CS=0; WriteByte(WREN);//when write the WREN, the cs must have a high level CS=1; CS=0; WriteByte(WRSR); WriteByte(ucData); CS=1; return 1; } void WriteEpm(uchar cData,uchar cAddress,bit bRegion) /* 写入一个字节,cData为写入的数,cAddress为写入地址,bRegion为页 */ { while((ReadReg()&0x01)==1); //the device is busy CS=0; WriteByte(WREN); //when write the wren , the cs must have a high level CS=1; CS=0; if(bRegion==0) { WriteByte(WRITE0);} //write the page addr else {WriteByte(WRITE1);} WriteByte(cAddress); WriteByte(cData); SCK=0; // CS=1; } uchar ReadEpm(uchar cAddress,bit bRegion) /* 读入一个字节,cAddress为读入地址,bRegion为页 */ { uchar cData; while((ReadReg()&0x01)==1);//the device is busy CS=0; if(bRegion==0) {WriteByte(READ0); } else {WriteByte(READ1);} WriteByte(cAddress); cData=ReadByte(); CS=1; return cData; } main() { WriteReg(0x00);//set the watchdog time as 1.4s CS=1; CS=0; //reset the watchdog } 回复: xuzhimin9514 所有的89S系列都带狗,所有的80C系列都不带狗。

所以89S51 89S52都带狗,80C51、80C52都不带狗。

8.51单片机C语言编程

代码如下:

typedef union {

unsigned int myvalue;

struct{

unsigned myvalueL:8;

unsigned myvalueH:8;

}child;

}_mytype;

_mytype mytype;

void main()

{

mytype.myvalue = 0x1234;

}

仿真如下:

是你要的结果吧