講的比較仔細,初學者有可能說教程單片機比較老了.我們學習的是思路.
國產的51單片機 增強型51比較多些. 模塊功能的寄存器稍作修改就可以.
例如:賽元的SC92F8003
/*
*****************************************************
* 文件名: main.c
* 備注: 主函數
* 測試功能 :C語言學習程序 P15發送數據
UART0 串口發送數據后,占小部分data,其它IO資源釋放
//--sc92f8003.h--
//P1PH |= 0x20; // P15 上拉使能(測試上拉可用可不用)
SCON |= 0x50; //模式1 10位全雙工;允許接收
tmp = 16000000L / 9600; //
//--使用定時器1--
//T2CON &= 0xCF; //選擇定時器1(默認)
TH1 = (u8)(tmp >> 8); //定時器1計數器的 高8位
TL1 = (u8) tmp; // //定時器1計數器的 低8位
//IPUART = 1; // 串口高優先級 使能
//EA = 1; //使能總中斷
//EUART = 0; //串口中斷 使能
//TI = 0;
//--注銷部分開始---
* 測試功能:UART0串口功能 IO輸入(P17 P00 P01) 輸出(P12 P13 P14)
* 功能說明:
* 硬件資源:
//芯片設置內部時鐘 16MHZ ,看門狗除能 低電壓2.9V 復位腳做 P17IO
// sbit LED1 = P1^2; // LED口
// sbit LED2 = P1^3; //
// sbit LED3 = P1^4; //
// sbit KEY_INPUT1 = P1^7; // 按鍵口
// sbit KEY_INPUT2 = P0^0; //
// sbit KEY_INPUT3 = P0^1; //
// UART0 串口
// ConfigUART0(0,9600); //-串口配置參數-引腳 P15(TX0) P16(RX0)
// // ConfigUART0(1,9600); //串口配置參數-引腳 P20(TX0A) P11(RX0A)
//--注銷部分結束---
*
*****************************************************
*/
//#include "REG52.H"
#include "sc92f8003.h"
void View(unsigned long u32ViewData);
void to_BufferData(unsigned long u32Data,unsigned char *pu8Buffer,unsigned char u8Type);
void SendString(unsigned char *pu8String);
/*---C語言學習區域的開始。-----------------------------------------------*/
void main() //主函數
{
unsigned char a; //定義一個變量 a。
unsigned int b; //定義一個變量 b。
unsigned long c; //定義一個變量 c。
a=100; //給變量 a 賦值。
b=10000; //給變量 b 賦值。
c=1000000000; //給變量 c 賦值。
View(a); //在電腦串口端查看第 1個數 a。
View(b); //在電腦串口端查看第 2個數 b。
View(c); //在電腦串口端查看第 3個數 c。
while(1)
{
}
}
/*---C語言學習區域的結束。-----------------------------------------------*/
void View(unsigned long u32ViewData)
{
static unsigned char Su8ViewBuffer[43];
code unsigned char Cu8_0D_0A[]={0x0d,0x0a,0x00};
code unsigned char Cu8Start[]={"開始..."};
static unsigned char Su8FirstFlag=0;
static unsigned int Su16FirstDelay;
if(0==Su8FirstFlag)
{
Su8FirstFlag=1;
for(Su16FirstDelay=0;Su16FirstDelay<10000;Su16FirstDelay++);
SendString(Cu8Start);
SendString(Cu8_0D_0A);
SendString(Cu8_0D_0A);
}
to_BufferData(u32ViewData,Su8ViewBuffer,1);
SendString(Su8ViewBuffer);
to_BufferData(u32ViewData,Su8ViewBuffer,2);
SendString(Su8ViewBuffer);
to_BufferData(u32ViewData,Su8ViewBuffer,3);
SendString(Su8ViewBuffer);
to_BufferData(u32ViewData,Su8ViewBuffer,4);
SendString(Su8ViewBuffer);
SendString(Cu8_0D_0A);
}
void to_BufferData(unsigned long u32Data,unsigned char *pu8Buffer,unsigned char u8Type)
{
code unsigned char Cu8Array1[]={0xB5,0xDA,0x4E,0xB8,0xF6,0xCA,0xFD,0x00};
code unsigned char Cu8Array2[]="十進制:";
code unsigned char Cu8Array3[]="十六進制:";
code unsigned char Cu8Array4[]="二進制:";
static unsigned char Su8SerialNumber=1;
static unsigned int Su16BufferCnt;
static unsigned int Su16TempCnt;
static unsigned int Su16TempSet;
static unsigned long Su32Temp1;
static unsigned long Su32Temp2;
static unsigned long Su32Temp3;
static unsigned char Su8ViewFlag;
if(1==u8Type)
{
for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++)
{
pu8Buffer[Su16BufferCnt]=Cu8Array1[Su16BufferCnt];
}
pu8Buffer[2]=Su8SerialNumber+'0';
pu8Buffer[Su16BufferCnt]=0x0d;
pu8Buffer[Su16BufferCnt+1]=0x0a;
pu8Buffer[Su16BufferCnt+2]=0;
Su8SerialNumber++;
return;
}
else if(2==u8Type)
{
for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++)
{
pu8Buffer[Su16BufferCnt]=Cu8Array2[Su16BufferCnt];
}
Su32Temp1=1000000000;
Su32Temp2=10;
Su16TempSet=10;
}
else if(3==u8Type)
{
for(Su16BufferCnt=0;Su16BufferCnt<9;Su16BufferCnt++)
{
pu8Buffer[Su16BufferCnt]=Cu8Array3[Su16BufferCnt];
}
Su32Temp1=0x10000000;
Su32Temp2=0x00000010;
Su16TempSet=8;
}
else
{
for(Su16BufferCnt=0;Su16BufferCnt<7;Su16BufferCnt++)
{
pu8Buffer[Su16BufferCnt]=Cu8Array4[Su16BufferCnt];
}
Su32Temp1=0x80000000;
Su32Temp2=0x00000002;
Su16TempSet=32;
}
Su8ViewFlag=0;
for(Su16TempCnt=0;Su16TempCnt<Su16TempSet;Su16TempCnt++)
{
Su32Temp3=u32Data/Su32Temp1%Su32Temp2;
if(Su32Temp3<10)
{
pu8Buffer[Su16BufferCnt]=Su32Temp3+'0';
}
else
{
pu8Buffer[Su16BufferCnt]=Su32Temp3-10+'A';
}
if(0==u32Data)
{
Su16BufferCnt++;
break;
}
else if(0==Su8ViewFlag)
{
if('0'!=pu8Buffer[Su16BufferCnt])
{
Su8ViewFlag=1;
Su16BufferCnt++;
}
}
else
{
Su16BufferCnt++;
}
Su32Temp1=Su32Temp1/Su32Temp2;
}
pu8Buffer[Su16BufferCnt]=0x0d;
pu8Buffer[Su16BufferCnt+1]=0x0a;
pu8Buffer[Su16BufferCnt+2]=0;
}
void SendString(unsigned char *pu8String)
{
static unsigned int Su16SendCnt;
static unsigned int Su16Delay;
u32 tmp; //
//-REG52.H-
//SCON=0x50;
//TMOD=0X21;
//TH1=TL1=256-(11059200L/12/32/9600);
//TR1=1; //sc92f8003 芯片 不能開啟
//ES = 0;
//TI = 0;
//--sc92f8003.h--
//P1PH |= 0x20; // P15 上拉使能(測試上拉可用可不用)
SCON |= 0x50; //模式1 10位全雙工;允許接收
tmp = 16000000L / 9600; //
//--使用定時器1--
//T2CON &= 0xCF; //選擇定時器1(默認)
TH1 = (u8)(tmp >> 8); //定時器1計數器的 高8位
TL1 = (u8) tmp; // //定時器1計數器的 低8位
//IPUART = 1; // 串口高優先級 使能
//EA = 0; //使能總中斷
EUART = 0; //串口中斷 使能
TI = 0;
for(Su16SendCnt=0;Su16SendCnt<43;Su16SendCnt++)
{
if(0==pu8String[Su16SendCnt])
{
break;
}
else
{
SBUF =pu8String[Su16SendCnt];
//for(Su16Delay=0;Su16Delay<800;Su16Delay++);//-REG52.H-延時
for(Su16Delay=0;Su16Delay<2400;Su16Delay++);//-sc92f8003.h-延時
TI = 0;
}
}
}
|