单片机c51程序Word下载.docx
《单片机c51程序Word下载.docx》由会员分享,可在线阅读,更多相关《单片机c51程序Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
主函数
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发送数据
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++)
unsignedchari;
//TMOD=00100000B,定时器T1工作于方式2
SCON=0x40;
//SCON=01000000B,串口工作方式1
for(i=0;
i<
8;
i++)//模拟检测数据
Send(Tab[i]);
//发送数据i
delay();
//150ms发送一次数据
}
}
基于方式1的单工通信
Receive
//实例56-2:
数据接收程序
Send
//实例56-1:
数据发送程序
//50ms发送一次检测数据
基于方式3的单工通信
//实例57-2:
sbitp=PSW^0;
while(RI==0)//只要接收中断标志位RI没有被置"
1"
ACC=SBUF;
if(RB8==p)
dat=ACC;
SCON=0xd0;
//SCON=11010000B,串口工作方式1,允许接收(REN=1)
//实例57-1:
ACC=dat;
TB8=p;
SCON=0xc0;
//SCON=11000000B,串口工作方式3,
//SM2置0,不使用多机通信,TB8置0
将方式0用于扩展并行输出控制流水灯
//实例55:
方式0控制流水灯循环点亮
//包含51单片机寄存器定义的头文件
intrins.h>
//包含函数_nop_()定义的头文件
unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
sbitP17=P1^7;
发送一个字节的数据
P17=0;
//P1.7引脚输出清0信号,对74LS164清0
_nop_();
//延时一个机器周期
//延时一个机器周期,保证清0完成
P17=1;
//结束对74LS164的清0
//将数据写入发送缓冲器,启动发送
while(TI==0)//若没有发送完毕,等待
//发送完毕,TI被置“1”,需将其清0
/*******************************************
******************************************/
SCON=0x00;
//SCON=00000000B,使串行口工作于方式0
while
(1)
i++)
Send(Tab[i]);
//发送数据
delay();
//延时
AD转换实验
//实例94:
基于ADC0832的数字电压表
//包含_nop_()函数定义的头文件
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;
10;
for(j=0;
j<
33;
j++)
延时若干毫秒
入口参数:
n
voiddelaynms(unsignedcharn)
n;
delay1ms();
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;
result=0,不忙
bitBusyTest(void)
bitresult;
RS=0;
//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;
//E=1,才允许读写
//空操作
//空操作四个机器周期,给硬件反应时间
result=BF;
//将忙碌标志电平赋给result
E=0;
//将E恢复低电平
returnresult;
将模式设置指令或显示地址写入液晶模块
dictate
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);
//如果忙就等待
//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"
0"
//空操作两个机器周期,给硬件反应时间
P0=dictate;
//将数据送入P0口,即写入指令或地址
//空操作四个机器周期,给硬件反应时间
//E置高电平
//当E由高电平跳变成低电平时,液晶模块开始执行命令
指定字符显示的实际地址
x
voidWriteAddress(unsignedcharx)
WriteInstruction(x|0x80);
//显示位置的确定方法规定为"
80H+地址码x"
将数据(字符的标准ASCII码)写入液晶模块
y(为字符常量)
voidWriteData(unsignedchary)
RS=1;
//RS为高电平,RW为低电平时,可以写入数据
P0=y;
//将数据送入P0口,即将数据写入液晶模块
_nop_();
对LCD的显示模式进行初始化设置
voidLcdInitiate(void)
delaynms(15);
//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x3