讲的比较仔细,初学者有可能说教程单片机比较老了.我们学习的是思路.
国产的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;
}
}
}
|