#include <reg52.h>
char code MESSAGE[]= "请输入一行字符串";
unsigned char a,i;
unsigned char markde=0;
unsigned int ReData,SenData;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table3[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位选编码
void delay(unsigned int i); //函数声明
void init();
void display();
void main (void) //主函数查询用以由单片机发送到上位机字符并且显示在上位机的接收区
{
init();
while(MESSAGE[a] != '\0')
{
SBUF = MESSAGE[a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
//单片机自动将 MESSAGE[a]里的字符发送到上位机
while(!TI); // 等特数据完毕 (TI发送中断标志)
TI = 0; // 清除数据传送标志
a++; // 下一个字符
}
while(1)
{ a=0;
//display(); //数码管前三位以十进制显示数据,最后二位以十六进制显示数据
if (markde==1) //说明程序已经执行过串口中断服务程序
{ markde=0; //清除标志
SBUF=SenData; //单片机将接收到的数据发送给上位机 并且显示在上位机的接收区
while(TI==0);
TI=0; // 清除数据传送标志
}
}
}
void ser_int (void) interrupt 4 //中断接收上位机发送的字符
{
if(RI == 1) //进入中断则说明收到了数据RI被硬件置1
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器。单片机会自动串口接收寄存器中的数据取走给SenData
SenData=ReData;
P2=~SenData;//将数据以二进制形式显示在P2口
markde=1; //如果接收到数据 标志位=1,以方便在主程序中查询判断是否已经收到数据
}
}
/**************************************************
延时处理程序
**************************************************/
void delay(unsigned int k)
{
unsigned int m,n;
for(m=k;m>0;m--)
for(n=110;n>0;n--);
}
void init()
{
SCON = 0x50; //REN=1允许串行接收,串口工作模式2
TMOD= 0x20; //定时器1工作方式2 8位初值自动重装的8位定时器/计数器
PCON= 0x80; //SMOD=0波特率提高一倍 SMOD=0波特率正常
TL1 = 0xfd;
TH1 = 0xfd; /* 波特率9600、数据位8、停止位1。效验位无 (12M晶振)
在这里,TL1与TH1中装的初值必须是一样的,因为每次计数溢出后TL1中装入的新值是从TH1中
取出的。初值的计算方法:假设所求的初值是N,如果单片机
的晶振为12M,一个机器周期等于12
个时钟周期,所以计数一次的时间12/12M=1us,定时器每计数(256-N)次溢出一次,那么定时器
溢出一次的时间为(256-N)*1us,则T1的溢出率就是它的倒数。串口方式1的波特率=2的SMOD次
方/32*T1的溢出率,如果SMOD=0,9600=1/32/((256-N)*1us)得N=253,它的十六进制是0xFD 但
是如果SMOD=1, 9600=2/32/((256-N)*1us)得N=250,可见再不变化N的情况下SMOD由0变为1,
波特率便增加一倍。*/
TR1 = 1; //开启定时器1
ES = 1; //开串口中断
EA = 1; // 开总中断
}
void display()
{
P1=0xfe;
P0=table[SenData%16];
delay(4);
P1=0xfd;
字符串长度怎么算在线
P0=table[SenData/16];
delay(4);
P1=0x7f;
P0=table[SenData/100];
delay(4);
P1=0xbf;
P0=table[SenData%100/10];
delay(4);
P1=0xdf;
P0=table[SenData%10];
delay(4);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论