#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar flag, a, num, num1;
uchar bai = 0, shi = 0, ge = 0, dData = 0;
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delayms(uint xms);
void display(uchar, uchar, uchar);
void init();
void main()
{
init();
while(1)
{
if (flag == 1)
{
//flag手动清0,便于下次检测
flag = 0;
//封闭串口中止
ES = 0;
//将8位数据分化成百,十,个位
dData = a;
bai = dData / 100;
shi = dData % 100 / 10;
ge = dData % 10;
//num1计数,到达满255清0
num1++;
if (num1 == 255)
num1 = 0;
//发送字符(序号)
SBUF = num1;
//检测是否发送结束
while(!TI);
//TI手动清0
TI = 0;
//发送字符(上位机发送过来的数据)
SBUF = a;
//检测是否发送结束
while(!TI);
//TI手动清0
TI = 0;
//从头敞开串口中止
ES = 1;
}
display(bai, shi, ge);
}
}
void init()
{
//设置定时器1为作业方法2
TMOD = 0x20;
//波特率为2400bps,给计时器1初值
TH1 = 0xf4;
TL1 = 0xf4;
//发动定时器1
TR1 = 1;
//ET1 = 1; 这儿不需要敞开定时器1中止,由于定时器1作业在方法2,为8位主动重装方法,进入中止也无事可做
//设置串口作业方法1
//10位异步收发(8位数据), 波特率可变(由定时器溢出率操控)
SM0 = 0;
SM1 = 1;
//容许串口中止
REN = 1;
//敞开总中止
EA = 1;
//敞开串口中止
ES = 1;
}
void delayms(uint xms)
{
uint i, j;
for (i = xms; i > 0; i–)
for (j = 110; j > 0; j–)
;
}
void display(uchar bai, uchar shi, uchar ge)
{
dula = 1;
P0 = table[bai];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delayms(5);
dula = 1;
P0 = table[shi];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delayms(5);
dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfb;
wela = 0;
delayms(5);
}
void ser() interrupt 4
{
//RI为接纳中止标志位, 在方法0时, 当串行接纳第8位数据结束时, 或在其他方法, 串行接纳中止位的
//中心时, 由内部硬件使RI置1, 向CPU宣布中止请求, 也必须在中止服务程序中, 用软件将其清0,撤销
//此中止请求, 以便利下一次中止请求检测, 即这样才干发生下一次中止.
//这儿RI清0, 由于程序已然发生了串口中止, 肯定是收到或发送了数据, 在开始时没有发送任何数据
//那必定是收到了数据, 此刻RI会被硬件置1, 所以进入串口中止服务程序后必须由软件清0, 这样才干
//发生下一次中止.
if (RI)
{
RI = 0;
//将SBUF中的数据读走给a, 这是此中止服务程序最重要的意图
a = SBUF;
//将标志位flag置1, 以便利在主程序中查询判别是否现已收到数据
flag = 1;
}
}
三. 程序小结
1. 由于SBUF中每次只能存储8位字节数据, 所以该程序每次只能发送8位字节数据.
2. 当以十六进制发送FF时, 单片机接纳上位机发送的数据后, 会将FF当成一个8位字节数据发送给上位机,
3. 程序缺点
有哪位长辈能够点拨一下, 鄙人先谢过了.