51单片机C语言编程

作者&投稿:林政 (若有异议请与网页底部的电邮联系)
51单片机 C语言编程~

首先要明确单片机的端口名称一般都是规定好了的(参考该单片机的datasheet);
其次,要给某个端口赋值(1或0),还是给端口组(8位单片机一个组八个脚)赋值,这就是按位操作还是按字节操作的问题。例如:单片机有PA口,PB口,其中PA口有PA0~PA7八个脚,拉高PA口(PA = 0XFF;),拉高PA0脚(PA &=0X01;或者PA0 = 1; )。当然有些单片机是通过读写IO口输入输出寄存器来实现的。
再者,RTX,TDX两个脚应该是通信的脚,与通用IO口为复用的脚,要怎么用,怎么发送数据、接收数据就涉及到通信协议了,不同通信方式,工作方式就不一样了,具体(参考该单片机的datasheet)。

建议先仔细阅读单片机的datasheet和该单片机的编程指南(如果有的话)

希望能解决你的疑问

正确的表达式应该是:P0=number[a[0]];
这应该是从P0口输出数码管显示的段码数组,而number[ i ]是个数组即为段码表,而a[ i ] 也是一个数组,是与数码管相对应的缓冲区,而a[0]是保存第一个数码管显示的数据,例如a[0]=2; 意思是第一个数码管要显示2,把2代入段码表为number[2]; 得到2的段码,从P0口输出,即可实现第一个数码管显示2了。

// 51单片机C语言编程,这个时钟+秒表可以参考一下。

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit qingling=P1^0;  //清零

sbit tiaofen=P1^1;  //调分

sbit tiaoshi=P1^2;  //调时

sbit sounder=P1^7;  //naozhong

uint a,b;

uchar hour,minu,sec,   //时钟

hour0,minu0,sec0,//秒表

hour1,minu1,sec1;

h1,h2,m1,m2,s1,s2,//显示位

k,s;//状态转换标志  

uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*****************函数声明***********************/

void keyscan();

void init();

void delay(uchar z);

void display(uchar,uchar,uchar);

void sounde();

/*****************主函数*************************/  

void main()

{

init();

while(1)

{      

while(TR1)

{

keyscan();  //扫描函数

while(s==1) //s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间(也是通过调时,调分函数);

{  //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响(一分钟后自动关闭,可手动关闭)。再次切换,s=0.

keyscan();   //s状态切换(0-》1-》2-》0)通过外部中断1实现。

display(hour1,minu1,sec1); //闹钟时刻显示

}

display(hour0,minu0,sec0);//时钟表显示   

while(k)  /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。0秒表关;1秒表从零计时;2秒表停,显示计时时间*/

{

display(hour,minu,sec); //秒表显示   

}      

}

}

}

/*****************初始化函数***********************/

void init()

{

a=0;

b=0;

k=0;

s=0;

hour0=0;

minu0=0;

sec0=0;

hour=0;

minu=0;

sec=0;

hour1=0;

minu1=0;

sec1=0;

TMOD=0x11;      //定时器0,1工作于方式1;赋初值

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

EX0=1;   //秒表中断

EX1=1;   //闹钟设定中断

ET0=1;

ET1=1;

IT0=1;    //边沿触发方式

IT1=1;

PX0=1;

PX1=1;

TR0=0;     //初始,秒表不工作

TR1=1;    //时钟一开始工作 

}

/*****************定时器0中断*************/

void timer0_int() interrupt 1 //秒表

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

a++;

if(a==2)

{

a=0;

sec++;

if(sec==100)

{

sec=0;  //毫秒级

minu++;

if(minu==60)

{

minu=0;   //秒

hour++;

if(hour==60)   //分

{

hour=0;

}

}

}

}

/*************外部中断0中断函数************/

void ex0_int() interrupt 0

{  

k++;

if(k==3)

k=0;

if(k==1)

{

TR0=~TR0;

if(TR0==1)

{     

hour=0;

minu=0;

sec=0;  

}

}

if(k==2)

{

TR0=~TR0;

}   

}

/*************外部中断1中断函数************/

void ex1_int() interrupt 2

{

s++;

if(s==3)

s=0;

}

/*************定时器1中断****************/

void timer1_int() interrupt 3   //控制时钟工作

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(s==2)

{

if(hour1==hour0 && minu0==minu1)

sounde();

}

b++;

if(b==20)

{

b=0;

sec0++;

if(sec0==60)

{  

sec0=0;

minu0++;

if(minu0==60)

{

minu0=0;

hour0++;

if(hour0==24)

hour0=0;                        

}

}

}

}

/*************键盘扫描****************/

void keyscan()

{

if(s==1)

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec1=0;

minu1=0;

hour1=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu1++;

if(minu1==60)

{

minu1=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour1++;

if(hour1==24)

{

hour1=0;

}

while(!tiaoshi);   

}

}

else      //调整时钟时间

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec0=0;

minu0=0;

hour0=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu0++;

if(minu0==60)

{

minu0=0;

}

while(!tiaofen);  

}

}

if(tiaoshi==0)

{

hour0++;

if(hour0==24)

{

hour0=0;

}

while(!tiaoshi);   

}

}

/*************显示函数****************/

void display(uchar hour,uchar minu,uchar sec)

{

h1=hour/10;

h2=hour%10;

m1=minu/10;

m2=minu%10;

s1=sec/10;

s2=sec%10;

P0=0xff;

P2=table[h1];

P0=select[7];

delay(5);

P0=0xff;

P2=table[h2];

P0=select[6];

delay(5);

P0=0xff;

P2=0x40;;

P0=select[5];

delay(5);

P0=0xff;

P2=table[m1];

P0=select[4];

delay(5);

P0=0xff;

P2=table[m2];

P0=select[3];

delay(5);

P0=0xff;

P2=0x40;

P0=select[2];

delay(5);

P0=0xff;

P2=table[s1];

P0=select[1];

delay(5);

P0=0xff;

P2=table[s2];

P0=select[0];

delay(5);

}

/*************闹钟函数****************/

void sounde()

{

sounder=~sounder; 

}

/*************延时函数****************/

void delay(uchar z)

{

int x,y;

for(x=z;x>0;x--)

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

}



brvrvrb behebhrv irvbhrorv jibbe jsbdbdj ndb.bfb jdbdjfjt jrnfbdfnx hsccevd kfnt;tgtn bhbjrbrb jenjbbvb dbdjtfbt djrbrbfbdy


单片机 用C语言怎么编程!
include <AT89X51.h> \/\/预处理命令 void main(void) \/\/主函数名 { \/\/这是第一种注释方式 unsigned int a; \/\/定义变量a 为int 类型 \/ 这是第二种注释方式 \/ do{ \/\/do while 组成循环 for (a=0; a<50000; a++); \/\/这是一个循环 P1_0 = 0; \/\/设P1.0 口为低电平,点亮LED...

单片机c语言编程100个实例
一个串行通信接口;(SCON,SBUF) 4. 一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。 C语言编程基础: 1. 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2. 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。

单片机C语言编程
include<reg51.h> define uint unsigned int sbit button1=P1^0;sbit button2=P1^1;sbit led1=P0^0;sbit led2=P0^1;sbit mc1=P2^0;sbit mc2=P2^1;uint d1=0,d2=0;uint jd1,jd2;void t0isr() interrupt 1 { led1=0;TR0=0;mc1=0;} void t1isr() interrupt 3 { led2=0;...

单片机C语言编程
\/*该程序流水灯有两种模式,顺序左移和顺序右移,独立开关控制*\/ include<reg52.h> include<intrins.h> define uchar unsigned char define uint unsigned int uchar tmp,flag;sbit key1=P3^4;sbit key2=P3^5;void delay(uint z);void led();void keyscan();void main(){ tmp=0xfe;P1=...

单片机C语言程序
它整个的功能就是一个延时,等待单片机处理完其它任务,这样写程序符合程序的规范化和可读性的要求,void是说明返回值是空的,即没有返回值,可以不写,LED=~LED;\/\/是取反,每次执行这条语句就会使其值取反,若上次是0,则执行后其值变为1,DelayMS(100);就是调用了上面的子函数,代表延时100MS ...

求 单片机简单的C语言程序例子(越多越好)
7. C语言源程序#include <AT89X51.H>sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; \/\/灯亮}else{L1=1; \/\/灯灭}}} 3. 多路开关状态指示 1. 实验任务 如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个...

求一个51单片机C语言程序编程
单片机甲、乙进行双机串行通信,甲机通过串口控制乙机LED闪烁(如下图所示,要求利用芯片MAX232),双方的晶振频率均为11.0592MHz(波特率为9600kb\/s)要求:甲机按开关K1一次,发送字符“A”给乙机,点亮灯D1与D2;按开关K1两次,发送字符“B”给乙机,点亮灯D3与D4;按开关K1三次,发送字符“C...

求一个单片机c语言编程,题目要求接8个二极管,要求左循环点亮
include<reg51.h> include<intrins.h> define uchar unsigned char define uint unsigned int void DelayMS(uint x){ uchari;while(x--){ for(i=0;i<120;i++);} } \/\/主程序 void main(){ P0=0xfe;while(1){ P0=_crol_(P0,1);\/\/P0的值向左循环移动 DelayMS(150);} } ...

谁能帮我写一下单片机C语言程序?
include<reg51.h> sbit LED=P1^0;sbit K1=P1^1;sbit K2=P1^2;void delay(int ms){ unsigned char i;while(ms--)for(i=0;i<120;i++);} void t0isr(void) interrupt 1 { TH0=(65536-10000)\/256;TL0=(65536-10000)%256;LED=~LED;} main(){ TMOD=0x01;TH0=(65536-10000)\/...

单片机c语言编程
用于 做流水灯 可以让一盏灯 一直从左边移到右边 我们用 当i=1的时候 来分析 temp=0xfe=(1111 1110)执行 a=temp<>7; b=0000 0001 p1=a|b; P1=1111 1101;所以 p1就丛 1111 1110 变化成了 1111 1101 这样等就左移了一位。

桃城区17668851470: 单片机C语言怎么编程`
仉种盐酸: 每一种单片机都有一套自己的C编译器,你可以直接用,也可以挂载到其他的编译环境中 比如 Wave6000 等 51系列的 推荐用keilV8 Microchip系列的推荐用HT-PICC 编译环境用MPLAB 然后编程代码部分你写好之后,编译,此时会生成一些文件,如*.hex ,*.bin …… 然后把.hex 文件 利用烧写器烧写到单片机里面 这样单片机就可以按照编译的程序执行了 单片机的种类不一样,程序代码也略有区别

桃城区17668851470: c语言编程c51单片机
仉种盐酸: #include <reg51.h>#define uchar unsigned char#define uint unsigned intmain(){ uint xdata *xp;//定义指向片外RAM的指针 uint data *p;//定义指向片内RAM的指针 uchar i;//定义循环变量 xp=0x100;//指向片外RAM的100H单元 p=0x30;//指向片内RAM的30H单元 for(i=0;i<10;i++){//循环10次 *p=*xp;//将片外RAM单元中的内容传送给片内RAM单元 xp++;//指向下一个片外RAM单元地址p++;//指向下一个片内RAM单元地址}}

桃城区17668851470: 51单片机用C语言
仉种盐酸: 如果你不急,我明天晚上可以帮你写一下,给你一点提示,OX02H.THO=(65536-400)\256.TLO=(65536-400)%256,

桃城区17668851470: 51单片机C语言编程
仉种盐酸: 代码如下: typedef union {unsigned int myvalue; struct{ unsigned myvalueL:8; unsigned myvalueH:8; }child;}_mytype;_mytype mytype; void main(){ mytype.myvalue = 0x1234;} 仿真如下:是你要的结果吧

桃城区17668851470: 求一80C51单片机的C程序 -
仉种盐酸: #include unsigned char flag,num,keyn;sbit KEY=P3^0;sbit LED1=P3^4;sbit LED2=P3^5void delay(unsigned int a){ unsigned int i,j; for(i=0;i<125;...

桃城区17668851470: 51单片机c语言编程是否用到指令系统 -
仉种盐酸: 单纯的c语言编程时用不到系统指令的,但是c和汇编的混合编程时用的到指令系统的,然后就是你要对系统的存储有深刻的认识比如块存储,存储结构等之类的,因为c会用到很多内存操作的,这样可以提高代码运行质量

桃城区17668851470: 单片机c语言编程 -
仉种盐酸: 看你的单片机型号了,51单片机要求读之前写1,但如果该端口一直就作为输入的话,只要你没有特意给它赋值0,它默认就是1,可直接读. AVR单片机就要配置有关寄存器

桃城区17668851470: AT89S51单片机c语言程序的编程基础 -
仉种盐酸: 1、 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110.2、 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位.3、 ++var表示对变量var先增一;var—表示对变量后减一.4、 x |= 0x0f;表示为 x = x | 0x0f;5、 TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位.6、 While( 1 ); 表示无限执行该语句,即死循环.语句后的分号表示空循环体,也就是{;}

桃城区17668851470: 单片机编程(C语言)
仉种盐酸: P2口是8位口吧, 十六进制FE是 1111 1110. P2=0XFE的意思就是把信号1111 1110(1为高电平,0为低电平)送到P2口.P2口外接LED 后LCD灯可以点亮.

桃城区17668851470: 51单片机串口通信c语言编程 -
仉种盐酸: 这只是个模板,参考一下/*----------------------------------------------- 名称:串口通信 网站:www.doflye.net 编写:shifang 日期:2009.5 修改:无 内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源 打开串口调试程序,将波特率设置为...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网