㈠ 51单片机,c语言程序,指针小例子
code date[] 的声明中,最后一个数值 0xFF 后不应有分号。
㈡ 51单片机及其C语言程序开发实例的介绍
作者:戴仙金出版社:清华大学出版社本书首先简单介绍了51系列单片机的基础知识,然后从工程应用的角度出发,详细地介绍了51系列单片机常用的电路模块,主要包括键盘、LcD显示、A,D转换、D/A转换、I。c总线应用、语音、实时时钟、红外、usB、步进电机、数字锁相环、串口通信、DDs等,同时列举了4个典型的实际工程,包括语音存储与回放系统、数控直流恒流源、简易数字逻辑分析仪、智能电动小车等,目的在于使读者能够迅速地掌握51系列单片机的开发与实现。本书深入浅出,力求既能使单片机的初学者迅速入门,又能使中高级开发人员在原来的基础上进一步提高实际项目开发能力。
㈢ 谁能帮我写一下单片机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)/256;
TL0=(65536-10000)%256;
ET0=1;
EA=1;
while(1)
{
if(K1==0)
{
delay(10);
if(K1==0)
{
while(K1==0);
TR0=1;
cnt=0;
}
}
if(K2==0)
{
delay(10);
if(K2==0)
{
while(K2==0);
TR0=0;
LED=1;
}
}
}
}
㈣ 单片机用C语言编写中断的范例
#include
sbit
csb_sat=
p1^0;
//定义超声波发生脚
void
delay(void)
//延时25微秒,12t芯片用12m误差
0us
{
unsigned
char
a;
for(a=11;a>0;a--);
}
void
csb_fs(int
dat)
{while(dat--){csb_sat=1;delay();csb_sat=0;delay();}}
//发射
void
main()
{
ea=1;
while(1)
{
csb_fs(10);
delay();delay();delay();delay();delay();delay();delay();delay();delay();
ie=0x83;
//int0允许中断
while(ie);
p1_1=1;delay();p1_1=0;delay();p1_1=1;delay();p1_1=0;delay();p1_1=1;delay();p1_1=0;delay();
}
}
void
int0_chuankou(void)
interrupt
0
using
1
//外部int0中断子程序
{
ie=0;//禁止int0中断
}
㈤ 求 单片机简单的C语言程序例子(越多越好)
我前几天刚在网上看到的,不知道对你有没有用》
1. 闪烁灯
1. 实验任务
如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2. 电路原理图
图4.1.1
3. 系统板上硬件连线
把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4. 程序设计内容
(1). 延时程序的设计方法
作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:
如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒
机器周期 微秒
MOV R6,#20 2个机器周期 2
D1: MOV R7,#248 2个机器周期 2 2+2×248=498 20×
DJNZ R7,$ 2个机器周期 2×248 498
DJNZ R6,D1 2个机器周期 2×20=40 10002
因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:
DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET
(2). 输出控制
如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5. 程序框图
如图4.1.2所示
图4.1.2
6. 汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}
2. 模拟开关灯
1. 实验任务
如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
2. 电路原理图
图4.2.1
3. 系统板上硬件连线
(1). 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上;
(2). 把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;
4. 程序设计内容
(1). 开关状态的检测过程
单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。
(2). 输出控制
如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5. 程序框图
图4.2.2
6. 汇编源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND
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接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
2. 电路原理图
图4.3.1
3. 系统板上硬件连线
(1. 把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;
(2. 把“单片机系统”区域中的P1.4-P1.7用导线连接到“四路拨动开关”区域中的K1-K4端口上;
4. 程序设计内容
(1. 开关状态检测
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
(2. 输出控制
根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
5. 程序框图
读P1口数据到ACC中
ACC内容右移4次
ACC内容与F0H相或
ACC内容送入P1口
<![endif]-->
图4.3.2
6. 方法一(汇编源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORl A,#0F0HMOV P1,ASJMP STARTEND7. 方法一(C语言源程序)#include <AT89X51.H>unsigned char temp;void main(void){while(1){temp=P1>>4;temp=temp | 0xf0;P1=temp;}}8. 方法二(汇编源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9. 方法二(C语言源程序)#include <AT89X51.H>void main(void){while(1){if(P1_4==0){P1_0=0;}else{P1_0=1;}if(P1_5==0){P1_1=0;}else{P1_1=1;}if(P1_6==0){P1_2=0;}else{P1_2=1;}if(P1_7==0){P1_3=0;}else{P1_3=1;}}}
先给你,传不上 太多了
㈥ 单片机c语言编程100个实例
51单片机C语言编程实例 基础知识:51单片机编程基础 单片机的外部结构: 1. DIP40双列直插; 2. P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3. 电源VCC(PIN40)和地线GND(PIN20); 4. 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) 5. 内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍) 6. 程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序) 7. P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务) 1. 四个8位通用I/O端口,对应引脚P0、P1、P2和P3; 2. 两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3. 一个串行通信接口;(SCON,SBUF) 4. 一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。 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 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;} 在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P1.3 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCC 5. While( 1 ); //死循环,相当 LOOP: goto LOOP; 6. } 注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。 在某引脚输出低电平的编程方法:(比如P2.7引脚) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2.7 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P2_7 = 0; //给P2_7赋值0,引脚P2.7就能输出低电平GND 5. While( 1 ); //死循环,相当 LOOP: goto LOOP; 6. } 在某引脚输出方波编程方法:(比如P3.1引脚) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P3.1 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 5. { 6. P3_1 = 1; //给P3_1赋值1,引脚P3.1就能输出高电平VCC 7. P3_1 = 0; //给P3_1赋值0,引脚P3.1就能输出低电平GND 8. } //由于一直为真,所以不断输出高、低、高、低……,从而形成方波 9. } 将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) ) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P1_1 = 1; //初始化。P1.1作为输入,必须输出高电平 5. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 6. { 7. if( P1_1 == 1 ) //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC 8. { P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND 2 51单片机C语言编程实例 9. else //否则P1.1输入为低电平GND 10. //{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND 11. { P0_4 = 1; } //给P0_4赋值1,引脚P0.4就能输出高电平VCC 12. } //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平 13. } 将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) ) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P3 = 0xff; //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平 5. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 6. { //取反的方法是异或1,而不取反的方法则是异或0 7. P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出 8. } //由于一直为真,所以不断将P3取反输出到P2 9. } 注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。 第一节:单数码管按键显示 单片机最小系统的硬件原理接线图: 1. 接电源:VCC(PIN40)、GND(PIN20)。加接退耦电容0.1uF 2. 接晶体:X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用12MHz),还有辅助电容30pF 3. 接复位:RES(PIN9)。接上电复位电路,以及手动复位电路,分析复位工作原理 4. 接配置:EA(PIN31)。说明原因。 发光二极的控制:单片机I/O输出 将一发光二极管LED的正极(阳极)接P1.1,LED的负极(阴极)接地GND。只要P1.1输出高电平VCC,LED就正向导通(导通时LED上的压降大于1V),有电流流过LED,至发LED发亮。实际上由于P1.1高电平输出电阻为10K,起到输出限流的作用,所以流过LED的电流小于(5V-1V)/10K = 0.4mA。只要P1.1输出低电平GND,实际小于0.3V,LED就不能导通,结果LED不亮。 开关双键的输入:输入先输出高 一个按键KEY_ON接在P1.6与GND之间,另一个按键KEY_OFF接P1.7与GND之间,按KEY_ON后LED亮,按KEY_OFF后LED灭。同时按下LED半亮,LED保持后松开键的状态,即ON亮OFF灭。 代码 1. #include <at89x52.h> 2. #define LED P1^1 //用符号LED代替P1_1 3. #define KEY_ON P1^6 //用符号KEY_ON代替P1_6 4. #define KEY_OFF P1^7 //用符号KEY_OFF代替P1_7 5. void main( void ) //单片机复位后的执行入口,void表示空,无输入参数,无返回值 6. { 7. KEY_ON = 1; //作为输入,首先输出高,接下KEY_ON,P1.6则接地为0,否则输入为1 8. KEY_OFF = 1; //作为输入,首先输出高,接下KEY_OFF,P1.7则接地为0,否则输入为1 9. While( 1 ) //永远为真,所以永远循环执行如下括号内所有语句 10. { 11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1输出高,LED亮 12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1输出低,LED灭 13. } //松开键后,都不给LED赋值,所以LED保持最后按键状态。 14. //同时按下时,LED不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态 15. } 数码管的接法和驱动原理 一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。作为习惯,分别给8个发光二极管标上记号:a,b,c,d,e,f,g,h。对应8的顶上一画,按顺时针方向排,中间一画为g,小数点为h。 我们通常又将各二极与一个字节的8位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相应8个发光二极管正好与单片机一个端口Pn的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法为:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。 如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。 以单支共阴数码管为例,可将段极接到某端口Pn,共阴极接GND,则可编写出对应十六进制码的七段码表字节数据
㈦ 用C语言编写8051单片机程序
/********************************
/* MCU: AT89S52
/* MCU-crystal: 12M
/* Version: 01
/* Last Updata: 2009-2-21
/* Author:
/* Description:
/* 使用定时器0,定时中断2ms一次对数码管显示扫描;
/* 三个位管要以扫描方式显示,使用共阳管,计数速度为1S;
/* 段A-H接到P0.1....7,位选为 P1.0,1,2;
/* 流水也以计数方式从200到250在P2口显示,低电平有效;
/****************************************************/
#include <reg52.h>
unsigned char code num_disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};//共阳数字字形0到9
unsigned char code bit_sel[]={0xfb,0xfd,0xfe};//低电平有效数字个十百位选择
unsigned char buf[3]={0,0,2};//计算中的个十百位暂时存放处
unsigned char one,ten,second;//个十位变量和流水灯显示3秒的时间变量
unsigned char rate;//扫描速度,调整以适应显示效果
unsigned char stop=0, flag=1,flag1=0;//闪烁3秒的标志位,用于主函数对中断的关断参数传递
unsigned int t,tt;//2ms变量
unsigned char rate;//与变量t同步,辅助赋值变
/**********主函数**********/
main(void)
{
TMOD=0X01;
TH0=0xf8;//定时2ms
TL0=0x30;
ET0=1;
EA=1;
TR0=1;
while(1)
{ if(stop==1)//判断stop信号,为1后便关闭定时器
{ TR0=0;
ET0=0;
EA=0;
}
}
}
/*******************中断*******************/
void timer0() interrupt 1
{
TH0=0xf8;//重新赋值定时2ms
TL0=0x30;
if(flag==0)//定义用于判断计数是否到了250,若到了则不再计数,转向else执行流水灯闪烁任务
{
t++;
if(t==500)
{ t=0;
one++;
P2=200+ten*10+one; //在P2口的流水等,也是从200开始计数。
if(one==10)
{ one=0;
ten++;
if(ten==5)
{ flag=1;//转向执行闪烁任务
}
}
}
}
else//flag已经==1;转向else执行流水灯闪烁任务
{ tt++;
if(tt==500)
{ tt=0;
second++;
P2=~P2;//流水灯全部以1S速度闪烁
if(second==3)stop=1;//判断3秒时间到,关闭中断,停止闪烁,数码管熄灭
}
}
rate++;
P0=0XFF;//消隐
if(rate==3)rate=0;
P0=num_disp[buf[rate]];
P1=bit_sel[rate];
buf[0]=one;
buf[1]=ten;
//因为百位没有变,所以不用赋值
}
㈧ 大家帮忙找一些51单片机的基本C语言程序例子,最好带说明,谢啦
中断控制程序:
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED接口
//将计数器的二进制值用8个LED显示出来
uchar count;//计数器(存储中断次数)
void main(void)
{
count=0; //清零计数器
port_count=~count;//清零P2口
IT0=1; //INT0设为边沿触发方式�IT0=0则为电平触发方式
EX0=1; //开INT0中断
EA=1; //开系统中断
while(1); //等待中断处理
}
//INT0中断处理函数
void int0_interrupt() interrupt 0 //INT0中断号0
{
count++;
port_count=~count; //当达到255时,溢出,又从0开始
}
I/O控制程序:
#include <AT89X52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
uchar flag=0;//判断移动方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水灯左移到第八位又移回来 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水灯右移到第1位又移回来 ~0000 0001
}
if(flag==0)
{
port_state=port_state<<1;
flowlight=~port_state;
}
else
{
port_state=port_state>>1;
flowlight=~port_state;
}
}
串口通信程序:
主机程序:
#include <AT89X52.H>
#define NODE_ADDR 3 //目的节点地址
#define COUNT 10 //发送缓冲区buffer大小
typedef unsigned char uchar;
uchar buffer[COUNT]; //定义buffer
int pt; //设置指针
main()//////////////////////////////////////////发送程序
{
//buffer初始化
pt=0;
while(pt<COUNT)
{
buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33........
pt++;
}
////初始化串口和T1(波特率发生器)/////////PCON缺省为0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口为方式3, SM2=0,REN=0,主机不接收地址帧
TMOD=0X20; //20H=0010 0000B,置T1为方式2,TR1控制T1的开关,定时器方式
TH1=253;TL1=253; //方式2为自动重装///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //启动T1
ET1=0; //关T1中断 由于自动重装
ES=1; //开串口中断
EA=1; //开系统中断
pt=0;
///////////////发送地址帧
TB8=1; //地址帧标志
SBUF=NODE_ADDR; //发送目的节点地址
while(pt<COUNT); //等待发送完全部数据
while(1);//不执行任何操作
} //end main
/////发送完中断函数
void send()interrupt 4
{
TI=0; //清发送中断标志
if(pt<COUNT)
{
//发送一帧数据
TB8=0;//数据帧标志
SBUF=buffer[pt]; //启动发送
pt++;//指针指向下一单元
}
else
{
ES=0; //关串口中断
EA=0; //关系统中断
return; //若发送完则停止发送并返回
}
}
接收程序:
#include<reg52.h>
#define uchar unsigned char
#define NODE_ADDR 3 //本机节点地址
#define COUNT 10 //定义接收缓冲区buffer大小
uchar buffer[COUNT]; //定义buffer
int pt; //当前位置指针
void send_char_com(unsigned char ch); //向串口发送一个字符的函数声明
void delay(void);
main() ////////////////串行异步从机接收程序
{
PCON=0X00; //初始化串口和T1(波特率发生器)/////////PCON缺省为0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允许接收地址帧
TMOD=0X20; //20H=0010 0000B,置T1为方式2,TR1控制T1的开关,定时器方式
TH1=253;TL1=253; //方式2为自动重装///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //启动T1
ET1=0; //关T1中断 由于自动重装
ES=1; //开串口中断
EA=1; //开系统中断
pt=0;
while(pt<COUNT); //等待接收地址帧和全部数据帧
delay() ;
//接收完后返回数据
SCON=0XC0; //SCON=1100 0000B,置串口为方式3, SM2=0,REN=0,主机不接收地址帧
EA=0;
for(pt=0;pt<COUNT;pt++)
{
send_char_com(buffer[pt]);
}
while(1);
} //end main
///////////串口接收中断函数
void receive()interrupt 4 using 3
{
RI=0; //清除接收中断标志
if(RB8==1) //地址帧
{//若为本机地址,则置SM2=0,以便接收数据
if(SBUF==NODE_ADDR)
{
SM2=0;
}
}
/////RB8=0,数据帧
else if(RB8==0)
{buffer[pt]=SBUF; //数据帧送buffer
pt++;
if(pt>=COUNT)
SM2=1; //若接收完全部数据帧,则通信结束;置SM2=1,准备下一次通信
}
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
///////////////////////////////////////////////////////////////////////////////////
void delay(void)
{uchar i=100;
while(i--);
}
㈨ 用C语言编写单片机程序
#include
sbit
csb_SAT=
P1^0;
//定义超声波发生脚
void
delay(void)
//延时25微秒,12T芯片用12M误差
0us
{
unsigned
char
a;
for(a=11;a>0;a--);
}
void
csb_fs(int
dat)
{while(dat--){csb_SAT=1;delay();csb_SAT=0;delay();}}
//发射
void
main()
{
EA=1;
while(1)
{
csb_fs(10);
delay();delay();delay();delay();delay();delay();delay();delay();delay();
IE=0x83;
//INT0允许中断
while(IE);
P1_1=1;delay();P1_1=0;delay();P1_1=1;delay();P1_1=0;delay();P1_1=1;delay();P1_1=0;delay();
}
}
void
int0_chuankou(void)
interrupt
0
using
1
//外部INT0中断子程序
{
IE=0;//禁止INT0中断
}
㈩ 单片机用C语言编写中断的范例,顺便简述电路
#include <reg52.h> //包括一个52标准内核的头文件
sbit P10 = P1^0;
void main(void)// 主程序
{
IT0=1; //外中断跳变产生中断
EX0=1;
EA=1; //打开总中断
while(1) //主程序循环
{
;
}
}
//interrupt 0 代表0号中断,也就是外部中断0
int0() interrupt 0
{
P10=~P10; //在中断里取反P1.0,翻转LED灯状态
}
电路很简单,一LED加限流电阻,正极+5V,负极连P1.0。再用一按钮,一端接地,另一端接P3.2。