基于51单片机的波特率自动识别系统程序
80C51系列单片机波特率自动检测的通用程序
![80C51系列单片机波特率自动检测的通用程序](https://img.taocdn.com/s3/m/00e25523482fb4daa58d4bbc.png)
80C51系列单片机波特率自动检测的通用程序 An Automatic B aud R ate Detection Pro gram for the80C51Single2Chip Computer●万新恒龚建明 Wan XinhengG ong Jianming1 引言在串行异步通讯中,常常希望从机端的波特率能随主机端的不同设置进行自动调整,这在分布式多种波特率通讯系统中可省去波特率硬件设置开关切换的不便。
软件实现波特率自动检测的设计思想常见的有以下两种:一种是当主机启动通讯程序以后,逐一选择波特率向从机发某一固定调试字符(如ASCII1),不断地重复接收和检验过程直至无误。
二是利用串行异步设计标准中文件导引区和记录字符中停止位的逻辑“1”信号,采用软件定时的方法确定出解调参数,然后,以该参数为基准,与随后采样的数据位信号中的周期值相比较以判别出数据位信号中的逻辑“1”或“0”,并将其还原成二进制数以完成整个调解进程[1]。
本文介绍另一种简单可靠的软件实现波特率自动检测的方法,并给出了程序清单及详尽的注解。
该软件方法提高了波特率解调的简捷性和兼容性。
2 编程方法通讯开始时,从串行口RXD输入一个引导字符(如ASCII a)作为测试字符,当检测到起始位(下降沿)时启动计数器T0,在随后串行数据的每一个上升沿,“捕获”计数器的值并保存,当计数器溢出时,最后的“捕获”值则表示串行接收字符从起始位到停止位的持续计数值。
然后,将此计数值与波特率索引表中每种标准波特率所对应的数据相比较,从而检测出正确的波特率。
对每一种波特率,通过下式计算出所对应的最大计数器预置值,存入表格BdTab中:最大定时器预置值=晶振频率(MHz)波特率×512以82N21通讯(8位数据位,无奇偶校检, 1位停止位)为例,上式推导如下:最大定时器预置值=最小识别时间机器周期最小识别时间=识别位数×字节时间9机器周期=12/晶振频率字节时间=9/波特率3 程序清单通用程序清单及详尽的注解如下:;预定义RX BIT P3.0;串行数据接收端CharH DATA30h;保存TH0值CharL DATA31h;保存TL0值BdRt DATA32h;保存波特率最终检测值Display EQU P1;显示调试结果;复位及中断向量万新恒,现在华中理工大学固体电子学系工作。
基于51单片机的CAN通讯协议C语言程序
![基于51单片机的CAN通讯协议C语言程序](https://img.taocdn.com/s3/m/c26eb97127d3240c8447ef35.png)
// 入口函数 无
// 出口函数 无
// 全局变量 SJA_workmode
// 操作寄存器 控制寄存器(地址00)
// 函数功能 设置SJA工作在复位模式
#define SJA_RIE 0 //接收中断
//-----------------------定义地址指针,指向基址--------------------------------------------------------
bit bdata SJA_workmode=1; //SJA_workmode=1SJA工作在工作模式
//SJA_workmode=0工作在复位模式
#define base_Adr 0x00
//-----------------------定义总线定时寄存器的值--------------------------------------------------------
#define SJA_BTR0 0x00 //该值需要用户根据实际需要的波特率进行计算
//------------------------------------------------------------------------------------------------------
// 函数类别 SJA1000基本操作
// 函数名称 CANREG_write
}BASICCAN_FRAME,receive_BUF,send_BUF;
//BASICCAN_BUFstruct send_BUF;
//------------------------------------------------------------------------------------------------------
基于51单片机串口波特率自适应方法
![基于51单片机串口波特率自适应方法](https://img.taocdn.com/s3/m/b7b57269178884868762caaedd3383c4bb4cb4ec.png)
基于51单⽚机串⼝波特率⾃适应⽅法 在单⽚机中,UART是常⽤的通信⽅式。
最近在研究Bootloader需要设置UART的波特率⾃适应,通过查阅资料参考了⽹友的⽅法,故借此分享我的⽅法。
⼀般的,串⼝⾃适应波特率有以下2种⽅法。
⼀是通过具有独⽴的同步字符。
使⽤串⾏通讯前,要先进⾏同步操作,即接收端通过对⽐接收到的字符与同步字符的差异调整波特率,或者通过定时器测量同步字符的位宽计算波特率。
即将串⼝接收IO电平状态进⾏定时器计时,计算出最⼩脉宽时长,即⼀帧时长,就可算出其波特率值,这种⽅式需要特定的同步字符(如:0x55、0xAA等)或者增加检测的周期。
⼆是不需要独⽴的同步字符。
即不管波特率如何,可以直接通讯。
通讯命令前导字符固定,⽐如⼀些短消息模块使⽤AT指令集,每条指令都是以AT开始的,这样虽然是命令但是有同步的作⽤,不过要求必须在真实命令到来前调整波特率,这种⽅式需要的时间周期长,因为单⽚机需要不断调整波特率去接收判断传输的字符直到通讯成功,且判断必须快速准确。
由于⽅便需要,以下实验采⽤的是⽅法⼀,使⽤单⽚机SC95F8617作为串⼝实验对象。
实验条件:内部定时器⼀个。
实验⽅法:通过定时器,连续检测UART输⼊引脚RXD上的电平变化,得到RXD上最⼩的脉宽时长计算出波特率,以达到波特率⾃适应。
参考代码如下,最后返回的就是波特率数值,其中发送的同步字符为0x55:1#define SystemClock 32000000 //HRC=32MHz2#define UART_TX P21 //TX⼝3#define UART_RX P20 //RX⼝4#define UART_TX_INIT {P2CON &= ~(1<<1);P2PH |= (1<<1);} //TX设为输⼊上拉模式5#define UART_RX_INIT {P2CON &= ~(1<<0);P2PH |= (1<<0);} //RX设为输⼊上拉模式67//波特率⾃适应8//需要⽤到读IO电平9//通过检测到最⼩的脉宽时间10 unsigned long UART_Baud_Adapt(void)11 {12 unsigned long baudrate =0;13 unsigned long t1=0,t2,t=0;14 unsigned long oldLevel,newLevel;15 unsigned char i=0;16 UART_RX_INIT; //RX设为输⼊模式1718 oldLevel = UART_RX; //读取⼀次RX的电平19while(UART_RX == 1); //等待RX被拉低20 Timer0_Open();21 Timer0_Enable();22for(i=0;i<8;) //连续检测8次电平变化,检测1个字节23 {24 newLevel = UART_RX; // 读RX的电平25if(newLevel != oldLevel) // 如果有电平变化26 {27 t2 = (unsigned long)(TH0<<8)+TL0; // 读定时器中的值28 oldLevel = newLevel; // 更新为新的引脚值29if((t1 == 0)&&(t == 0)) // 第⼀个电平变化30 {31 t1 = t2; // 记录第⼀个时刻点32 }33else// 不是第⼀个电平变化34 {35if(t == 0) // 第⼀段电平36 {37 t = t2-t1; // 记录第⼀段电平所⽤时间38 }39else// 不是第⼀段电平40 {41if((t2-t1)< t)42 {43 t = t2-t1; // 保留电平脉宽的最⼩值44 }45 }46 t1 = t2; // 更新为新的时刻点47 }48 i++; // 电平变化数+149 }50 }51 Timer0_Close();52 baudrate = (unsigned long)(t*403/400); //计算时间53 baudrate = SystemClock/baudrate; //计算波特率54return baudrate;55 }56//Timer0设置57void Timer0_Open(void)58 {59 TMCON = 0X07; //不分频60 TMOD |= 0x01; //0000 0001;Timer0设置⼯作⽅式161 TH0=TL0=0;62 }63//使能Timer064void Timer0_Enable(void)65 {66 ET0 = 1; //定时器0允许67 TR0 = 1; //打开定时器068 }69//关闭Timer070void Timer0_Close(void)71 {72 ET0 = 0; //定时器0关闭73 TR0 = 0; //关闭定时器074 } 通过实际测试多个波特率,结果如下:波特率⾃适应实验对⽐发送同步字符波特率(bps)⾃适应⽅法计算得到的波特率(bps)480047649600958919200194173840038787115200122605256000240601 从上⾯测试数据可以看到这种⽅法计算出的低速波特率还是⽐较接近的,系统时钟越快,理论上计算出来的数据越接近。
基于51单片机的高速公路测速系统和车牌识别分析
![基于51单片机的高速公路测速系统和车牌识别分析](https://img.taocdn.com/s3/m/fb1b548383d049649b665815.png)
基于51单片机的高速公路测速系统和车牌识别分析添加时间: 2010-3-20 11:19:19 文章来源: 文章作者: 点击数:17688摘要鉴于高速公路限速牌不能很好地对司机起到警示作用的作用,本文设计了一套基于MCS-51单片机,包含光电探测装置和显示装置的电子屏幕。
它不仅能方便设置并显示该路段的限制速度,以完成普通电子限速牌的限速提示功能,同时能将测得的车速实时显示,并自动判断是否超速。
另外它低廉的造价和经计算证明较高的精度大大提高了它的可用性。
车辆牌照自动识别系统是近几年发展起来的基于图像和字符识别术的智能化交通管理系统,是目前国内外模式识别应用研究领域的一个热点。
本文对系统中区域提取、图像预处理、字符分割和字符识别等环节涉及的算法、设计做了一个比较详细的论述。
本文在图像预处理中重点介绍一种在图像获取阶段有目的定位关注的物体,讨论了灰度图像二值化的多种算法,利用它在原始图像形成的标识区域特性,在约束条件下,按照识别牌几何特征提出了一种特殊的二值化处理方法。
实验证明该图像识别系统具有较高的可靠性与稳定性,减小了进一步车牌识别中计算量大的问题,从而提高了车牌识别的准确性和快速性。
讨论了灰度图像二值化的多种算法基于数学形态学的图像去除噪声的方法。
基于数学形态学的图像去除噪声是通过对图像的开、闭操作有选择的去噪声。
可以去除直径小于字符笔划半径的孤立噪声点。
还详细地介绍了基于字符形态划分的字符识别方法。
基于字符形态划分的字符识别方法是在对数字字符结构进行充分分析的基础上,对基元检测,归纳字符形态特征,得到的快速字符识别方法。
关键词:光电检测;车速测量;单片机;电子限速牌;车辆牌照;图像处理;基元检测;字符识别基于51单片机的高速公路测速系统和车牌识别分析AbstractIn view of the highway speed limit unlicensed drivers should not very well serve as a warning to the role, this article has designed a single-chip based on the MCS-51, including the photoelectric detection devices and display devices of the electronic screen. It not only can easily set up and display the road speed limit in order to achieve common electronic speed limit signs prompt function, can be simultaneously measured real-time display of speed and automatically determine whether the speeding. In addition it is low cost and the higher the accuracy of calculations greatly enhance its usability. Vehicle License Plate Recognition system is developed in recent years based on the image and character recognition operation of the Intelligent Traffic Management System, the application of pattern recognition at home and abroad are currently a hot area ofresearch. In this paper, the system of regional extraction, image preprocessing, character segmentation and character recognition algorithm, such as aspect involved in the design to do a more detailed exposition. In this paper image pre-processing in the introduction of a focus at image acquisition phase has the purpose of positioning objects of concern, discussed the gray image binarization of a variety of algorithms, use it in the original logo image formation of regional characteristics, in binding conditions, identification card in accordance with the geometric characteristics of a particular binarization approach. Experiments prove that the image recognition system has high reliability and stability, further reduce the vehicle license plate recognition in the calculation of a large quantity of questions, thereby increasing the accuracy of license plate recognition and speed.Discussed the gray image binarization algorithm of multiple images based on mathematical morphology method to remove noise. Images based on mathematical morphology to remove the image noise is through the open and close operation has chosen to noise. Can remove the character strokes of a diameter less than the radius of the isolated noise points. Also detail the division of character-based form of character recognition methods. Morphological character-based division of Character Recognition on the figure are at a full analysis of character structure based on element detection, morphological characteristics summarized characters get Character Recognition Express.Key words:Photoelectric detection; speed measurement; Singlechip; electron speed licensing; vehicle license; image processing; motif detection; Character Recognition目录摘要................................................................................. (I)Abstract........................................................................... . (II)第1章绪论................................................................................. . (2)1.1 车牌字符识别研究课题的背景 (2)1.2 车牌字符识别研究的意义 (2)1.3 车牌字符识别研究的应用现状及发展 (3)1.4 本文主要内容.................................................................................第2章车牌图像预处理 (5)2.1 数字图像处理的相关介绍 (5)2.1.1 数字图像处理概念 (5)2.1.2 图像的数字化表示 (5)2.1.3 本文中图像处理所涉及的相关领域 (6)2.2 图像二值化................................................................................. . (6)2.2.1 彩色图像和灰度图像 (6)2.2.2 基于灰度的图像二值化 (7)2.2.3 图像二值化结果演示 (9)2.3 用数学形态学的方法去除噪声 (10)2.3.1 数学形态学的几种基本运算 (10)2.3.2 经开闭运算前后的图像对比显示 (16)2.4 单个字符图像的分割 (17)2.4.1 我国车牌的特点 (17)2.4.2 对所要识别的车牌的分析 (17)2.4.3 基于列扫描黑色像素积累的字符分割 (18)2.4.4 已经分割后的单个字符演示 (18)2.5 本章小结................................................................................. . (19)第3章基于字符形态划分的字符识别 (19)3.1 字符识别概述................................................................................3.1.1 目前字符识别的一些常规方法 (20)3.2 字符轮廓分析 (21)3.2.1 字符轮廓的划分 (21)3.2.2 字符四方向轮廓公式化表示 (21)3.3 字符轮廓的变化特征 (22)3.4 字符形态划分的结构基元 (22)3.4.1 字符结构基元划分原理 (22)3.4.2 字符形态划分方法的特点 (23)3.5 利用字符结构基元划分的字符识别原理 (24)3.5.1 基元的检测 (24)3.5.2 轮廓的统计特征 (25)3.5.3 用字符形态识别数字字符 (25)3.5.3.1 数字字符的特点 (25)3.5.3.2 数字字符的识别方法 (26)3.5.4 字符识别的matlab算法流程 (27)3.6 本课题整体流程 (29)3.6.1 对本课题流程的总体说明 (29)3.6.2 用MATLAB完成本课题的流程图 (30)3.7 基于字符形态划分的字符识别方法的特点和不足 (30)3.8 本章小节................................................................................. (31)结论................................................................................. . (32)参考文献................................................................................. (33)第1章绪论1.1 车牌字符识别研究课题的背景随着21世纪经济全球化和信息时代的到来,作为信息来源的自动检测、图像识别技术越来越受到人们的重视。
51系列单片机波特率的计算方法(最终版本)
![51系列单片机波特率的计算方法(最终版本)](https://img.taocdn.com/s3/m/8113ef05a216147917112840.png)
STC单片机串口1用定时器1模式2做波特率发生器的计算方法一、基本原理说明定时器1工作在方式2是一种既省事又精确的产生串行口波特率的方法。
原因是定时器T1工作方式2是一种8位自动重装方式,无需在中断服务程序中送数,没有由于中断引起的误差。
波特率的计算公式:设定时器T1方式2的初值为X,则有:定时器T1的溢出率=计数速率/(256-X)=fosc/(256-X)*12;(注:12分频的单片机)则方式2的波特率=2SMOD*fosc/(256-X)*12*32.二、计算题1.波特率的计算公式:9600Hz(9600bps),4800Hz(4800bps),其他波特率都有误差。
图1此图中波特率是19200BPS、57600BPS时候,存在误差2.溢出率:溢出率应该是每秒溢出的次数。
综合式:波特率=(2SMOD/32)*(T1的溢出率)=(2SMOD/32)*(fosc/(12*(256-TL1)))=(2SMOD*fosc)/(394*(256-TL1))12/fosc=每个机器周期时间(fosc单片机的晶振时钟的频率),8位定时器T1溢出一次所需的时间=(12/fosc)*(256-初值)=溢出一次所需的时间,最后用1除以该数就代表每秒溢出的次数,也称作溢出率。
计数速率=fosc/12(12分频的单片机)溢出速率=1/一次溢出时间=1/((256-TL1初值)*(12/fosc))=fosc/(12*(256-TL1初值))3.计算例题(1)若STC单片机的晶振频率fosc为11.0592MHz,串行口1工作在方式1,定时器T1作为波特率发生器,T1在工作模式2自动重装初值的8位定时方式,已知SMOD=0,要求串行口1的波特率为9600Hz(9600bps),请计算定时器T1的初始值TL1=?。
解答:(a)因SMOD=0,波特率=(2SMOD/32)*(T1的溢出率)=(T1的溢出率)/32=9.6Kbps计算得,T1的溢出率=9.6KHz*32=307.2KHz=0.3072MHz(b)T1的溢出率=fosc/(12*(256-TL1))=11.0592MHz/(12*(256-TL1))=0.3072MHz计算得,TL1=253=0x FDH(c)STC-ISP软件计算结果如下图所示:(d)C语言编写的串口1和定时器1初始化代码如下:void UartInit(void)//9600bps@11.0592MHz{PCON&=0x7F;//波特率不倍速SCON=0x50;//8位数据,可变波特率AUXR&=0xBF;//定时器1时钟为Fosc/12,即12TAUXR&=0xFE;//串口1选择定时器1为波特率发生器TMOD&=0x0F;//清除定时器1模式位TMOD|=0x20;//设定定时器1为8位自动重装方式TL1=0xFD;//设定定时初值TH1=0xFD;//设定定时器重装值ET1=0;//禁止定时器1中断TR1=1;//启动定时器1}电源控制寄存器PCON初值:0X7FH----01111111PCON&=0X7F;比特B7B6B5B4B3B2B1B0名字SMOD SMOD0LVDF POF GF1GF0PD IDL 值01111111 SMOD=0;表示串口1的波特率不加倍;SMOD0、LVDF、POF、GF1、GF0、PD、IDL维持原状态位不变;串口1控制寄存器SC0N初值:0X50H-----01010000SC0N&=0X50;比特B7B6B5B4B3B2B1B0名字SM0/FE SM1SM2REN TB8RB8TI RI 值01010000 SMOD0=0,SM1=1;表示串口1工作在模式1方式;SM2=0;表示串口1在方式1非多机通信方式;REN=1;表示维持原状态位不变;TB8、RB8、TI、RI各位分别置0;辅助寄存器AUXR初值:0XBFH-----10111111AUXR&=0XBF;比特B7B6B5B4B3B2B1B0名字T0X12T1X12UART_M0x6T2R T2_C/T T2x12EXTRAM S1ST2值10111111 T1X12=0;表示定时器1是12分频,其速度是传统8051的速度;T0X12、UART_M0x6、T2R、T2_C/T、T2x12、EXTRAM、S1ST2维持原状态位值不变;辅助寄存器AUXR初值:0XFEH------11111110AUXR&=0XFE;比特B7B6B5B4B3B2B1B0名字T0X12T1X12UART_M0x6T2R T2_C/T T2x12EXTRAM S1ST2值11111110 S1ST2=0;表示定时器1作为串口1的波特率发生器;T0X12、T1X12、UART_M0x6、T2R、T2_C/T、T2x12、EXTRAM维持原状态位值不变;辅助寄存器AUXR初值:0XBEH------10111110AUXR&=0XBE;比特B7B6B5B4B3B2B1B0名字T0X12T1X12UART_M0x6T2R T2_C/T T2x12EXTRAM S1ST2值10111110 T1X12=0;表示定时器1是12分频,其速度是传统8051的速度;S1ST2=0;表示定时器1作为串口1的波特率发生器;T0X12、UART_M0x6、T2R、T2_C/T、T2x12、EXTRAM维持原状态位值不变;定时器工作模式寄存器TMOD寄存器初值:0X0FH-----00001111TMOD&=0X0F比特B7B6B5B4B3B2B1B0名字GATE C/T M1M0GATE C/T M1M0值00001111作用域与定时器1有关与定时器0有关GATE(B7)=0;表示不要求条件INT1引脚为高,并且TR1=1的条件定时,亦即定时不受任何条件限制;C/T=0;该位为0时,表示定时器1工作在定时模式;M1=0,M0=0;表示定时器1-16位自动重新加载模式;B3、B2、B1、B0维持原状态位值不变;定时器工作模式寄存器TMOD初值:0X20H------00100000TMOD|=0X20;比特B7B6B5B4B3B2B1B0名字GATE C/T M1M0GATE C/T M1M0值00100000作用域与定时器1有关与定时器0有关M1=1,M0=0;表示定时器1-8位自动重新加载模式;B7、B6、B4、B3、B2、B1、B0维持原状态位值不变;(2)若STC单片机的晶振频率fosc为11.0592MHz,串行口1工作在方式1,定时器T1作为波特率发生器,T1在工作模式2自动重装初值的8位定时方式,已知SMOD=1,要求串行口1的波特率为9600Hz(9600bps),请计算定时器T1的初始值TL1=?。
51单片机串行通讯中波特率的自动检测
![51单片机串行通讯中波特率的自动检测](https://img.taocdn.com/s3/m/66ba6c1d227916888486d762.png)
51 单片机串行通讯中波特率的自动检测本文介绍一种在80C51 串行通讯应用中自动检测波特率的方法。
按照经验,程序起动后所接收到的第1个字符用于测量波特率。
这种方法可以不用设定难于记忆的开关,还可以免去在有关应用中使用多种不同波特率的烦恼。
人们可以设想:一种可靠地实现自动波特检测的方法是可能的,它无须严格限制可被确认的字符。
问题是:在各种的条件下,如何可以在大量允许出现的字符中找出波特率的定时间隔。
显然,最快捷的方法是检测一个单独位时间(single bit time),以确定接收波特率应该是多少。
可是,在RS-232 模式下,许多ASCII 字符并不能测量出一个单独位时间。
对于大多数字符来说,只要波特率存在合理波动(这里的波特率是指标准波特率),从起始位到最后一位“可见”位的数据传输周期就会在一定范围内发生变化。
此外,许多系统采用8 位数据、无奇偶校验的格式传输ASCII 字符。
在这种格式里,普通ASCII 字节不会有MSB 设定,并且,UART总是先发送数据低位(LSB),后发送数据高位(MSB),我们总会看见数据的停止位。
在下面的波特率检测程序中,先等待串行通讯输入管脚的起始信号(下降沿),然后起动定时器T0。
在其后的串行数据的每一个上升沿,将定时器T0的数值捕获并保存。
当定时器T0溢出时,其最后一次捕获的数值即为从串行数据起始位到最后一个上升沿(我们假设是停止位)过程所持续的时间。
CmpTable 表格列出了每一波特率的最大测量时间。
这些数据是经过选择的,所以,4 个数据位时间(加上起始位时间)仍可产生正确的波特率。
使用这种方法时,必须遵守一个假设:这种技术仅取决于所接收到的一个字符,接收这个字符的波特率必须大于最低波特率。
本质上来说,这意味着这个字符必须来自正常敲击键盘时所产生的字符。
在PC上,我们不可能快速、连续地敲击两个字符,以欺骗程序。
但是,PC的功能键具有一个问题,因为它会连续发送两个紧挨着的字符,使程序检测得到错误的波特率。
51单片机串口通信程序。。含详细例子
![51单片机串口通信程序。。含详细例子](https://img.taocdn.com/s3/m/52dbb7e64afe04a1b071dea7.png)
{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();
基于51单片机的称重系统设计
![基于51单片机的称重系统设计](https://img.taocdn.com/s3/m/3ef2818cb14e852458fb577c.png)
单片机作业学院计算机与控制工程学院专业自动化132学号2013022030姓名王伟基于 51 单片机的称重系统一动态称重所谓动态称重是指通过分析和测量车胎运动中的力,来计算该运动车辆的总重量、轴重、轮重和部分重量数据的过程。
动态称重系统按经过车辆行驶的速度划分,可分为低速动态称重系统与高速动态称重系统。
因为我国高速公路的限速最高是120,所以高速动态称重系统在理论上可对 5 到 120 之间时速通过称量装置的车辆进行动态称重。
而低速动态称重系统则一定要限制通过车辆的行驶速度,要想有较高的测量精度,理论要求车辆在5km/h 以下时速匀速通过。
在我国,车辆动态称重一般都使用低速动态称重来完成,在很多收费站和车辆检测站都有应用,国家也出台了相关的测量标准。
与传统意义上的静态称重相比,动态称重可以在车辆缓慢运动情况下直接进行称重,这样动态称重的高效率、测量时间短、能流畅交通等主要特点就凸显出来了。
动态称重的问世,不但使车辆的管理上有了很大的促进作用,而且还对我国的公路管理和维护起到了至关重要的作用。
二系统总体结构及其功能设计总体结构是以51 单片机为处理器的系统,如图 3.1 所示。
上位机键盘输入A/D转换器放大器ADC0832OP07AT89C51桥式称重传感器RS232转换器单片机WPL110蜂鸣器LED显示图3.1本设计要求能判断出车辆是否超载,如果车辆超载,本系统能够提供该车辆的超载信息并发出警报。
本设计采用STC89C52单片机作为系统的处理核心,利用桥式称重传感器到A/D 转换器中转换为数字信号,再经过单片机处理、传输到接口电路,最后送到上位机,该数据可以与上位机里用键盘事先输入设定的总重量作比较并判断出该车辆是否超载,如果超载,则可通过显示器、蜂鸣器作显示超载信息并报警,当然,键盘的作用除了输入设定值还可以解除和开启警报。
三动态称重系统的组成动态称重系统主要由车辆重量(含超载、偏载检测)检测子系统、货车长、宽、高三维尺寸超限检测子系统、自动触发摄像拍照子系统、车辆类型自动判别子系统、系统配置及系统维护子系统、行驶车辆速度测量子系统、数据统计、报表处理子系统和单据输出打印子系统这几部分组成。
51单片机实验指导书
![51单片机实验指导书](https://img.taocdn.com/s3/m/b3829ce283d049649b6658ff.png)
.51系列单片机原理与应用实验华南师范大学物理与工程工程学院微机教研室20010年9月目录实验须知 (2)实验一数字量输入输出实验 (4)实验二交通灯控制实验 (6)实验三定时与中断实验 (8)实验四串行通信实验 (11)实验五串行A/D转换实验 (13)实验六现实人体视觉暂留特性测试实验 (14)实验七实时时钟制作实验 (17)实验八简易电子琴制作实验 (18)实验九 EEPROM应用—数字密码锁 (20)实验十综合实验:教学板自检程序设计 (25)实验十一数据采集—火灾报警装置的软硬件设计 (26)附录一实验教学板 (27)附录二实验用软件使用说明 (28)实验须知一、预习要求1.实验前认真阅读实验指导书的相关内容,明确实验目的和实验任务。
2.实验前应做好预习报告,在报告中,要求画出所设计的实验电路原理图、程序流程图,编写好程序,并对程序加以注释,还要拟订好实验步骤。
二、实验要求1.按实验中心安排的时间到指定实验室上实验课,不要迟到、缺席。
有特殊原因不能在原安排时间来实验时,须提前一天通知实验中心负责教师。
2.认真完成每次实验的各项任务,实验结果要请指导教师检查。
教师对实验内容提问,并对完成者进行记录。
3.爱护设备,保持清洁,不得在实验室内大声喧哗,不要将食物带入实验室,不擅自更换设备。
4.在实验箱(板)通电状态下,不要用手随意触摸电路板上除按键和开关以外的芯片等其它元器件。
,严禁带电操作,即所有接线、改线和拆线操作均应在不带电的状态下进行。
5.实验中若发生异常情况应立即切断电源,并向指导教师报告,检查原因,避免再次发生类似情况。
6.实验完毕,请整理好实验设备后再离开实验室。
三、实验报告要求实验报告必须使用实验报告专用纸,书写要工整、清楚,并在下一次实验时交给指导教师。
实验报告应包括以下内容:1.实验名称、实验人姓名、学号、班级、同组人姓名。
2.实验目的、任务(内容)。
3.各任务程序流程图、自编程序清单,对程序须给出适量注释(例如:变量和某些寄存器的作用,关键程序段的功能等)。
51单片机与迪文DGUS屏通信例程之三: 单片机程序编写
![51单片机与迪文DGUS屏通信例程之三: 单片机程序编写](https://img.taocdn.com/s3/m/2d0a7f8433d4b14e852468dc.png)
51单片机与迪文DGUS屏通信例程之三:单片机程序编写相信接触过STC15系列单片机的小伙伴们,应该会对其编程风格比较熟悉,没错,STC15系列单片机可以采用库函数编程,官方提供了标准的函数库,我们只需要利用好库函数,便可大大简化配置流程,从而提高编程效率。
由于笔者这里的教程不是关于51单片机的基础教程,所以此处省去了新建工程以及如何添加库文件等操作。
首先,我们要养成良好的习惯,在使用任何一款板子的时候,先建一个配置板载资源的文件,当然要是板子比较复杂的话,可以分模块配置多个,由于笔者使用的板子比较简单,所以就只添加了一个名为“BSP_IO.h”的文件,顾名思义,就是一些输入输出的配置而已了。
接下来,我们来配置一下串口参数,在之前的帖子中我们知道,迪文DGUS屏的串口通信波特率配置的是115200,那么,我们在单片机程序中,自然也要讲串口通信的波特率配置成115200,其他的就不需要修改了:
程序中有需要用到串口定时向触摸屏刷新数据,所以,这里我们也配置一个定时器,并设置起中断频率为1000Hz,即:1ms中断一次。
接下来,我们需要根据板子上的IO分布,来配置一下IO口的输入输出模式,所有输入口均配置成“准双向口”,所有输出口均配置成“强推挽模式”。
另外,程序中也有用到两路0-5V电压的采集,所以此处我们还需要对ADC相关的参数进行配置,本例程中采用的是AD口分别是P10和P11,查询方式获取AD值:
至此,系统配置相关的东西基本就完成了,接下来,我们就需要自己写一些应用相关的函数了,本例中,笔者写了四个函数:
Uart1_Monitor(); //串口1数据监控。
单片机串口通信及波特率设置
![单片机串口通信及波特率设置](https://img.taocdn.com/s3/m/bc12c54103d8ce2f006623db.png)
51单片机串口通信及波特率设置MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。
它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。
1. 数据缓冲寄存器SBUFSBUF是可以直接寻址的专用寄存器。
物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。
接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。
对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。
2. 状态控制寄存器SCONSCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
它的各个位定义如下:MSB LSBSM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。
SM0 SM1 工作方式功能波特率0 0 0 8位同步移位寄存器Fosc/120 1 1 10位UART 可变1 02 11位UART Fosc/64或Fosc/321 1 3 11位UART 可变SM2在工作方式2和3中是多机通信的使能位。
在工作方式0中,SM2必须为0。
在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
REN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
TB8是工作方式2和3要发送的第9位数据。
利用单片机实现波特率自检测的设计
![利用单片机实现波特率自检测的设计](https://img.taocdn.com/s3/m/eb0b649b83d049649b66583d.png)
摘要高速发展的计算机业需要新型人才,需要具有创新的技术、专业的知识和富有团队作业能力的人才,踏着豪迈的脚步我们随着时间走进了21世纪,21世纪科学技术的飞快发展,人们不但在学习,工作方面有了更高的追求。
他们已经不再局限于仅能做到,而是追求着更高的质更高飞跃和省时,省事,低成本成本的快捷方式。
在当今社会,各种智能化控制系统均离不开数据信息的传输。
其中波特率自动检测应用技术在单片机应用中占有很重要的一部分。
通过学习单片机技术,解决实际生活中波特率自动检测的一种方案,性能,特点等,从而应用到实际当中去.通过对单片机的学习,开发出一个完整的系统.包括硬件设计,制作,独立运行及调试的软件及编程。
关键词:波特率检测目录摘要 (1)1. 前言 (3)1.1课题简介 (3)1.2单片机的生产与发展 (4)1.3单片机的特点及应用 (5)1.4AT89S51系列单片机介绍 (6)1.4.1 基本特性 (6)3. 总体设计电路图及工作原理 (7)2.1机型及器件的选择 (7)2.2软、硬件功能划分 (7)3. 系统硬件设计 (8)3.1系统硬件电路设计 (8)3.2硬件设计电路原理图 (9)3.3各元件说明 (9)3.3.1 AT89S51芯片 (9)3.3.2 MAX232CPE芯片 (10)4. 系统软件设计 (13)4.1编程思路 (13)4.1.1 详细设计 (15)4.1.2 编写程序 (15)4.2七段数码显示电路 (16)4.2.1 接口及写入电路 (16)总结 (17)致谢....................................................... 错误!未定义书签。
参考文献. (18)附录1 (19)附录2 (20)利用单片机实现波特率自检测1. 前言1.1 课题简介此课题的设计的目的和意义是以实用性的产品为设计对象,通过完整的设计和制作过程,使我们进一步清楚了解波特率自检测设计制作的流程和特点。
2024版51单片机ppt课件
![2024版51单片机ppt课件](https://img.taocdn.com/s3/m/c241c264e3bd960590c69ec3d5bbfd0a7956d5a6.png)
THANKS
感谢观看
51单片机ppt课件
目录
• 51单片机概述 • 51单片机结构与原理 • 指令系统与汇编语言程序设计 • 中断系统与定时/计数器应用 • 串行通信接口原理及应用实例分析 • 并行扩展技术及其在外围设备中的应用 • 总结回顾与展望未来发展趋势
01
51单片机概述
定义与发展历程
定义
51单片机是指基于Intel 8051内核 的单片机,是一种集成度高、功能 强大的微控制器。
定时/计数器工作原理及设置方法
工作原理
定时/计数器是对机器周期进行计数, 实现定时或计数功能。
设置方法
工作模式
包括模式0(13位定时/计数器)、模 式1(16位定时/计数器)、模式2(8 位自动重装载定时/计数器)和模式3 (特殊功能寄存器)。
通过编程设置定时/计数器的工作模式、 计数初值、启中所取得的成果,如完成的实验、 项目、作业等,并分享自己的学习经验和心得。
不足之处分析 学生分析自己在课程学习中存在的不足之处,如对某些知 识点的理解不够深入、实验技能有待提高等,并提出改进 措施。
未来学习计划与目标 学生根据自己的实际情况和需求,制定未来的学习计划和 目标,如深入学习某一领域的知识、参加相关竞赛或项目 等。
分时操作、实时处理、故障处 理。
外部中断0、定时器0中断、外 部中断1、定时器1中断、串行 口中断。
高优先级中断可以打断低优先 级中断。
外部中断触发方式选择
1 2
电平触发方式 外部中断请求信号为低电平时有效。
边沿触发方式 外部中断请求信号由高电平跳变为低电平时有效。
3
定时器/计数器溢出触发方式 定时器/计数器溢出时产生中断请求。
51单片机原理及应用实验指导书
![51单片机原理及应用实验指导书](https://img.taocdn.com/s3/m/ebb541fd941ea76e58fa0454.png)
51单片机原理及应用实验指导书天津大学仁爱学院2010年10月实验须知一、预习要求1.实验前认真阅读实验教程中有关内容,明确实验目的和实验任务。
2.每次实验前应有预习报告,未预习者不允许参加实验。
3.预习报告中:对软件实验,要求画出程序流程图,编好上机程序。
二、实验要求1.实验是学习“汇编语言程序设计”这门课程的重要环节,实验课请勿迟到,缺席。
2.爱护设备,保持清洁,不随意更换设备。
3.认真完成实验任务,实验结果经教师检查,教师对实验内容提问,对完成者做记录。
4.做实验时,发生事故,应立即切断电源,并马上向教师报告,检查原因,吸取教训。
5.实验完毕,请整理实验设备,再离开实验室。
三、报告要求每次实验后,应递交一份实验报告,报告中应包括下列内容:1.实验名称、实验人姓名、学号、班级、所用的设备号。
2.实验目的、任务。
3.程序流程图、程序清单(应加适量注释)。
4.记录和分析实验结果。
5.根据实验目的认真做小结第一章51单片机实验系统简介1.1实验系统的特点EL-MUT-III 型单片机/微机教学实验系统具有开发、应用、实验相结合的高科技实验设备,系统具有以下特点:1、CPU可选用80C31、8086、中任一种CPU,系统功能齐全,涵盖了微机/单片机教学实验课程的大部分内容。
(本课程选用80C31 CPU)2、系统采用开放式模块化结构设计,通过两组相对独立的总线最多可同时扩展2块应用实验板,用户可根据需要购置相应实验板,降低了成本,提高了灵活性,便于升级换代。
3、配有两块可编程器件:EPM7128被系统占用。
另一块EPM7032供用户实验用。
两块器件皆可通过JTAG接口在线编程。
使用十分方便。
4、灵活的电源接口:配有PC机电源插座,可由PC提供电源。
另外还配有外接开关电源,提供所需的+5V,±12V,其输入为220V的交流电。
5、系统的联机运行模式:即配有系统调试软件,系统调试软件分DOS版和WINDOWS 版两种,均为中文多窗口界面。
基于51单片机的颜色识别系统.doc
![基于51单片机的颜色识别系统.doc](https://img.taocdn.com/s3/m/c3981df059eef8c75ebfb3e2.png)
基于51单片机的颜色识别系统(完结)背景:随着现代工业生产向高速化、自动化方向的发展,生产过程中长期以来由人眼起主导作用的颜色识别工作将越来越多地被相应的颜色传感器所替代。
例如:图书馆使用颜色区分对文献进行分类,能够极大地提高排架管理和统计等工作;在包装行业,产生包装利用不同的颜色和装潢来表示其不同的性质或用途。
目前的颜色传感器通常是在独立的光电二极管上覆盖经过修正的红、绿、蓝滤波片,然后对输出信号进行相应的处理,才能将颜色信号识别出来;有的将两者集合起来,但是输出模拟信号,需要一个A/D 电路进行采集,对该信号进一步处理,才能进行识别,增加了电路的复杂性,并且存在较大的识别误差,影响了识别的效果。
TAOS (TexasAdvancedOptoelectronicSolutions)公司最新推出的颜色传感器TCS3200,不仅能够实现颜色的识别与检测,与以前的颜色传感器相比,还具有许多优良的新特性。
最近在网上淘了一片TCS3200模块,从官方的介绍中看的出这片TCS3200功能好强大,闲来没事就做了一实验,想看看这个TCS3200的性能、检测能力到底怎样;需要的器件和材料:1.51最小系统(12T 时钟:11.0592MHz)2.TCS3200颜色识别模块3.各种颜色的物料4.1602液晶屏TCS3200接口定义:S0、S1接VCCEO接GND(或用IO口控制)S2接P1.0S3接P1.1OUT接P3.5(必须)(测试程序贴在后面,实物测试通过!)(TCS3200颜色识别模块)(自己做的TCS3200模块转接板,方便连线,方便检测颜色)(模块和转接板连接完成)(最小系统)(1602液晶屏)(连接好1602液晶屏)(为了方便检测小物料和白平衡检测,需要自己做一个小平台,俩饮料瓶盖子,一颗自攻螺丝即可搞定!)(做好的平台,为了方便白平衡,需要在上面盖子上划俩口子,只要能卡住一张白纸即可!)(最终效果)(全家福)(连接好TCS3200模块)(白平衡测试,注意:上电前必须白平衡检测,不然后面检测的颜色都不会准确的;检测方法:白纸放在TCS3200模块前面1公分处,然后单片机上电,只要第一次读出的值为255,255,255即可,否则请重新进行白平衡!)(白平衡的结果,现在就可以进行颜色识别了)(识别到绿色娃娃的颜色,上位机上面的颜色为识别到的颜色,同时液晶上会显示RGB值)(识别到黄色娃娃的颜色值)(识别到粉红色娃娃的颜色值)(上位机显示粉红色娃娃的颜色)(上位机界面)(这俩高尔夫球的识别,但是结果不准确,估计是这俩高尔夫球的反光能力太强烈了,只要表面不是很光滑的物体检测出来误差都是很小的,另外,有网友说要放在黑盒子里检测,我感觉没必要,只要白平衡做好了基本就没什么问题了,至于表面特别光滑的物体,只能去寻找其他方法去进行检测了!)========================= 测试程序========================#include "reg52.h" #define _data P2 //LCD1602数据接口/****************************************************************** - 说明:端口定义- 备注:无******************************************************************/ sbit EN =P0^5; //读写使能,高电平有效,下降沿锁定数据。
单片机串口通信波特率自动识别
![单片机串口通信波特率自动识别](https://img.taocdn.com/s3/m/57ec1fb2f121dd36a32d82d3.png)
毕业设计说明书设计题目:单片机串口通信波特率自动识别学院计算机科学与信息工程学院专业年级自动化2008级学生姓名何泽宏学号 2008133220 指导教师刘传文职称讲师设计地点重庆工商大学日期2012.02.27——2012.05.18单片机串口通讯波特率的自动识别重庆工商大学自动化 2008级 2班何泽宏指导教师:刘传文摘要:本设计是基于串口通信,设计能够自动识别上位机波特率的系统。
要自动识别串口通信波特率,通常的实现方法是,上位机首先发出规定的字符或数据,系统收到该字符或数据后,下位机计算对方的波特率,以适应对方的波特率进行工作。
本系统正是利用这种方法,让上位机先发送一段字符,下位机使用软件的方法检测出一位数据发送时间,从而计算出上位机发送数据波特率。
关键词:串行通信波特率自动识别发送检测Abstact:The design is based on serial communication, designed to automatically identify thebaud rate of the host computer system. To automatically identify the serial communication baud rate, the usual method, the host computer by first issuing acharacter or data, the system receives the character or data, the next bit machine, theother baud rate to adapt to each other's baud rate to work. The system took advantage ofthis method, the host computer first sends a character, the machine software to detect adata transmission time, in order to estimate the host computer to send data baud rate.Key words:serial communication baud rate automatically send detect目录第一章绪论 (1)1.1 课题研究背景 (1)1.2 串口通信基础 (2)1.2.1 同步通信(Synchronous Communication) (2)1.2.2 异步通信(Asynchronous Communication) (2)1.2.3 串行通信波特率 (3)1.2.4 串行通信制式 (3)1.2.5 串行通信校验 (4)1.3 波特率自动识别研究现状 (5)1.3.1 标准波特率穷举法 (5)1.3.2 码元宽度实时检测法 (5)1.3.3 最大公约数法 (6)1.4 设计任务及要求 (6)第二章系统方案设计 (7)2.1 系统功能指标 (7)2.2 系统设计思路及方案论证 (7)2.3 系统方案确定 (10)第三章硬件设计 (11)3.1 设计系统框图 (11)3.2 芯片选择 (12)3.2.1 单片机选择 (12)3.2.2 串行总线通信芯片 (15)3.2.3 显示芯片 (15)3.3 其它模块电路图 (17)3.3.1 电源电路 (17)3.3.2 复位电路 (17)3.3.3 时钟电路 (19)3.3.4 系统总电路 (19)第四章软件设计 (21)4.1 程序结构设计 (21)4.2 程序流程图 (21)4.2.1 一位低电平脉宽测量程序框图 (21)4.2.2 主函数框图 (22)4.3 一位低电平脉宽测量程序 (22)4.4 编译环境 (24)第五章系统调试及运行结果 (25)5.1 硬件调试 (25)5.1.1 LCD调试结果 (25)5.1.2 单片机外围电路调试 (25)5.1.3 串口调试 (25)5.2 软件调试 (25)5.3 联合调试 (26)5.3.1 生成HEX文件 (26)5.3.2 将生成的HEX文件烧录到单片机 (27)5.3.3 联合调试效果 (28)第六章结论及总结 (30)致谢 (31)参考文献 (32)附录: (32)第一章绪论1.1 课题研究背景近年来,随着科学技术的发展,PC机以其优越的性价比和丰富的软件资源成为计算机应用的主流机种。
单片机串口通信波特率自动识别分解
![单片机串口通信波特率自动识别分解](https://img.taocdn.com/s3/m/485a65135a8102d276a22f59.png)
毕业设计说明书设计题目:单片机串口通信波特率自动识别学院计算机科学与信息工程学院专业年级自动化2008级学生姓名何泽宏学号 2008133220 指导教师刘传文职称讲师设计地点重庆工商大学日期2012.02.27——2012.05.18单片机串口通讯波特率的自动识别重庆工商大学自动化 2008级 2班何泽宏指导教师:刘传文摘要:本设计是基于串口通信,设计能够自动识别上位机波特率的系统。
要自动识别串口通信波特率,通常的实现方法是,上位机首先发出规定的字符或数据,系统收到该字符或数据后,下位机计算对方的波特率,以适应对方的波特率进行工作。
本系统正是利用这种方法,让上位机先发送一段字符,下位机使用软件的方法检测出一位数据发送时间,从而计算出上位机发送数据波特率。
关键词:串行通信波特率自动识别发送检测Abstact:The design is based on serial communication, designed to automatically identify thebaud rate of the host computer system. To automatically identify the serial communication baud rate, the usual method, the host computer by first issuing acharacter or data, the system receives the character or data, the next bit machine, theother baud rate to adapt to each other's baud rate to work. The system took advantage ofthis method, the host computer first sends a character, the machine software to detect adata transmission time, in order to estimate the host computer to send data baud rate.Key words:serial communication baud rate automatically send detect目录第一章绪论 (1)1.1 课题研究背景 (1)1.2 串口通信基础 (2)1.2.1 同步通信(Synchronous Communication) (2)1.2.2 异步通信(Asynchronous Communication) (2)1.2.3 串行通信波特率 (3)1.2.4 串行通信制式 (3)1.2.5 串行通信校验 (4)1.3 波特率自动识别研究现状 (5)1.3.1 标准波特率穷举法 (5)1.3.2 码元宽度实时检测法 (5)1.3.3 最大公约数法 (6)1.4 设计任务及要求 (6)第二章系统方案设计 (7)2.1 系统功能指标 (7)2.2 系统设计思路及方案论证 (7)2.3 系统方案确定 (10)第三章硬件设计 (11)3.1 设计系统框图 (11)3.2 芯片选择 (12)3.2.1 单片机选择 (12)3.2.2 串行总线通信芯片 (15)3.2.3 显示芯片 (15)3.3 其它模块电路图 (17)3.3.1 电源电路 (17)3.3.2 复位电路 (17)3.3.3 时钟电路 (19)3.3.4 系统总电路 (19)第四章软件设计 (21)4.1 程序结构设计 (21)4.2 程序流程图 (21)4.2.1 一位低电平脉宽测量程序框图 (21)4.2.2 主函数框图 (22)4.3 一位低电平脉宽测量程序 (22)4.4 编译环境 (24)第五章系统调试及运行结果 (25)5.1 硬件调试 (25)5.1.1 LCD调试结果 (25)5.1.2 单片机外围电路调试 (25)5.1.3 串口调试 (25)5.2 软件调试 (25)5.3 联合调试 (26)5.3.1 生成HEX文件 (26)5.3.2 将生成的HEX文件烧录到单片机 (27)5.3.3 联合调试效果 (28)第六章结论及总结 (30)致谢 (31)参考文献 (32)附录: (32)第一章绪论1.1 课题研究背景近年来,随着科学技术的发展,PC机以其优越的性价比和丰富的软件资源成为计算机应用的主流机种。
第c12章 51内核单片机LPC935入门
![第c12章 51内核单片机LPC935入门](https://img.taocdn.com/s3/m/9f16c90516fc700abb68fc31.png)
作者:夏路易
电子工业出版社所有
《单片机技术基础教程与实践》
(1)PORT0(P0.0~P0.7):P0口是输出类型可定义的8位I/O 口,在上电复位时,P0口配置 为仅为输入模式。P0口可以设定为开漏、准双向、推挽或是仅输入模式,其中准双向与标准 51单片机用法相同,每一个引脚均可单独设定。P0口还具有键盘输入中断功能。所有引脚都 具有施密特触发输入。
P1 .0 /TX D P1 .1 /R XD P1 .2 /T0 /SC L P1 .3 /IN T0 /S DA P1 .4 /IN T1 P1 .5 /R ST(IN PUT ) P1 .6 /O CB P1 .7 /O CC/A D0 0 P2 .0 /IC B/D AC0 /AD0 3
18 17 12 11 10 6 5 4 1 2 13 14 15 16 27 28
(1)DATA
《单片机技术基础教程与实践》
00H-7FH:128字节的内部数据存储器,可以直接或是间接存取,堆栈常 放在该区中。
(2)IDATA
00H-FFH:256字节的间接数据存储器,包含DATA区的128字节,可以 使用间接存取指令存取。
(3)SFR 只能直接存取的CPU寄存器、外围控制和状态寄存器。 (4)XDATA 外部数据或辅助RAM,容量为512字节,该存储器空间类似于51单片机 使用MOVX指令存取的64k存储空间。 (5)CODE 代码存储空间,寻址范围为64k。 (5)E2PROM 通过SFR存取的512字节的数据存储器,可以在断电后保存数据不丢失。 作者:夏路易 电子工业出版社所有
作者:夏路易
电子工业出版社所有
OSCCLK经过分频模块DIVM后产生如下时钟: (1)CCLK
《单片机技术基础教程与实践》
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg52.h>#define uint unsigned int#define uchar unsigned char#define disp_off 0x3e //关显示#define disp_on 0x3f //开显示#define disp_x 0xb8 //页地址#define disp_z 0xc0 //行地址#define disp_y 0x40 //列地址#define comm 0 //命令标志#define dat 1 //数据标志#define data_ora P0 //MCU P0<------> LCMsbit cs1=P2^0; //cs1=L,选择左半屏sbit cs2=P2^1; //cs2=L,选择右半屏sbit rs =P2^2; //H:写数据,L:写指令sbit rw =P2^3; //H:读,L:写sbit e =P2^4; //读写使能sbit bf =P0^7; //执行操作标志sbit res=P0^4; //复位初始化标志uchar uart_data,temp,baud_set=0x00;uchar dispnum[90];uchar baud[5]={0x00,0x09,0x06,0x00,0x00};uchar r_dat[4]={0x00,0x10,0x00,0x00};uchar code baudrate[7][5]={{0x00,0x00,0x03,0x00,0x00},{0x00,0x00,0x06,0x00,0x00},{0x00,0x01,0x02,0x00,0x00},{0x00,0x02,0x04,0x00,0x00},{0x00,0x04,0x08,0x00,0x00},{0x00,0x09,0x06,0x00,0x00},{0x01,0x04,0x04,0x00,0x00},}; //波特率大小uchar code hz11[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 发--*/0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0,0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B,0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00,/*-- 文字: 送--*/0x00,0x80,0xD0,0xB0,0xA0,0x80,0x80,0x70,0x40,0xC0,0x60,0x50,0x40,0x00,0x00,0x00,0x08,0x08,0x08,0x0C,0x0B,0x08,0x09,0x0D,0x1B,0x13,0x13,0x35,0x3D,0x30,0x10,0x08,/*-- 文字: 数--*/0x00,0x00,0x40,0xE0,0x40,0xF0,0xE0,0x70,0x00,0xF0,0x50,0xC0,0x40,0x40,0x00,0x00,0x00,0x02,0x13,0x16,0x1E,0x0B,0x16,0x13,0x11,0x0B,0x06,0x0F,0x18,0x18,0x10,0x00,/*-- 文字: 据--*/0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0xF0,0x60,0x50,0xD0,0x50,0x70,0x60,0x00,0x00,0x00,0x12,0x13,0x31,0x1F,0x11,0x0D,0x07,0x3D,0x15,0x17,0x15,0x3D,0x1D,0x03,0x00,};uchar code hz12[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 波--*/0x00,0x80,0x20,0x20,0x40,0x40,0xE0,0x20,0x20,0xF0,0x30,0x20,0x20,0xC0,0x00,0x00,0x00,0x19,0x09,0x0D,0x14,0x18,0x27,0x31,0x13,0x0D,0x0D,0x1B,0x18,0x30,0x30,0x10,/*-- 文字: 特--*/0x00,0xC0,0x60,0x40,0xF0,0x60,0x40,0xA0,0xA0,0xF0,0xF0,0xA0,0xA0,0x80,0x80,0x00,0x00,0x02,0x02,0x02,0x3F,0x01,0x01,0x12,0x26,0x2E,0x2A,0x3F,0x1A,0x02,0x00,0x00,/*-- 文字: 率--*/0x00,0x00,0x20,0x60,0x60,0xA0,0x60,0xB0,0x70,0xA0,0xA0,0x60,0x20,0x20,0x00,0x00,0x00,0x04,0x04,0x07,0x05,0x04,0x05,0x3F,0x1F,0x05,0x05,0x05,0x0C,0x0C,0x04,0x00,/*-- 文字: 为--*/0x00,0x00,0x00,0x80,0x80,0xB0,0xA0,0x80,0x80,0xC0,0xE0,0xB0,0x80,0x80,0x00,0x00,0x00,0x10,0x18,0x18,0x0C,0x04,0x02,0x01,0x13,0x36,0x34,0x30,0x1E,0x07,0x00,0x00,};uchar code num[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=8x16 --*/ /*-- 文字: 0 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*-- 文字: 1 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, /*-- 文字: 2 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, /*-- 文字: 3 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 4 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, /*-- 文字: 5 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 6 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 7 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, /*-- 文字: 8 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, /*-- 文字: 9 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, /*-- 文字: a --*/0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00, 0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20, /*-- 文字: b --*/0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00, 0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: c --*/0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00, 0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00, /*-- 文字: d --*/0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00, 0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00, /*-- 文字: e --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, 0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, /*-- 文字: f --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,/*-- 文字: x --*/0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,};uchar code dispunit[]={/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ /*-- 文字: b --*/0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: p --*/0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: s --*/0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,};uchar code hz13[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 发--*/0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0,0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B,0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00,/*-- 文字: 送--*/0x00,0x80,0xD0,0xB0,0xA0,0x80,0x80,0x70,0x40,0xC0,0x60,0x50,0x40,0x00,0x00,0x00,0x08,0x08,0x08,0x0C,0x0B,0x08,0x09,0x0D,0x1B,0x13,0x13,0x35,0x3D,0x30,0x10,0x08,/*-- 文字: 数--*/0x00,0x00,0x40,0xE0,0x40,0xF0,0xE0,0x70,0x00,0xF0,0x50,0xC0,0x40,0x40,0x00,0x00,0x00,0x02,0x13,0x16,0x1E,0x0B,0x16,0x13,0x11,0x0B,0x06,0x0F,0x18,0x18,0x10,0x00,/*-- 文字: 据--*/0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0xF0,0x60,0x50,0xD0,0x50,0x70,0x60,0x00,0x00,0x00,0x12,0x13,0x31,0x1F,0x11,0x0D,0x07,0x3D,0x15,0x17,0x15,0x3D,0x1D,0x03,0x00,};uchar code hz14[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 为--*/0x00,0x00,0x00,0x80,0x80,0xB0,0xA0,0x80,0x80,0xC0,0xE0,0xB0,0x80,0x80,0x00,0x00,0x13,0x36,0x34,0x30,0x1E,0x07,0x00,0x00,};/************************函数声明***********************/void chk_busy (void); //判断LCD工作状态void delay (uint us); //us延时函数void init_uart(void); //初始化串口程序void wr_lcd (uchar dat_comm,uchar content);//写数据或命令到LCDvoid init_lcd (void); //初始化LCD程序void lat_disp (uchar data1,uchar data2);//LCD写点阵程序void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar *chn);//写字符函数void change(void); //调整波特率显示码程序void change_dat(void); //调整接收到的数据为显示码程序void disp (void); //LCD显示程序void measure(void); //1bit数据发送时间测量程序void search(void); //查询发送数据波特率程序void init_T0 (void); //T0初始化程序void disp_dat(void); //数据显示程序/**********************主程序***********************/void main (){init_T0 (); //初始化T0init_lcd (); //初始化LCDmeasure (); //检测主机发送波特率init_uart(); //初始化串口disp(); //调用显示while (1){disp_dat(); //修改接收数据}}/***********************us延时函数**********************/void delay (uint us){while(us--);}/**********************T0初始化程序***********************/void init_T0 (void){TMOD=0x01; //工作方式1TH0=0x00; //初始化定时器内部寄存器TL0=0x00;}/***************1bit数据发送时间测量程序*************/void measure(void){while(RXD); //等待主机发送起始位0TR0=1; //启动定时器计时while(!RXD); //等待主机发送最高位1TR0=0; //定时器停止计时baud_set=TH0; //将1bit的发送时间存入baud_SET }/**********************初始化串口程序********************/void init_uart(void){SCON=0x50; //工作方式1,允许接收TMOD=TMOD|0x20; //T1为工作方式2TH1=255-baud_set; //设置T1TL1=255-baud_set;ES=1; //允许串行中断EA=1; //开总中断TR1=1; //启动定时器T1SBUF=0x0d; //向主机发送确认码}/********************判断LCD工作状态********************/void chk_busy (void){data_ora=0xff;rs=0; //命令标志rw=1; //读数据e=1;while(bf||res==1);e=0;}/*******************写数据或命令到LCD******************/void wr_lcd (uchar dat_comm,uchar content){chk_busy (); //查看LCD是否处于忙状态rs=dat_comm; //写入命令/数据rw=0; //写数据data_ora=content; //送命令/数据e=1;e=0;}/*********************初始化LCD程序********************/void init_lcd (void){delay(50);cs1=0;cs2=0;wr_lcd (comm,disp_off);wr_lcd (comm,disp_on); //开显示lat_disp(0x00,0x00); //清屏}/********************LCD写点阵程序*********************/void lat_disp (uchar data1,uchar data2){uchar i,j;cs1=0;cs2=0;wr_lcd (comm,disp_on);for(j=0;j<8;j++){wr_lcd (comm,disp_x+j); //设置页地址wr_lcd (comm,disp_z); //设置起始行wr_lcd (comm,disp_y); //设置列地址for(i=0;i<32;i++){wr_lcd (dat,data1);wr_lcd (dat,data2);}}}/**********************写字符函数**********************/void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar *chn) {uchar i,j,k,l,a;wr_lcd (comm,disp_on); //开显示for(l=0;l<row_xl;l++) //行数循环{for(k=0;k<row_yl;k++) //字数循环{for(j=0;j<xl;j++){wr_lcd (comm,disp_x+x+l*xl+j); //行数调整wr_lcd (comm,disp_z); //列数调整wr_lcd (comm,disp_y+y+k*yl); //字数调整a=l*xl*yl*row_yl+k*xl*yl+j*yl;for(i=0;i<yl;i++) //写数据wr_lcd (dat,chn[a+i]);}}}}/****************调整波特率显示码程序******************/void change(void){uchar temp,i,j,n=0;for(j=0;j<5;j++){temp=baud[j];if((j==0&baud[0]==0x00)|((j==1&baud[1]==0x00))){for(i=0;i<16;i++)dispnum[n++]=0x00;}else{for(i=0;i<16;i++)dispnum[n++]=num[i+temp*16];}}}/*************调整接收到的数据为显示码程序*************/void change_dat(void){uchar temp,i,j,n=0;r_dat[2]=uart_data/16; //将高四位存入r_dat[2]r_dat[3]=uart_data%16; //将低四位存入r_dat[3]for(j=0;j<4;j++){temp=r_dat[j];for(i=0;i<16;i++)dispnum[n++]=num[i+temp*16];//转换显示码}}/*********************LCD显示程序*********************/void disp (void){lat_disp(0x00,0x00); //清屏search(); //查询波特率显示码change(); //调整显示码cs1=0;cs2=1; //显示LCD屏幕左侧前三行信息chn_disp (0,0,2,16,1,4,hz11);chn_disp (2,24,2,8,1,5,dispnum);chn_disp (4,0,2,16,1,4,hz13);cs1=1;cs2=0; //显示LCD屏幕右侧前三行信息chn_disp (0,0,2,16,1,4,hz12);chn_disp (2,8,2,8,1,3,dispunit);chn_disp (4,0,2,16,1,1,hz14);}/*********************数据显示程序*********************/void disp_dat(void){change_dat(); //调整显示cs1=0;cs2=1;chn_disp (6,24,2,8,1,4,dispnum); //将接收到得数据显示在屏幕左侧第四行}/********************串口中断程序********************/void serial_TI(void) interrupt 4{if(RI==1){RI=0; //接收中断,清零RIuart_data=SBUF; //将接收数据存入temp,并将接收数据发送至上位机SBUF=uart_data;temp=uart_data;}else //发送中断,清零RITI=0;}/**************查询发送数据波特率程序***************/void search(void){uchar i;switch(baud_set){case 0x5f:for(i=0;i<5;i++)baud[i]=baudrate[0][i]; //波特率为300break;case 0x2f:for(i=0;i<5;i++)baud[i]=baudrate[1][i]; //波特率为600break;case 0x17:for(i=0;i<5;i++)baud[i]=baudrate[2][i]; //波特率为1200break;case 0x0b:for(i=0;i<5;i++)baud[i]=baudrate[3][i]; //波特率为2400break;case 0x05:for(i=0;i<5;i++)baud[i]=baudrate[4][i]; //波特率为4800break;case 0x02:for(i=0;i<5;i++)baud[i]=baudrate[5][i]; //波特率为9600break;case 0x01:for(i=0;i<5;i++)baud[i]=baudrate[6][i]; //波特率为14400break;default:for(i=0;i<5;i++)baud[i]=0x0e; //超出测量范围,显示EEEEE break;}}。