#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
|