#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7; //位定义数码管位选锁存器接口
sbit du = P2^6; //位定义数码管位选锁存器接口
uchar num1;
uchar i;//数码管显示位选变量
uchar num[] = {0, 0, 0, 0}; //百十个位,总数暂存数组
//数码管0~9段选表
uchar code leddata[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
//数码管1~3位选表
uchar code DPY[]={0xfe, 0xfd, 0xfb};
//中断服务特殊功能寄存器配置
void time0init()
{
TMOD |= 0x21; //定时器16为计数工作模式
TH0 =0xED;
TL0 =0xFF; //5ms
ET0 = 1; //开定时器0中断
TR0 = 1;//启动定时器0
EA = 1; //开总中断
}
//串口初始化
void UARTInit()
{
EA = 1 ; //打开总中断
ES = 1 ; //打开串口中断
SM0 = 0 ; SM1 = 1 ;//串口工作方式1,8位UART波特率可变
REN = 1 ; //串口允许接收
TR1 = 1 ; //启动定时器1
TMOD |= 0x21 ; //定时器1工作模式2,8位自动重装。用|=或等于,最终TMOD的值会等于上面的TMO和下面的相加,也就是TMOD = 0x21
TH1 = 0xfd ;
TL1 = 0xfd ;//设置波特率9600
}
//定时器0中断服务程序 做数码管动态扫描,不用软件延时
void timer0() interrupt 1
{
TH0 =0xED;
TL0 =0xFF; //5ms 模式1非自动重装需要手动重装
if(i < 3)
{
num[0] = num[3] / 100; //计算百位
num[1] = num[3] % 100 / 10; //计算十位
num[2] = num[3] % 10;//计算个位
P0 = 0xff; //清除断码
we = 1;//打开位选
P0 = DPY[ i];
we = 0; //关闭位选
P0 = 0xff; //清除断码
du = 1; //打开段选
P0 = leddata[num[ i]];
du = 0; //关闭段选
i++;//显示下一位
}
else
{
i = 0;
}
}
void UART () interrupt 4
{
if(RI)
{
num[3] = SBUF ; //把接收到的数据传给num3
RI = 0 ;//软件清零接收标志位
}
}
void main()
{
time0init();//初始化定时器0
UARTlnit();
while(1) ;
}
main.c(99): warning C206: 'UARTlnit': missing function-prototype
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
求大佬指点ww
|