📄 mcs51-项目开发经典.c
字号:
//数据长度为16BIT
//前导选择为MSB first(即高位MSB先进、先出)
//极性选择为unipolar
uchar code ad_chunnel_select[]={0x0C,0x1C,0x2C,0x3C,0x4C,0x5C,0x6C,0x7C,0x8C,0x9C,0xAC};
//-------------------------------------------------------------------------------------------------
//TLC2543操作的关键是:将16位状态及通道选择设置数据的每一位送入的同时,
//AD转换的结果数据的每一位同时输出,这一操作结束后该通道的下一次转换自动开始。
//一个隐含的问题必须注意,在TLC2543芯片通电后每个通道第一次获得的AD数据无意义。
uint ad2543_measure(uchar chunnel_select)//chunnel_select = 0 to 10
{ uint din;
uchar dout, i;
din=0;
dout=ad_chunnel_select[chunnel_select];//选择控制命令
while(EOC_2543==0);
CLK_2543=0;
CS_2543=0;
for(i=0;i<16;i++)
{if(dout&0x80) DIN_2543=1;//控制命令从MSB-LSB,向AD发数
else DIN_2543=0;
CLK_2543=1;
dout<<=1 ;
din<<=1 ;
if(DOUT_2543==1) din|=0x0001;//接收AD数据,从MSB-LSB
CLK_2543=0;
}
CS_2543=1;
return (din>>4); //因为是12位精度,而AD数据的MSB却在uint型变量din的最高位,所以右移4位
}
//=================================================================================================
// 串口UART操作相关程序
//=================================================================================================
//函数功能:串口发射1个字节
void uart_byte_out(uchar uart_data_out)
{ SBUF = uart_data_out;
while(TI==0);
TI=0;
}
//-------------------------------------------------------------------------------------------------
//函数功能:串口发射字符数组。通常将要发送的字符数组定义在CODE代码区。
void uart_string_out(char * char_array)
{ uchar i;
for(i=0; i<strlen(char_array) ;i++)
{
uart_byte_out(char_array[i]);
}
}
//-------------------------------------------------------------------------------------------------
//函数功能:串口输出数据十进制到PC机屏幕上
//形参:范围 0-65535 ;例如:data_to_out=12345(或0x3039),则计算机屏幕就显示12345
void uart_data_decimalist_out(uint data_to_out)
{ bit entrance;
uchar ge,shi,bai,qian,wan;
wan = (data_to_out/10000) ;//拆分万位,并转化为ASKII码
qian = (data_to_out%10000)/1000;//拆分千位,并转化为ASKII码
bai = (data_to_out%1000)/100 ;//拆分百位,并转化为ASKII码
shi = (data_to_out%100)/10 ;//拆分十位,并转化为ASKII码
ge = (data_to_out%10) ;//拆分个位,并转化为ASKII码
entrance=1;//开放个、十、百、千、万的判断传输入口
if(wan && entrance)
{uart_byte_out(change_hex_to_askii(wan));
uart_byte_out(change_hex_to_askii(qian));
uart_byte_out(change_hex_to_askii(bai));
uart_byte_out(change_hex_to_askii(shi));
uart_byte_out(change_hex_to_askii(ge));
entrance=0;//如果万位不为0,则不再判断其它位
}
else if(qian && entrance)
{uart_byte_out(change_hex_to_askii(qian));
uart_byte_out(change_hex_to_askii(bai));
uart_byte_out(change_hex_to_askii(shi));
uart_byte_out(change_hex_to_askii(ge));
entrance=0;//如果千位不为0,则不再判断其它位
}
else if(bai && entrance)
{uart_byte_out(change_hex_to_askii(bai));
uart_byte_out(change_hex_to_askii(shi));
uart_byte_out(change_hex_to_askii(ge));
entrance=0;//如果百位不为0,则不再判断其它位
}
else if(shi && entrance)
{uart_byte_out(change_hex_to_askii(shi));
uart_byte_out(change_hex_to_askii(ge));
entrance=0;//如果十位不为0,则不再判断其它位
}
else
{uart_byte_out(change_hex_to_askii(ge));
}
}
//-------------------------------------------------------------------------------------------------
// 函数功能:串口显示的回车换行
// 形参:newline_number 表示一共换几行
void uart_newline(uchar newline_number)
{ uchar i;
for(i=0;i<newline_number;i++)
{
uart_byte_out(0x0d);
uart_byte_out(0x0a);
}
}
//-------------------------------------------------------------------------------------------------
// 函数功能:串口显示的空格
// 形参:space_number 表示空几个格
void uart_space(uchar space_number)
{ uchar i;
for(i=0;i<space_number;i++)
{
uart_byte_out(0x20);
}
}
//=================================================================================================
// 数制转换相关程序
//=================================================================================================
uchar change_bcd_to_hex(uchar shu)//转换BCD码成十进制数
{ uchar shu_h;
uchar shu_l;
shu_l=shu&0x0f;
shu_h=shu&0xf0;
shu_h=shu_h>>4;
return (shu_h*10+shu_l);
}
//-------------------------------------------------------------------------------------------------
uchar change_hex_to_bcd(uchar shu)//转换十进制数成BCD码
{ uchar shu_h;
uchar shu_l;
shu_l=shu%10;
shu_h=shu/10;
return ((shu_h<<4)|shu_l);
}
//-------------------------------------------------------------------------------------------------
uchar change_askii_to_hex(uchar askii)//转换ASKII码成HEX,实参范围:30-39、41-46
{ if(askii<=0x39) return(askii-0x30);
else return(askii-0x37);
}
//-------------------------------------------------------------------------------------------------
uchar change_hex_to_askii(uchar data_hex)//HEX转换成ASKII,实参范围:0-9、A-F
{ if(data_hex<=0x09) return(data_hex+0x30);
else return(data_hex+0x37);
}
//=================================================================================================
// 函数功能:将格式为"data1,data2,...datan#" 的字符串中的data数据全部取出,并存储于temporary_data[]
//=================================================================================================
void get_data(uchar * how_much_data)
{
uchar i;
uchar j=0;
uchar k=0;
uchar how_much_temp_askii=0;
uchar temp_askii[5];
uint return_data;
for(i=0; i<strlen(how_much_data); i++)
{
if( (how_much_data[i] != ',') && (how_much_data[i] != '#') )
{
temp_askii[j] = how_much_data[i];
j=j+1;
how_much_temp_askii=how_much_temp_askii+1;
}
else
{j=0;
switch (how_much_temp_askii)
{case 1:{return_data = change_askii_to_hex(temp_askii[0]);
break;
}
case 2:{return_data = change_askii_to_hex(temp_askii[0])*10+
change_askii_to_hex(temp_askii[1]);
break;
}
case 3:{return_data = change_askii_to_hex(temp_askii[0])*100+
change_askii_to_hex(temp_askii[1])*10 +
change_askii_to_hex(temp_askii[2]);
break;
}
case 4:{return_data = change_askii_to_hex(temp_askii[0])*1000+
change_askii_to_hex(temp_askii[1])*100 +
change_askii_to_hex(temp_askii[2])*10 +
change_askii_to_hex(temp_askii[3]);
break;
}
case 5:{return_data = change_askii_to_hex(temp_askii[0])*10000+
change_askii_to_hex(temp_askii[1])*1000 +
change_askii_to_hex(temp_askii[2])*100 +
change_askii_to_hex(temp_askii[3])*10 +
change_askii_to_hex(temp_askii[4]);
break;
}
default:break;
}
temporary_data[k] = return_data;
k=k+1;
how_much_temp_askii=0;
}
}
}
//=================================================================================================
// 函数功能:字符串匹配函数
//=================================================================================================
char * strstr(char * haystack, char * needle)
{ char *ptr1, *ptr2;
weizhi=0;
// Protect against NULL pointer
if (*needle == 0) return(haystack);
for( ; *haystack; haystack++ ,weizhi++)
{// Look for needle in haystack. If there is a
// match then this will continue all the way
// until ptr1 reaches the NULL at the end of needle
for(ptr1 = needle, ptr2 = haystack; *ptr1 && (*ptr1 == *ptr2); ++ptr1, ++ptr2);
// If there is a match then return pointer to needle in haystack
if(*ptr1 == 0) return(haystack);
}
return NULL;// no matching string found
}
//=================================================================================================
// 串口UART中断服务程序
// 可以自动接收格式为"@xxx...xxx#"的字符串,长度小于等于30
//=================================================================================================
void UART_interrupt (void) interrupt 4
{ RI=0;
if( SBUF == '@' ) //判断头
{uart_buffer_address = 0;
uart_buffer[uart_buffer_address] = SBUF;
uart_buffer_address++;
uart_receive_start = 1; //置uart0接收启动标志
return;
}
if( uart_receive_start == 1 ) //接收中间数据
{uart_buffer[uart_buffer_address] = SBUF;
uart_buffer_address++; //每接收1字节缓冲区地址加1
}
if( (uart_receive_start == 1)&&(SBUF == '#') ) //判断尾
{uart_buffer[uart_buffer_address] = 0;//置字符串结束符号 \0,为字符串处理函数提供标准格式
uart_buffer_address = 0; //清缓冲区地址指针
uart_receive_start = 0; //清uart0接收启动标志
uart_receive_ok = 1; //置已接收完整串口命令标志
return;
}
if(uart_buffer_address>39) //uart0接收缓冲区地址溢出故障处理:
{uart_buffer_address = 0; //清缓冲区地址指针
uart_receive_start = 0; //清uart0接收启动标志
uart_receive_ok = 0; //清已接收完整串口命令标志
}
}
//=================================================================================================
// T1中断服务程序
//=================================================================================================
void T1_interrupt(void) interrupt 3
{
TH1=0x4c;//11.0592M晶振时T1定时时间长度为50毫秒
TL1=0x00;
t1_delay_time++;//在需要延时的地方清空并判断该变量
}
//=================================================================================================
// end of the file
//=================================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -