1、接收数据#include<reg52.h>#define Data_d P0#define Data_w P2#define uint unsigned int#define uchar unsigned charunsigned char flag;unsigned char Duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};// 显示段码值01234567code const unsigned char Weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码/*------------------------------------------------延时子程序------------------------------------------------*/void delayms(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}///*------------------------------------------------// 定时器初始化子程序//------------------------------------------------*///void Init_Timer0(void)//{// TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响// //TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出// //TL0=0x00;// EA=1; //总中断打开// ET0=1; //定时器中断打开// TR0=1; //定时器开关打开//}/*-----------------------------------------------串口初始化------------------------------------------------*/void serial_init(void){SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收REN=1,SM0=0,SM1=1 */TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ES = 1; /*打开串口中断*/}void Display(uchar FirstBit,uchar Num){uchar i;for(i=0;i<Num;i++){Data_d=0; //清空数据,防止有交替重影// dula=1; //段锁存//dula=0;Data_w=Weima[i+FirstBit]; //取位码// wela=1; //位锁存// wela=0;Data_d=Duanma[i]; //取显示数据,段码// dula=1; //段锁存// dula=0;}}void display(void){unsigned char s_flag;if(flag!=0xff){delayms(5);if(flag!=0xff){s_flag=flag;switch(s_flag){case 0x00:Display(0,1);break;case 0x01:Display(0,2);break;case 0x02:Display(0,3);break;case 0x03:Display(0,4);break;case 0x04:Display(0,5);break;case 0x05:Display(0,6);break;case 0x06:Display(0,7);break;case 0x07:Display(0,8);break;default:break;}}}// return(0);}/******************************************************************//* 主函数*//******************************************************************/void main (void){serial_init();while (1) /*主循环不做任何动作*/{}}/******************************************************************//* 串口中断程序*//******************************************************************/void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值flag=SBUF;flag=flag&0xff;display();//P1=Temp; //把值输出到P1口,用于观察SBUF=Temp; //把接收到的值再发回电脑端}if(TI) //如果是发送标志位,清零TI=0;}///*------------------------------------------------// 定时器中断子程序//------------------------------------------------*///void Timer0_isr(void) interrupt 1 using 1//{// TH0=(65536-10)/256; //重新赋值12M晶振计算,指令周期1uS,0.01MS,定时扫描// TL0=(65536-10)*256;// flag=KeyPort&0xff;//}2、发送数据/*-----------------------------------------------名称:串口通信网站:编写:shifang日期:2009.5修改:无内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源打开串口调试程序,将波特率设置为9600,无奇偶校验晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,设置正确后接受框可以看到UART test,技术论坛: thank you!------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include"delay.h"#define uint unsigned int#define uchar unsigned char#define Data_d P0#define Data_w P2#define KeyPort P1unsigned char code Duanma[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x 8e};// 显示段码值0~9unsigned char code Weima[]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08};//分别对应相应的数码管点亮,即位码//unsigned char Tempdata[8]; //存储显示值的全局变量sbit wela=P3^7;sbit dula=P3^6;/*------------------------------------------------函数声明------------------------------------------------*/void SendStr(unsigned char *s);void SendByte(unsigned char dat);/*------------------------------------------------串口初始化------------------------------------------------*/void InitUART (void){SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装TH1 = 0xFD; // TH1: 重装值9600 波特率晶振11.0592MHz TR1 = 1; // TR1: timer 1 打开EA = 1; //打开总中断//ES = 1; //打开串口中断}void Display(uchar FirstBit,uchar Num){uchar i;for(i=0;i<Num;i++){Data_d=0; //清空数据,防止有交替重影dula=1; //段锁存dula=0;Data_w=Weima[i+FirstBit]; //取位码wela=1; //位锁存wela=0;Data_d=Duanma[i]; //取显示数据,段码dula=1; //段锁存dula=0;}}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/unsigned char Keyscan(void){unsigned char keyvalue;if(KeyPort!=0xff){DelayMs(5);if(KeyPort!=0xff){keyvalue=KeyPort;while(KeyPort!=0xff);switch(keyvalue){case 0xfe:SendByte(0);Display(0,1);;break;case 0xfd:SendByte(1);Display(0,2);;break;case 0xfb:SendByte(2);Display(0,3);;break;case 0xf7:SendByte(3);Display(0,4);;break;case 0xef:SendByte(4);Display(0,5);;break;case 0xdf:SendByte(5);Display(0,6);;break;case 0xbf:SendByte(6);Display(0,7);;break;case 0x7f:SendByte(7);Display(0,8);;break;default:break;}}}return(0);}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------主函数------------------------------------------------*/void main (void){InitUART();Init_Timer0();while (1){Keyscan();// DelayMs(240);//延时循环发送// DelayMs(240);}}/*------------------------------------------------发送一个字节------------------------------------------------*/void SendByte(unsigned char dat){SBUF = dat;while(!TI);TI = 0;}/*------------------------------------------------发送一个字符串------------------------------------------------*/void SendStr(unsigned char *s){while(*s!='\0')// \0 表示字符串结束标志,//通过检测是否字符串末尾{SendByte(*s);s++;}}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1 using 1{TH0=(65536-10)/256; //重新赋值12M晶振计算,指令周期1uS,0.01MS TL0=(65536-10)*256;KeyPort=KeyPort&0xff;}#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245); }}。