单片机c51程序.docx
- 文档编号:9754783
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:29
- 大小:64.69KB
单片机c51程序.docx
《单片机c51程序.docx》由会员分享,可在线阅读,更多相关《单片机c51程序.docx(29页珍藏版)》请在冰豆网上搜索。
单片机c51程序
单片机接收计算机送出的数据
//实例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=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口显示
}
}
单片机向计算机发送数据
//实例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发送一次数据
}
}
}
基于方式1的单工通信
Receive
//实例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口显示
}
}
Send
//实例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发送一次检测数据
}
}
}
基于方式3的单工通信
//实例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口显示
}
}
Send
//实例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发送一次检测数据
}
}
}
将方式0用于扩展并行输出控制流水灯
//实例55:
方式0控制流水灯循环点亮
#include
#include
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();//延时
}
}
}
AD转换实验
//实例94:
基于ADC0832的数字电压表
#include
#include
sbitCS=P3^4;//将CS位定义为P3.4引脚
sbitCLK=P1^0;//将CLK位定义为P1.0引脚
sbitDIO=P1^1;//将DIO位定义为P1.1引脚
//////////////////////////////////////////////////////////////////
unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字
unsignedcharcodeStr[]={"Volt="};//说明显示的是电压
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelaynms(unsignedcharn)
{
unsignedchari;
for(i=0;i delay1ms(); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ bitBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0;//将E恢复低电平 returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 指定字符显示的实际地址 入口参数: x ***************************************************/ voidWriteAddress(unsignedcharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 入口参数: y(为字符常量) ***************************************************/ voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 c51 程序