资讯详情

串口通信-数据发送到PC加1后接收到单片机在数码管上显示

本程序的完整原理图下载:http://www.51hei.com/f/ks51.pdf /** *功能:串口通信-数据发送到PC加一后接收到单片机在上显示 *时间:2014年3月2日10:04:07 *作者:寒竹子 *备注:波特率:19200bps *总结:串口通信时需要发送和接收数据时可以用到串口中断,在中断中进行数据的发送和接收, * 数码管显示时必须要放在while (1)中,只有这样才可以正常显示数字! **/

#include <reg52.h>

typedef unsigned int uint; typedef unsigned char uchar;

//数码管段选和位选声明 sbit WELA = P2^7; sbit DULA = P2^6;

//数码管编码 uchar code table[] = { 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F //"9" }; uint num = 254;

void UART_init(); void UART_init(); void display(uint num);

int main(void) { UART_init(); WELA = 1; P0 = 0xFF; WELA = 0; DULA = 1; P0 = 0x00; DULA = 0;

while (1)//等待串口发送和接收数据中断 { //在数码管上显示 display(num);//数码管显示是动态显示的,所以必须要放在while (1)循环中,这样才可以动态显示! P1 = num; }

return 0; }

//串口通信初始化(定时器T1初始化和串口通信方式的选择) void UART_init() { //设定T1定时器工作方式2,八位自动重装,用于设定串口通信波特率 TMOD = 0x20;//T1: G C/!T 0 0 M1 M0:10 T0:0000 //设定波特率19200bps 初值 X = 2^8 - 11059200 / 19200 / 12 /32; X = 254.5 0xFE TH1 = = 0xFE; TR1 = 1;//打开定时器T1 SC = 0x50;//设定串口通信方式1,八位异步传输波特率可设定 /* SM0 = 0; SM1 = 1;//方式1 REN = 1;//允许接收 */ //因为要进行发送和接收,需要用到串口中断 EA = 1;//开总中断 ES = 1;//开定时器T1中断 }

//延时xms void delayms(uint xms) { uint i, j;

for (i = 0; i < xms; i++) for (j = 0; j < 110; j++); }

//数码管显示 void display(uint num) { //将num分解 uchar bai, shi, ge;

bai = num / 100 % 10; shi = num / 10 % 10; ge = num % 10;

//先段选后位选 DULA = 1;//打开段选 P0 = table[ge];//送入个位 DULA = 0;//关闭段选存器 P0 = 0xFF;//先关闭所有数码管的显示,避免乱码 WELA = 1;//打开位选锁存器 P0 = 0xDF;//1101 1111 WELA = 0;//关闭位选锁存器 //延时3毫秒 delayms(3); P0 = 0x00;//消影

//十位 DULA = 1; P0 = table[shi]; DULA = 0; P0 = 0xFF; WELA = 1; P0 = 0xEF; //1110 1111 WELA = 0; delayms(3); P0 = 0x00;

//百位 DULA = 1; P0 = table[bai]; DULA = 0; P0 = 0xFF;//关闭所有数码管,避免段选数据的影响 WELA = 1; P0 = 0xF7; //1111 0111 WELA = 0; delayms(3); P0 = 0x00;//消影 }

//串口通信中断 void UART_sendAndReceive_int() interrupt 4//串口中断号4 { //判断发送和接收的完成 if ()//硬件置位,发送数据完成 { TI = 0;//TI清零,等待发送下一位数据 //允许接收数据 REN = 1; } //接收 if (RI)//接收完成 { RI = 0;//RI清零,等待接收下一位数据 //取出SBUF中的数据 num = SBUF; //num++ num++; //禁止接收数据 REN = 0; SBUF = num;//发送num } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台