基于ATmega16单片机的USART串口通信测试程序

基于ATmega16单片机的USART串口通信测试程序
基于ATmega16单片机的USART串口通信测试程序

/***************************************************************************** 编译环境:ICC AVR。

文件名:基于ATmega16单片机的USART串口通信测试程序

功能:利用ATmega16的USART,从TXD异步串出数据,将TXD与RXD短接,从RXD输入,通过PC口

送到一个LED数码管显示,实现了自发自收的过程?

作者:赵国朋

班级:鹏程001

时间:2013年04月5日

修改:无

备住:一.硬件接口电路描述

1.晶振:8MHz

2.MCU的PC口与共阴极数码管相接

3.TXD与RXD相接

TXD --- RXD

/*****************************************************************************/ #include //包含单片机型号头文件

#include //包含"位操作"头文件

#define uchar unsigned char //宏定义

#define uint unsigned int

#define ulong unsigned long

#define BAUD 9600 //波特率采用9600b/s

#define CRYSTAL 8000000 //系统时钟为8MHz

//计算和定义波特率设置参数

#define BAUD_SETTING (uint)((ulong)CRYSTAL/(16*(ulong)BAUD)-1)

#define BAUD_H (uchar)(BAUD_SETTING>>8)

#define BAUD_L (uchar)(BAUD_SETTING)

//USART控制和状态寄存器的标志位定义

#define FRAMING_ERROR (1<

#define PARITY_ERROR (1<

#define DATA_OVERRUN (1<

#define DATA_REGISTER_EMPTY (1<

#pragma interrupt_handler USART_Rx_Isr:12 //USART接收中断服务

#pragma data:data

flash Duan_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F

/************ MCU初始化函数**************/

/****************************************************************************** 函数名:MCU_Init()

功能:MCU初始化

参数:无

返回值:无

/****************************************************************************** /

void MCU_Init()

{

PORTC=0X00;

DDRC=0XFF;

PORTD=0X03;

DDRD=0X02;

}

/************ USART初始化函数**************/

/****************************************************************************** 函数名:USART_Init()

功能:USART初始化

参数:无

返回值:无

/****************************************************************************** /

void USART_Init()

{

// DDRD=0X02;

//PORTD=0X03;

UCSRA=0X00;

UCSRB=(1<

//UCSRB=0X98;

UCSRC=(1<

//UCSRC=0X86

UBRRH=BAUD_H;

UBRRL=BAUD_L;

}

/************ USART中断服务函数**************/

/****************************************************************************** 函数名:USART_Rx_Isr()

功能:USART中断服务,将欲显示的数码送到I/O寄存器

参数:无

返回值:无

/****************************************************************************** /

void USART_Rx_Isr()

{

uchar status,data;

//DDRC=0XFF;

status=UCSRA;

data=UDR;

if((status&(FRAMING_ERROR|PARITY_ERROR|DATA_OVERRUN))==0)

PORTC=Duan_table[data];

}

/************ USART发送数据函数**************/

/****************************************************************************** 函数名:USART_Transmit()

功能:将要发送的数据送到USART缓冲区UDR中

参数:uchar data

返回值:无

/****************************************************************************** /

void USART_Transmit(uchar data)

while(!(UCSRA&DATA_REGISTER_EMPTY));

UDR=data;

}

/************ 延时函数**************/

/****************************************************************************** 函数名:Delay_Us()、Delay_Ms()

功能:微秒级、毫秒级延时

参数:Us --- 欲延时的us数

Ms --- 欲延时的ms数

返回值:无

/****************************************************************************** /

void Delay_Us(uint Us)

{

uint i;

Us=Us*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值

for( i=0;i

}

void Delay_Ms(uint Ms)

{

uint i,j;

for( i=0;i

for(j=0;j<1141;j++);//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值

}

/************ 主函数**************/

/****************************************************************************** 函数名:main()

功能:

参数:无

返回值:无

/****************************************************************************** /

void main()

uchar i=0;//定义变量

MCU_Init();

USART_Init();

SREG=BIT(7);//开全局中断

while(1)

{

for(i=0;i<16;i++)

{

USART_Transmit(i);

Delay_Ms(500);

}

}

}

个人总结的AVR的ATMEGA16L单片机程序

ATMAGE 16 的C语言程序

ATMAGE 16 的C语言程序 (1) 一、PB0 口的PB0.1 LED 发光管闪烁的程序: (3) 二、PA0、PB0、PC0口的LED 发光管闪烁的程序: (5) 三、I/O口的输入与输出 (6) 四、跑马灯 (8) 五、数码管计数显示设计 (10) 六、控制直流电机正反转 (16) 七、单片机的定时器(T/C0)应用 (20) AVR原理图 (24)

一、PB0 口的PB0.1 LED 发光管闪烁的程序: #include int main( void ) { unsigned char i, j, k,led=0; DDRB=0xFF; /* all outputs */ while (1) { if(led) PORTB|=0X01; /* |使最后一位为1 */

else PORTB&=0XFE; /*&最后一位为0 */ led=!led; //延时 for (i=0; i<255; i++) for(j=0; j<255;j++) k++; } } /////////////////////////////////////////////////////////////// #include int main( void ) { unsigned char i, j, k,led=0; DDRB=0xFF; /* all outputs */ while (1) { if(led) PORTB=0Xfe; else PORTB=0Xff; led=!led; for (i=0; i<255; i++) //延时 for(j=0; j<255;j++) k++; } }

ATMEGA16的USART串口发送与接收数据示例程序

//ATMEGA16的USART串口发送与接收数据示例程序,采取中断的方式 //发送200个FF,接收数据显示在数码管上,接收数据格式如09 //编译环境 ICCAVR //系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms //作者:David //日期:2013.10.20 //*********************************************************************** // 包含文件 //*********************************************************************** #include #include #include #include #include //中断信号头文件 //*********************************************************************** // 定义变量区 //*********************************************************************** #define CH451_RESET 0x0201 //复位 #define CH451_LEFTMOV 0x0300 //设置移动方式-左移#define CH451_LEFTCYC 0x0301 //设置移动方式-左循#define CH451_RIGHTMOV 0x0302 //设置移动方式-右移#define CH451_RIGHTCYC 0x0303 //设置移动方式-右循#define CH451_SYSOFF 0x0400 //关显示、键盘、看门狗 #define CH451_SYSON1 0x0401 //开显示 #define CH451_SYSON2 0x0403 //开显示、键盘 #define CH451_SYSON3 0x0407 //开显示、键盘、看门狗功能#define CH451_DSP 0x0500 //设置默认显示方式 #define CH451_BCD 0x058f //设置BCD译码方式 #define CH451_TWINKLE 0x0600 //设置闪烁控制 #define CH451_DIG0 0x0800 //数码管位0显示 #define CH451_DIG1 0x0900 //数码管位1显示 #define CH451_DIG2 0x0a00 //数码管位2显示 #define CH451_DIG3 0x0b00 //数码管位3显示 #define CH451_DIG4 0x0c00 //数码管位4显示 #define CH451_DIG5 0x0d00 //数码管位5显示 #define CH451_DIG6 0x0e00 //数码管位6显示 #define CH451_DIG7 0x0f00 //数码管位7显示 #define l ed0 0x0000 //数码管位0显示的数据0 #define l ed1 0x0001 //数码管位0显示的数据1 #define l ed2 0x0002 //数码管位0显示的数据2 #define l ed3 0x0003 //数码管位0显示的数据3 #define l ed4 0x0004 //数码管位0显示的数据4 #define l ed5 0x0005 //数码管位0显示的数据5

51单片机与PC机通信资料

《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:

目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:

基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

ATMega16单片机外部中断的使用

ATMega16单片机外部中断的使用[日期:2010-09-24 ] [来源:本站原创作者:佚名] [字体:大中小] (投递新闻) // Crystal: 7.3728Mhz ,功能:学习外部中断0的程序 #include #include #define LED_COM PORTA ^= (1 << PA6) // void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x04; DDRD = 0x00; } #pragma interrupt_handler int0_isr:2 void int0_isr(void)

LED_COM; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x00; GICR = 0x40; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void main() { init_devices(); while(1)

汇编语言实现串口通信(PC和单片机间)教学文案

8.用C语言或汇编语言实现串口通信(PC和单片机间) 上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示 1 硬件电路的设计 MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。所以单片机和PC机之间可以方便地进行串口通讯。单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。因此在通信距离较短时可采用零MODEM方式,简单三连线结构。IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51 机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。电路如图1所示。硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示: 2 系统软件设计 软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。现约定通信协议如下:PC机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS-232串口异步通信, 1上位PC机与下位单片机异步串行通信的通信协议

ATMEGA16读写iic(TWI)(24c02) C语言程序

ATMEGA16读写iic(24c02) C语言程序测试通过 #include #include "I2C.h" #include "1602.h" #include "delay.h" /*通过AVR往I IC写数据,并通过串口把数据读出显示出来*/ //=============================================================== void UART_init(void) //UART初始化 { DDRD = 0x02; PORTD = 0x00; UCSRA = 0x02; /*无倍速*/ UCSRB = 0x18; /*允许接收和发送*/ UC SRC = 0x06; /*8位数据,1位停止位,无校验*/ UBRRH = 0x00; UBRRL = 12; /*9600*/ } //=============================================================== void USART_TXD(float data) //发送采用查询方式 { while( !(UCSRA & BIT(UDRE)) ); UDR=data; while( !(UCSRA & BIT(TXC )) ); UCSRA|=BIT(TXC); } void main(void) { unsigned char i; //LCD_init(); uart_init();//TART初始化 SEI(); //全局中断使能

while(1) {/* I2C_Write('n',0x00); I2C_Write('c',0x01); I2C_Write('e',0x02); I2C_Write('p',0x03); I2C_Write('u',0x04); */ i=I2C_Read(0x00); //LCD_write_char(0,0,i); USART_TXD(i); i=I2C_Read(0x01); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x02); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x03); //LCD_write_data(i); USART_TXD(i); i=I2C_Read(0x04); //LCD_write_data(i); USART_TXD(i); } } /*上面上主函数部分*/ #include #include "delay.h" //I2C 状态定义 //MT 主方式传输 MR 主方式接受#define START 0x08 #define RE_START 0x10 #define MT_SLA_ACK 0x18 #define MT_SLA_NOACK 0x20 #define MT_DATA_ACK 0x28 #define MT_DATA_NOACK 0x30 #define MR_SLA_ACK 0x40 #define MR_SLA_NOACK 0x48 #define MR_DATA_ACK 0x50 #define MR_DATA_NOACK 0x58

第06章单片机串行通信系统习题解答

第6章单片机串行通信系统习题解答 一、填空题 1.在串行通信中,把每秒中传送的二进制数的位数叫波特率。 2.当SCON中的M0M1=10时,表示串口工作于方式 2 ,波特率为 fosc/32或fosc/64 。 3.SCON中的REN=1表示允许接收。 4.PCON 中的SMOD=1表示波特率翻倍。 5.SCON中的TI=1表示串行口发送中断请求。 6.MCS-51单片机串行通信时,先发送低位,后发送高位。 7.MCS-51单片机方式2串行通信时,一帧信息位数为 11 位。 8.设T1工作于定时方式2,作波特率发生器,时钟频率为,SMOD=0,波特率为时,T1的初值为 FAH 。 9.MCS-51单片机串行通信时,通常用指令 MOV SBUF,A 启动串行发送。 10.MCS-51单片机串行方式0通信时,数据从引脚发送/接收。 二、简答题 1.串行口设有几个控制寄存器它们的作用是什么 答:串行口设有2个控制寄存器,串行控制寄存器SCON和电源控制寄存器PCON。其中PCON中只有的SMOD与串行口的波特率有关。在SCON中各位的作用见下表: 2.MCS-51单片机串行口有几种工作方式各自的特点是什么 答:有4种工作方式。各自的特点为:

3.MCS-51单片机串行口各种工作方式的波特率如何设置,怎样计算定时器的初值 答:串行口各种工作方式的波特率设置: 工作方式O :波特率固定不变,它与系统的振荡频率fosc 的大小有关,其值为fosc/12。 工作方式1和方式3:波特率是可变的,波特率=(2SMOD/32)×定时器T1的溢出率 工作方式2:波特率有两种固定值。 当SM0D=1时,波特率=(2SM0D/64)×fosc=fosc/32 当SM0D=0时,波特率=(2SM0D/64)×fosc=fosc/64 计算定时器的初值计算: 4.若fosc = 6MHz ,波特率为2400波特,设SMOD =1,则定时/计数器T1的计数初值为多少并进行初始化编程。 答:根据公式 N=256-2SMOD ×fosc /(2400×32×12)= ≈243 =F3H TXDA: MOV TMOD,#20H ;置T1定时器工作方式2 MOV TL1,#0F3H ;置T1计数初值. MOV TH1,#0F3H B f B f N OSC SMOD OSC SMOD ??-=???-=384225612322256

ATMEGA16的IO端口

第九课A Tmega16(L)的IO端口 本教程节选自周兴华老师《手把手教你学A VR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买! ATmega16(L)单片机有32个通用I/O口,分为PA、PB、PC和PD四组,每组都是8位。这些I/O 口都可以通过各自的端口寄存器设置成输入和输出(即作为普通端口使用),有些I/O口还具有第二功能(我们在后面使用到这些第二功能时再介绍)。 ATmega16(L)单片机的I/O口在不考虑第二功能时,其基本输入输出功能都是相同的。如图7-1所示为ATmega16(L)单片机I/O口的结构图。每个端口对应3个寄存器,即方向寄存器DDRX(X=A、B、C、D)、端口寄存器PORTX(X=A、B、C、D)、输入引脚PINX(X=A、B、C、D),各个端口的工作状况都可以通过对DDRX、PORTX和PINX的操作来完成。所有的A VR单片机的I/O端口都具有读、写和修改功能。表7-1列出了A Tmega16(L)的I/O端口的组合控制设置。 ATmega16(L)单片机每一组I/O口的所有管脚都可以单独选择上拉电阻。引脚缓冲器可以吸收20mA 的电流,能够直接驱动LED显示。如果设置了弱上拉电阻,当管脚被拉低时,引脚会输出电流。1.DDRX DDRX为端口方向寄存器。当DDRX的某一位置1时相应引脚作为输出使用。反之,当DDRX的某一位置0时,对应的引脚单片机培训作为输入使用。 例如: DDRB=0xF0;//此语句将PB端口的PB0~PB3位设为输入,而PB4~PB7位设为输出。2.PORTX PORTX为端口数据寄存器。 如果引脚设为输出,则对PORTX进行写操作即改变引脚的输出值。

51单片机实现的485通讯程序

51单片机实现的485通讯程序 #ifndef __485_C__ #define __485_C__ #include #include #define unsigned char uchar #define unsigned int uint /* 通信命令*/ #define __ACTIVE_ 0x01 // 主机询问从机是否存在 #define __GETDATA_ 0x02 // 主机发送读设备请求 #define __OK_ 0x03 // 从机应答 #define __STATUS_ 0x04 // 从机发送设备状态信息 #define __MAXSIZE 0x08 // 缓冲区长度 #define __ERRLEN 12 // 任何通信帧长度超过12则表示出错uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号 sbit M_DE = P1^0; // 驱动器使能,1有效 sbit M_RE = P1^1; // 接收器使能,0有效

void get_status(); // 调用该函数获得设备状态信息,函数代码未给出 void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧 bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息 void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main() { uchar type; uchar len; /* 系统初始化*/ P1 = 0xff; // 读取本机设备号 dev = (P1>>2); TMOD = 0x20; // 定时器T1使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0x50; // 工作方式1,波特率9600bps,允许接收 ES = 0; // 关闭串口中断 IT0 = 0; // 外部中断0使用电平触发模式 EX0 = 1; // 开启外部中断0

ATMEGA16单片机实验

实验一软件和硬件的认识 一、实验目的: 1、掌握硬件原理。 2、初步掌握实验板的使用方法。 3、熟悉软件工作界面。 二、实验仪器:ATmage16实验板一块 PC机一台 三、实验内容及步骤: 1、插上电源,按下开关。观察批示灯是否点亮。 电源(可输入7~12V) ATmega16管脚图

2、由原理可知I/O口的批示灯为低电平亮,在实验板上取地与I/O口相接,观察是否点亮。 I/O口LED显示与接口 3、打开编程界面,点击各栏,认识各栏的用途。 A VRICC IDE 软件的工作界面 4、输入以下程序: #include int main(void) { DDRA = 0xff;/* all outputs */ DDRB = 0xff;/* all outputs */ DDRC = 0xff; /*all outputs */ DDRD = 0xff; /*all outputs */

PORTA = 0x00; /* 输出低电平*/ PORTB = 0x00; /* 输出低电平*/ PORTC = 0x00; /* 输出低电平*/ PORTD = 0x00; /* 输出低电平*/ while(1); } 观察I/O口的灯是否被点亮。 实验二I/O口的输入与输出 一、实验目的: 1、了解IO口的结构; 2、熟悉IO口的特性; 3、掌握IO口的控制。 二、实验仪器:ATmage16实验板一块 PC机一台 三、实验原理: 作为通用数字I/O 使用时,A VR 所有的I/O 端口都具有真正的读-修改-写功能。这意味着用SBI 或CBI 指令改变某些管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻) 时不会改变其他管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻)。输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。所有的端口引脚都具有与电压无关的上拉电阻。并有保护二极管与VCC 和地相连,如Figure23 所示。在控制I/O时,分别由方向寄存器DDRX与数据寄存器PORTX控制I/O的状态,如下表。 Figure 23. I/O 引脚等效原理图

51单片机usart通信程序(有CRC校验)

#include #include #include #define uchar unsigned char #define uint unsigned int //uchar const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar p[]={0x01,0x03,0x25,0x23,0x00,0x01}; /* CRC 高位字节值表*/ uchar const crchi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0/**/, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; /* CRC低位字节值表*/ uchar const crclo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06/**/, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

ATmega128串口通信程序(中断方式)

ATmega128串口通信程序(中断方式) 2011-06-05 20:08:10| 分类:单片机程序编写| 标签:|字号大中小订阅程序采用IAR系统编译,实现使用串口调试助手收发数据的功能 #include #include #include #define INT8U unsigned char #define INT16U unsigned int #define UDRIE0 5 /* UART Buffer Defines */ #define UART0_RX_BUFFER_SIZE 128 #define UART0_TX_BUFFER_SIZE 128 /* Static Variables */ static unsigned char UART0_RxBuf[UART0_RX_BUFFER_SIZE]; static volatile unsigned char UART0_RxHead; static volatile unsigned char UART0_RxTail; static unsigned char UART0_TxBuf[UART0_TX_BUFFER_SIZE]; static volatile unsigned char UART0_TxHead; static volatile unsigned char UART0_TxTail; static unsigned char UART0_Flag=1; void USART_INIT( void ) { UBRR0H = 0x00; UBRR0L = 0x0B;//9600 at 1.8432M UCSR0A = 0x20; UCSR0B = 0xD8;//开接收结束中断,发送结束中断接收使能,发送使能 UCSR0C = 0x06;//异步模式,1位停止位,8位数据位 UDR0 = 0x00;//清空数据寄存器 UART0_RxTail = 0; UART0_RxHead = 0; UART0_TxTail = 0; UART0_TxHead = 0; __disable_interrupt();//关全局中断 } void Tran_Byte( INT8U sdata ) { if(UART0_Flag == 0) { UDR0 = sdata;

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.360docs.net/doc/9618940510.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

【最新编排】基于51单片机的DHT11串口通讯

//****************************************************************// // DHT 使用范例 //单片机 AT89S5 或 STC89C5 RC // 功能 串口发送温湿度数据波特率 9600 //硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地 电源和地 单片机串口加MAX 3 连接电脑 // 公司 济南联诚创发科技有限公司 //****************************************************************// #include #include // typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U 6; /* defined for unsigned 6-bits integer variable 无符号 6位整型变量 */ typedef signed int S 6; /* defined for signed 6-bits integer variable 有符号 6位整型变量 */ typedef unsigned long U3 ; /* defined for unsigned 3 -bits integer variable 无符号3 位整型变量 */ typedef signed long S3 ; /* defined for signed 3 -bits integer variable 有符号3 位整型变量 */ typedef float F3 ; /* single precision floating point variable (3 bits) 单精度浮点数 3 位长度 */ typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数 64位长度 */ // #define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P _0 = P ^0 ; sbit P _ = P ^ ; sbit P _ = P ^ ; sbit P _3 = P ^3 ;

两个单片机之间的串行通信

两个单片机之间的串行通信 一、设计要求 在某个控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SBUF,然后经由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SBUF载入累加器,并输出至P1端口,点亮相应端口的LED。 二、实验所需元器件 三、电路原理图: 两个单片机之间的串行通信电路图

四、程序设计 这两个单片机均工作在半工状态,U1将P1端口的状态通过TXD发半空给U2,而U2接收U1的数据,然后控制P1端口的LED显示。因此,需编写两个不同的程序,其程序流程图如下所示:

五、C语言程序: U1的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char void send(uchar state) { SBUF=state; while(TI==0); TI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; TI=0; TR1=1; ES=1; } void main() { P1=0xff; SCON_init(); while(1) { send(P1); } } U2的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char uchar state; void receive() { while(RI==0) state=SBUF; RI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; RI=0; TR1=1; } void main() { SCON_init(); while(1) { receive(); P1=state; } } 六、调试与仿真:

ATMEGA16(L)的USART与PC机串行通信

本资料节选自手把手单片机系列教程,受版权保护,任何人不得肆意篡改发布,如需完整资料,请到周兴华培训中心官方网站查看,或者购买相关的手把手书籍 ATMEGA16(L)的USART与PC机串行通信 单片机与外界的信息交换可分为并行通信与串行通信两种。 并行通信是指一个数据的各位同时进行传送的通信方式。优点是传送速度快,但传输线较多,并且只适合距离较短的通信。 串行通信是指一个数据是逐位顺序进行传送的通信方式。其突出优点仅需单线就可进行通信,通信距离较远,缺点是传送的数据速率较低。 串行通信又有两种基本的通信方式:同步通信和异步通信。 10.1ATMEGA16(L)的异步串行收发器 AVR单片机的异步串行收发器(USART)是一个高度灵活的串行通讯设备,图10-1为 USAR 图10-1USART的方框图

USART主要分为三个部分:时钟发生器,发送器和接收器。控制寄存器由三个单元共享。时钟发生器包含同步逻辑,通过它将波特率发生器及为从机同步操作所使用的外部输入时钟同步起来。XCK(发送器时钟)引脚只用于同步传输模式。发送器包括一个写缓冲器,串行移位寄存器,奇偶发生器以及处理不同的帧格式所需的控制逻辑。写缓冲器可以保持连续发送数据而不会在数据帧之间引入延迟。由于接收器具有时钟和数据恢复单元,它是USART模块中最复杂的。恢复单元用于异步数据的接收。除了恢复单元,接收器还包括奇偶校验,控制逻辑,移位寄存器和一个两级接收缓冲器UDR。接收器支持与发送器相同的帧格式,而且可以检测帧错误,数据过速和奇偶校验错误。 10.2U S ART的主要特点 ATMEAG16(L)的USART特点如下: 1.全双工操作(独立的串行接收和发送寄存器) 2.异步或同步操作 3.主机或从机提供时钟的同步操作 4.高精度的波特率发生器 5.支持5、6、7、8或9个数据位和1个或2个停止位 6.硬件支持的奇偶校验操作 7.数据过速检测 8.帧错误检测 9.噪声滤波,包括错误的起始位检测,以及数字低通滤波器 10.三个独立的中断:发送结束中断,发送数据寄存器空中断,以及接收结束中断 11.多处理器通讯模式 12.倍速异步通讯模式 10.3时钟产生 10.3.1USART支持4种模式的时钟 时钟产生逻辑为发送器和接收器产生基础时钟。USART支持4种模式的时钟:正常的异步模式,倍速的异步模式,主机同步模式,以及从机同步模式。USART控制位UMSEL和状态寄存器C(UCSRC)用于选择异步模式和同步模式。倍速模式(只适用于异步模式)受控于UCSRA寄存器的U2X。使用同步模式(UMSEL=1)时,XCK的数据方向寄存器(DDR_XCK)决定时钟源是由内部产生(主机模式)还是由外部生产(从机模式)。仅在同步模式下XCK有效。图10-2为时钟产生逻辑的框图。

相关文档
最新文档