MCS-51单片机串行接口:实例解析流水灯控制

需积分: 13 0 下载量 54 浏览量 更新于2024-08-20 收藏 1.48MB PPT 举报
"实例方式控制流水灯循环点亮-单片机相关知识" 在单片机编程中,流水灯是一种常见的实验和示例项目,用于展示硬件控制和循环逻辑。本实例以单片机为例,通过C语言编写程序来实现方式0控制流水灯循环点亮。这种方式主要涉及到单片机的IO口操作、循环结构以及简单的延时函数。 单片机是微控制器的典型代表,它集成了CPU、存储器和外设接口等关键组件,可以独立完成特定的控制任务。在这个实例中,单片机被用来控制8个LED灯的循环点亮,这些LED通常连接到单片机的IO口上。 首先,`SCON`寄存器被设置为0x00,这意味着串行口被配置为工作在方式0。在MCS-51系列单片机中,串行接口有四种工作方式,方式0是最简单的8位UART(通用异步收发传输器)模式,用于实现串行通信。在此模式下,波特率是固定的,由系统时钟频率决定,且没有奇偶校验和数据帧格式控制。 然而,这个实例并未使用串行通信功能,而是利用了`SCON`寄存器的设置来初始化IO口。`while(1)`创建了一个无限循环,确保程序持续运行。`for(i=0;i<8;i++)`循环遍历数组`Tab`中的8个元素,`Send(Tab[i])`函数将数组中的数据发送到IO口,模拟控制LED灯的亮灭。`delay()`函数则是提供一个适当的延时,使得LED灯能够逐个点亮,形成流水效果。 串行通信是单片机中重要的数据传输方式,特别是在长距离通信和成本考虑时。串行通信分为异步通信和同步通信。异步通信是单片机应用中常见的形式,它以字符为单位,每个字符前有起始位,后有停止位,中间是数据位和可能的校验位。这种方式允许发送和接收端使用独立的时钟,只要能正确识别起始和停止位,就可以正确解码数据。 在异步通信中,数据帧包括起始位、数据位、奇偶校验位和停止位。起始位为逻辑"0",表示数据传输的开始;数据位是实际传输的信息,可以是5到8位;奇偶校验位用于检测传输错误,可选奇校验或偶校验;停止位是逻辑"1",表示数据传输的结束。这种帧结构确保了数据的正确传输,即使发送和接收时钟不同步也能正常工作。 总结来说,本实例通过单片机的IO口控制LED灯,展示了单片机基本的控制能力和循环逻辑。同时,通过提及串行通信,我们可以看到单片机在异步通信中的应用,虽然在这个例子中并未实际使用串行通信功能。这为我们理解单片机的工作原理和编程实践提供了基础。
2018-09-27 上传
1、一盏一盏:第一盏灯先亮--延时--熄灭--延时--下一盏灯; 2、利用数组方法点亮:定义一个数组(即0xfe,0xfd,0xfb,0xf7,0xef,oxdf,0xbf,0x7f:依次代表只有第一盏灯,第二盏灯....亮),再利总线,按顺序点亮八盏灯; 3、利用移位方法点亮:(1)、利用移位运算和按位或运算,依次点亮八盏灯; (2)、包含intrins头文件(里面含有移位函数),使用相应的左移或右移函数进行移位, 下面是代码和注释,详细解释了点亮流水灯的思路,附件含有源代码和仿真文件,有需要的可以下载 //方式0控制流水灯循环点亮 #include //包含51单片机寄存器定义的头文件 #include //包含函数_nop_()定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量 sbit P17=P1^7; /************************************************************** 函数功能:延时约150ms **************************************************************/ void delay(void) { unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; } /************************************************************** 函数功能:发送一个字节的数据 **************************************************************/ void Send(unsigned char dat) { P17=0; //P1.7引脚输出清0信号,对74LS164清0 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期,保证清0完成 P17=1; //结束对74LS164的清0 SBUF=dat; //将数据写入发送缓冲器,启动发送 while(TI==0) //若没有发送完毕,等待 ; TI=0; //发送完毕,TI被置“1”,需将其清0 } /******************************************* 函数功能:主函数 ******************************************/ void main(void) { unsigned char i; SCON=0x00; //SCON=0000 0000B,使串行口工作于方式0 while(1) { for(i=0;i<8;i++) { Send(Tab[i]); //发送数据 delay(); //延时 } } }