经典单片机实用开发教程代码.docx
《经典单片机实用开发教程代码.docx》由会员分享,可在线阅读,更多相关《经典单片机实用开发教程代码.docx(20页珍藏版)》请在冰点文库上搜索。
经典单片机实用开发教程代码
//实例51-2:
定时器T0的模式2测量正脉冲宽度
#include//包含51单片机寄存器定义的头文件
sbitui=P3^2;//将ui位定义为P3.0(INT0)引脚,表示输入电压
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
TMOD=0x0a;//TMOD=00001010B,使用定时器T0的模式2,GATE置1
EA=1;//开总中断
ET0=0;//不使用定时器T0的中断
TR0=1;//启动T0
TH0=0;//计数器T0高8位赋初值
TL0=0;//计数器T0低8位赋初值
while
(1)//无限循环,不停地将TL0计数结果送P1口
{
while(ui==0)//INT0为低电平,T0不能启动
;
TL0=0;//INT0为高电平,启动T0计时,所以将TL0清0
while(ui==1)//在INT0高电平期间,等待,计时
;
P1=TL0;//将计时结果送P1口显示
}
}
//实例52:
用定时器T0控制输出高低宽度不同的矩形波
#include//包含51单片机寄存器定义的头文件
sbitu=P3^0;//将u位定义为P3.0,从该引脚输出矩形脉冲
unsignedcharCountor;//设置全局变量,储存负跳变累计数
/*************************************************
函数功能:
延时约30ms(3*100*100=30000μs=30ms)
*************************************************/
voiddelay30ms(void)
{
unsignedcharm,n;
for(m=0;m<100;m++)
for(n=0;n<100;n++)
;
}
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
unsignedchari;
EA=1;//开放总中断
EX0=1;//允许使用外中断
IT0=1;//选择负跳变来触发外中断
Countor=0;
for(i=0;i<100;i++)//输出100个负跳变
{
u=1;
delay30ms();
u=0;
delay30ms();
}
while
(1)
;//无限循环,防止程序跑飞
}
/**************************************************************
函数功能:
外中断T0的中断服务程序
**************************************************************/
voidint0(void)interrupt0using0//外中断0的中断编号为0
{
Countor++;
P1=Countor;
}
//实例53:
用外中断0的中断方式进行数据采集
#include//包含51单片机寄存器定义的头文件
sbitS=P3^2;//将S位定义为P3.2,
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
EA=1;//开放总中断
EX0=1;//允许使用外中断
IT0=1;//选择负跳变来触发外中断
P1=0xff;
while
(1)
;//无限循环,防止程序跑飞
}
/**************************************************************
函数功能:
外中断T0的中断服务程序
**************************************************************/
voidint0(void)interrupt0using0//外中断0的中断编号为0
{
P1=~P1;//每产生一次中断请求,P1取反一次。
}
//实例54-1:
输出负脉宽为200微秒的方波
#include//包含51单片机寄存器定义的头文件
sbitu=P1^4;//将u位定义为P1.4
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
TMOD=0x02;//TMOD=00000010B,使用定时器T0的模式2
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TH0=256-200;//定时器T0的高8位赋初值
TL0=256-200;//定时器T0的高8位赋初值
TR0=1;//启动定时器T0
while
(1)//无限循环,等待中断
;
}
/**************************************************************
函数功能:
定时器T0的中断服务程序
**************************************************************/
voidTime0(void)interrupt1using0//"interrupt"声明函数为中断服务函数
{
u=~u;//将P1.4引脚输出电平取反,产生方波
}
//实例54-2:
测量负脉冲宽度
#include//包含51单片机寄存器定义的头文件
sbitu=P3^2;//将u位定义为P3.2
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
TMOD=0x02;//TMOD=00000010B,使用定时器T0的模式2
EA=1;//开放总中断
EX0=1;//允许使用外中断
IT0=1;//选择负跳变来触发外中断
ET0=1;//允许定时器T0中断
TH0=0;//定时器T0赋初值0
TL0=0;//定时器T0赋初值0
TR0=0;//先关闭T0
while
(1)
;//无限循环,不停检测输入负脉冲宽度
}
/**************************************************************
函数功能:
外中断0的中断服务程序
**************************************************************/
voidint0(void)interrupt0using0//外中断0的中断编号为0
{
TR0=1;//外中断一到来,即启动T0计时
TL0=0;//从0开始计时
while(u==0)//低电平时,等待T0计时
;
P1=TL0;//将结果送P1口显示
TR0=0;//关闭T0
}
//实例55:
方式0控制流水灯循环点亮
#include//包含51单片机寄存器定义的头文件
#include//包含函数_nop_()定义的头文件
unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量
sbitP17=P1^7;
/**************************************************************
函数功能:
延时约150ms
**************************************************************/
voiddelay(void)
{
unsignedcharm,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
/**************************************************************
函数功能:
发送一个字节的数据
**************************************************************/
voidSend(unsignedchardat)
{
P17=0;//P1.7引脚输出清0信号,对74LS164清0
_nop_();//延时一个机器周期
_nop_();//延时一个机器周期,保证清0完成
P17=1;//结束对74LS164的清0
SBUF=dat;//将数据写入发送缓冲器,启动发送
while(TI==0)//若没有发送完毕,等待
;
TI=0;//发送完毕,TI被置“1”,需将其清0
}
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
unsignedchari;
SCON=0x00;//SCON=00000000B,使串行口工作于方式0
while
(1)
{
for(i=0;i<8;i++)
{
Send(Tab[i]);//发送数据
delay();//延时
}
}
}
//实例56-1:
数据发送程序
#include//包含单片机寄存器的头文件
unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//流水灯控制码,该数组被定义为全局变量
/*****************************************************
函数功能:
向PC发送一个字节数据
***************************************************/
voidSend(unsignedchardat)
{
SBUF=dat;
while(TI==0)
;
TI=0;
}
/**************************************************************
函数功能:
延时约150ms
**************************************************************/
voiddelay(void)
{
unsignedcharm,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
/*****************************************************
函数功能:
主函数
***************************************************/
voidmain(void)
{
unsignedchari;
TMOD=0x20;//TMOD=00100000B,定时器T1工作于方式2
SCON=0x40;//SCON=01000000B,串口工作方式1
PCON=0x00;//PCON=00000000B,波特率9600
TH1=0xfd;//根据规定给定时器T1赋初值
TL1=0xfd;//根据规定给定时器T1赋初值
TR1=1;//启动定时器T1
while
(1)
{
for(i=0;i<8;i++)//模拟检测数据
{
Send(Tab[i]);//发送数据i
delay();//50ms发送一次检测数据
}
}
}
//实例56-2:
数据接收程序
#include//包含单片机寄存器的头文件
/*****************************************************
函数功能:
接收一个字节数据
***************************************************/
unsignedcharReceive(void)
{
unsignedchardat;
while(RI==0)//只要接收中断标志位RI没有被置“1”
;//等待,直至接收完毕(RI=1)
RI=0;//为了接收下一帧数据,需将RI清0
dat=SBUF;//将接收缓冲器中的数据存于dat
returndat;
}
/*****************************************************
函数功能:
主函数
***************************************************/
voidmain(void)
{
TMOD=0x20;//定时器T1工作于方式2
SCON=0x50;//SCON=01010000B,串口工作方式1,允许接收(REN=1)
PCON=0x00;//PCON=00000000B,波特率9600
TH1=0xfd;//根据规定给定时器T1赋初值
TL1=0xfd;//根据规定给定时器T1赋初值
TR1=1;//启动定时器T1
REN=1;//允许接收
while
(1)
{
P1=Receive();//将接收到的数据送P1口显示
}
}
//实例57-1:
数据发送程序
#include//包含单片机寄存器的头文件
sbitp=PSW^0;
unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//流水灯控制码,该数组被定义为全局变量
/*****************************************************
函数功能:
向PC发送一个字节数据
***************************************************/
voidSend(unsignedchardat)
{
ACC=dat;
TB8=p;
SBUF=dat;
while(TI==0)
;
TI=0;
}
/**************************************************************
函数功能:
延时约150ms
**************************************************************/
voiddelay(void)
{
unsignedcharm,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
/*****************************************************
函数功能:
主函数
***************************************************/
voidmain(void)
{
unsignedchari;
TMOD=0x20;//TMOD=00100000B,定时器T1工作于方式2
SCON=0xc0;//SCON=11000000B,串口工作方式3,
//SM2置0,不使用多机通信,TB8置0
PCON=0x00;//PCON=00000000B,波特率9600
TH1=0xfd;//根据规定给定时器T1赋初值
TL1=0xfd;//根据规定给定时器T1赋初值
TR1=1;//启动定时器T1
while
(1)
{
for(i=0;i<8;i++)//模拟检测数据
{
Send(Tab[i]);//发送数据i
delay();//50ms发送一次检测数据
}
}
}
//实例57-2:
数据接收程序
#include//包含单片机寄存器的头文件
sbitp=PSW^0;
/*****************************************************
函数功能:
接收一个字节数据
***************************************************/
unsignedcharReceive(void)
{
unsignedchardat;
while(RI==0)//只要接收中断标志位RI没有被置"1"
;//等待,直至接收完毕(RI=1)
RI=0;//为了接收下一帧数据,需将RI清0
ACC=SBUF;//将接收缓冲器中的数据存于dat
if(RB8==p)
{
dat=ACC;
returndat;
}
}
/*****************************************************
函数功能:
主函数
***************************************************/
voidmain(void)
{
TMOD=0x20;//定时器T1工作于方式2
SCON=0xd0;//SCON=11010000B,串口工作方式1,允许接收(REN=1)
PCON=0x00;//PCON=00000000B,波特率9600
TH1=0xfd;//根据规定给定时器T1赋初值
TL1=0xfd;//根据规定给定时器T1赋初值
TR1=1;//启动定时器T1
REN=1;//允许接收
while
(1)
{
P1=Receive();//将接收到的数据送P1口显示
}
}
//实例58:
单片机向PC发送数据
#include//包含单片机寄存器的头文件
unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//流水灯控制码,该数组被定义为全局变量
/*****************************************************
函数功能:
向PC发送一个字节数据
***************************************************/
voidSend(unsignedchardat)
{
SBUF=dat;
while(TI==0)
;
TI=0;
}
/**************************************************************
函数功能:
延时约150ms
**************************************************************/
voiddelay(void)
{
unsignedcharm,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
/*****************************************************
函数功能:
主函数
***************************************************/
voidmain(void)
{
unsignedchari;
TMOD=0x20;//TMOD=00100000B,定时器T1工作于方式2
SCON=0x40;//SCON=01000000B,串口工作方式1
PCON=0x00;//PCON=00000000B,波特率9600
TH1=0xfd;//根据规定给定时器T1赋初值
TL1=0xfd;//根据规定给定时器T1赋初值
TR1=1;//启动定时器T1
while
(1)
{
for(i=0;i<8;i++)//模拟检测数据
{
Send(Tab[i]);//发送数据i
delay();//150ms发送一次数据
}
}
}
//实例59:
单片机接收PC发出的数据
#include//包含单片机寄存器的头文件
/*****************************************************
函数功能:
接收一个字节数据
***************************************************/
unsignedcharReceive(void)
{
unsignedchardat;
while(RI==0)//只要接收中断标志位RI没有被置“1”
;//等待,直至接收完毕(RI=1)
RI=0;//为了接收下一帧数据,需将RI清0
dat=SBUF;//将接收缓冲器中的数据存于dat
returndat;
}
/*****************************************************
函数功能:
主函数
***************************************************/
voidmain(void)
{
TMOD=0x20;//定时器T1工作于方式2
SCON=