/* 串口发送端(还需要接受端) 程序说明:每按一下按钮,P2.0端口的LED闪烁一次,数码管加一,当加到 9时,再按一下就重复为零 知识点:外部中断1 定时器1 寄存器:中断允许寄存器IE,定时器控制寄存器TCON,定时器方式寄存器TMOD,串口控制寄存器SCON */ #include<reg52.h> unsigned int i,j; int duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//在数码管显示的0~9数字的十六进制代码 /* //步骤一:串口配置 //步骤二:波特率配置 //步骤三:写数据 */ sbit LED = P2^0;//端口位声明 void main()//主函数 { LED = 0; EX1 = 1;//外部中断1分开关 IT1 = 1;//触发方式:下降沿 PX1 = 1;//设置为高优先级 //步骤一:波特率配置,由定时器1的益处率决定 TMOD = 0x20;//0010 0000 = 0x20,定时器1设置为工作方式2,8位自动装载的定时器 TH1 = 0xF4;//初值 TL1 = 0xF4;//波特率4800 ET1 = 1;//定时器1允许分开关 TR1 = 1;//启动定时器 //设置串口工作方式 SCON = 0x50;//等同于TMOD,方式一,允许接收 0101 0000 //PCON = 0x00; //TI = 0;发送中断标志位 //RI = 0;接收中断标志位 ES = 1;//IE寄存器第四位,串口中断允许位 EA = 1;//外部中断总开关 while(1); } void button() interrupt 2 //2为中断号, { //当发生中断时LED灯从灭到亮 LED = ~LED;//中断一次 for(j=0;j<33000;j++);//延时,让亮一段时间 LED = ~LED;//再灭 i++; SBUF = duan[i];//依次把数组的数字送到SBUF if(i == 9)//判断,i=9时就回到0,依次循环 i = 0; /* 这些是每中断一次就让数码管从0到9展现 for(i=0;i<=9;i++) { SBUF = duan[i];//把数据发送到串口 for(j=0;j<30000;j++); } */ }
#include <reg52.h> #define OUT P1//把串口接收的数据发送到P1端口 /* //步骤一:串口配置 //步骤二:波特率配置 //步骤三:写数据 */ void main() { //步骤一:波特率配置,由定时器1的益处率决定 TMOD = 0x20;//0010 0000 = 0x20,定时器1设置为工作方式2,8位自动装载的定时器 TH1 = 0xF4;//初值 TL1 = 0xF4;//波特率4800 ET1 = 1;//定时器1允许分开关 TR1 = 1;//启动定时器 //设置串口工作方式 SCON = 0x50;//等同于TMOD,方式一,允许接收 0101 0000 PCON = 0x00; TI = 0;//发送中断标志位,在方式0中,当串口发送完8位数据时,由硬件配置1,表明发送中断有请求;注意:该位必须由软件来清0 RI = 0;//接收中断标志位,同上 ES = 1;//IE寄存器第四位,串口中断允许位 EA = 1;//外部中断总开关 while(1); } void receive() interrupt 4 //4是串口中断号 { EA = 0;//关闭中断总开关,防止有其他中断发生进来 OUT = SBUF;//把串口接收的数据发送到P1端口 RI = 0;//RI是接受中断标志位,执行中断后要自动清0 EA = 1; }