⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcs51-项目开发经典.c

📁 带keil工程。调试成功
💻 C
📖 第 1 页 / 共 2 页
字号:
//=================================================================================================
// 项目名:MCS51-项目开发经典
// 硬件文件名:51Studay.DDB
// 程序组目录名:MCS51-项目开发经典
// 开始时间:2007年5月21日
// 完成时间:2007年6月10日
//-------------------------------------------------------------------------------------------------
// 程序中用到哪些C51标准函数,就需要把该函数对应的头文件包含进来
//-------------------------------------------------------------------------------------------------
#include <intrins.h>
#include <string.h>
#include <absacc.h>
#include <reg52.h>
//-------------------------------------------------------------------------------------------------
// 为提高书写效率做以下宏定义
//-------------------------------------------------------------------------------------------------
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
#define CLOSE 1
#define OPEN  0
//-------------------------------------------------------------------------------------------------
// DA芯片TLC5617操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit SCLK_TL5617=P1^6;
sbit DIN_TL5617 =P1^7;
sbit CS_TL5617  =P1^5;
//-------------------------------------------------------------------------------------------------
// AD芯片TLC2543操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit EOC_2543 =P1^0;
sbit CLK_2543 =P1^1;
sbit DIN_2543 =P1^2;
sbit DOUT_2543=P1^3;
sbit CS_2543  =P1^4;
//-------------------------------------------------------------------------------------------------

#define TEST_74HC595  1
#define TEST_24C02    2
#define TEST_93C46    3
#define SET_SD2000    4
#define READ_SD2000   5
#define TEST_18B20    6
#define TEST_HD7279   7
#define TEST_BIT_IO   8
#define TEST_TLC2543  9
#define TEST_TLC5617  10
#define TEST_PWM_DA   11
#define TEST_L297     12
#define TEST_DC_MOTOR 13
#define TEST_LCM      14
//-------------------------------------------------------------------------------------------------
// 操作UART串口相关的全局变量
//-------------------------------------------------------------------------------------------------
uchar idata uart_buffer[40];//串口接收缓冲区,可接收字符串的最大长度为40
uchar uart_buffer_address;//串口接收缓冲区地址计数器
bit   uart_receive_start; //串口接收启动
bit   uart_receive_ok;    //串口接收(UART0)中断里已接收完整消息标志
//-------------------------------------------------------------------------------------------------
uchar t1_delay_time;//50毫秒计数器累加变量,在T1中断里累加
bit   i2c_response_signal;//I2C总线应答信号
uint  idata temporary_data[10];//临时数据
uchar idata test_command;//存储串口接收的测试命令
uchar idata weizhi;
uchar idata lcm_control_mode;//液晶控制方式选择
uint  motor_speed_delay;
//-------------------------------------------------------------------------------------------------
// 函数声明
//-------------------------------------------------------------------------------------------------
void  init_cpu(void);
void  TLC5617_Write(uchar mode,uint udata);
uint  ad2543_measure(uchar chunnel_select);

void  uart_byte_out(uchar uart_data_out);
void  uart_string_out(char * char_array);
void  uart_data_decimalist_out(uint data_to_out);
void  uart_newline(uchar newline_number);
void  uart_space(uchar space_number);

uchar change_bcd_to_hex(uchar shu);
uchar change_hex_to_bcd(uchar shu);
uchar change_askii_to_hex(uchar askii);
uchar change_hex_to_askii(uchar data_hex);

void  get_data(uchar * how_much_data);
char  * strstr(char * haystack, char * needle);

//=================================================================================================
//=====================                            ================================================
//=====================          主程序            ================================================
//=====================                            ================================================
//=================================================================================================
void main (void)
{    
	uchar i;
	uint  da_out_data; 
	uint  ad_mesure_data;
	float ad_total;
    init_cpu();
 

wqyloop:
		da_out_data=0;
		ad_mesure_data=0;
		ad_total=0;
//=================================================================================================
       for(t1_delay_time=0;t1_delay_time<40;);


         da_out_data=3.452*1024/5;
 		 uart_string_out("The data write to TLC5617 is :");
         uart_data_decimalist_out(da_out_data);
		 uart_newline(1);

         //计算并显示对应输入数据应该输出的电压
		 uart_string_out("The volt out from TLC5617 should be :");
         ad_total =(float)(da_out_data)/1024*2.5*2;//计算对应的DA输出电压
		 ad_mesure_data =(uint)(ad_total*1000);//保留两位小数
         uart_byte_out(change_hex_to_askii(ad_mesure_data/1000));//串口传输整数部分
		 uart_byte_out('.');//串口传输小数点
		 uart_byte_out(change_hex_to_askii((ad_mesure_data%1000)/100));//串口传输小数点后第1位
		 uart_byte_out(change_hex_to_askii((ad_mesure_data%100)/10));//串口传输小数点后第2位
		 uart_byte_out(change_hex_to_askii(ad_mesure_data%10));//串口传输小数点后第3位
		 uart_string_out("......");
		 uart_newline(1);

         //OUTA、OUTB同时输出串口设定的 da_data 数值
		 TLC5617_Write(3,da_out_data);//缓冲器写
         TLC5617_Write(1,da_out_data);//OUTA、OUTB同时输出

         //用TLC2543测量OUTB输出的电压,并通过串口显示
		 ad_total=0;
		 ad_mesure_data=0;
		 ad2543_measure(8);//祛除上一次转换结果并启动本次转换
         for(i=0;i<10;i++)//10次测量求和
		    {ad_mesure_data =ad2543_measure(8);
			 ad_total+=ad_mesure_data;
			}
         ad_total = ad_total/10;//取10次测量均值

		 //计算,将TLC2543测得的AD量转化成相应的电压,注意电压值带小数点
		 uart_string_out("The volt of TLC5617_OUTB (T6) is :");
		 ad_total = ad_total/4096*4.95;
		 ad_mesure_data =(uint)(ad_total*1000);//保留两位小数
         uart_byte_out(change_hex_to_askii(ad_mesure_data/1000));//串口传输整数部分
		 uart_byte_out('.');//串口传输小数点
		 uart_byte_out(change_hex_to_askii((ad_mesure_data%1000)/100));//串口传输小数点后第1位
		 uart_byte_out(change_hex_to_askii((ad_mesure_data%100)/10));//串口传输小数点后第2位
		 uart_byte_out(change_hex_to_askii(ad_mesure_data%10));//串口传输小数点后第3位
         //可以用万用表测量 TLC5617_OUTA(T5) 点的电压,与串口显示的OUTB电压进行比较
		 uart_newline(1);
		 uart_newline(1);

		
 
//================================================================================================= 
/*		 ad_total=0;
		 ad2543_measure(7);//祛除上一次转换结果并启动本次转换
         for(i=0;i<10;i++)//10次测量求和
		    {ad_mesure_data =ad2543_measure(7);
			 ad_total+=ad_mesure_data;
			}
         ad_total = ad_total/10;//取10次测量均值
		 //计算,将TLC2543测得的AD量转化成对应于基准的电压,注意电压值带小数点
		 ad_total = ad_total/4096*5;
		 //将电压值显示到计算机屏幕上,保留两位小数
         uart_string_out("The volt of test point (T2) is :");
		 ad_mesure_data =(uint)(ad_total*100);//保留2位小数
         uart_byte_out(change_hex_to_askii(ad_mesure_data/100));//串口传输整数部分
		 uart_byte_out('.');//串口传输小数点
		 uart_byte_out(change_hex_to_askii((ad_mesure_data%100)/10));//串口传输小数点后第1位
		 uart_byte_out(change_hex_to_askii(ad_mesure_data%10));//串口传输小数点后第2位
		 uart_newline(1);
		 test_command=0; 
*/
goto wqyloop;
}//The end of main()

//##########################  主程序结束  #########################################################
//##########################  子程序开始  #########################################################

//=================================================================================================
// 函数功能:CPU初始化函数
// 串口波特率可以由T1或T2产生,本例中用T1产生波特率
// T2用于50毫秒精确定时
// T0用于PWM控制中频率的时基
//=================================================================================================
void init_cpu(void)
{ 
  TMOD=0x12;//T1为16位计数器,T0为8位自动重装载计数器

  ET1=1;
  TH1=0x4c;//11.0592M晶振时T1定时时间长度为50毫秒
  TL1=0x00;
  TR1=1;//T1开始定时  


  T2CON=0x30;//定时器T2工作于波特率发生器方式
  RCAP2H=0xff;//11.0592M晶振,9600bps初值
  RCAP2L=0xdc;
  TH2=0xff;
  TL2=0xdc;
  //RCAP2H=0xfe;//11.0592M晶振,1200bps初值
  //RCAP2L=0xe0;
  //TH2=0xfe;
  //TL2=0xe0;
  TR2=1;//允许T2中断
  
  SCON=0x50;//串口工作于方式1,启动串口接收

  EA=1;//CPU中断开放
  
}

//=================================================================================================
// TLC5617驱动程序
// 形参:mode 工作模式、udata 10位DAC数据
//=================================================================================================
void TLC5617_Write(uchar mode,uint udata)
{  uchar i;
   uint WQY_dat;

   CS_TL5617=0;
   switch(mode)
     { case 0:WQY_dat=0x2000; break;           //掉电方式
       case 1:WQY_dat=0x8000|(udata<<2);break; //慢速,数据写入锁存器A,同时用缓冲器数据更新锁存器B
       case 2:WQY_dat=0x0000|(udata<<2);break; //慢速,数据写入锁存器B和缓冲器
       case 3:WQY_dat=0x1000|(udata<<2);break; //慢速,仅写缓冲器
       default:break;   
     }
   for(i=0;i<16;i++)//将上面生成的16位数据(包含命令及写入DA的数值)输入TLC5617
     {
       DIN_TL5617 =(bit)(WQY_dat&0x8000);//数据最高位MSB输入准备,同时也起到了延时作用
       SCLK_TL5617=1;//时钟端下降沿将数据写入
       WQY_dat<<=1;//准备数据的下一位,同时也起到了延时作用
       SCLK_TL5617=0;
     }
   SCLK_TL5617=1;
   _nop_();
   CS_TL5617=1;//CS上升沿使DA输出有效
   _nop_();
}
//=================================================================================================
// TLC2543驱动程序
// TLC2543的高8位控制字格式如下:(低8位无意义)
// D7 D6 D5 D4      D3  D2         D1              D0
// 通道选择       数据长度选择   前导选择        单双极性选择
// 0000---AIN0    01---8BIT      0---MSB first   0---Unipolar(单极性)
// 0001---AIN1    10---12BIT     1---LSB first   1---Bipolar(双极性)
// 0010---AIN2    11---16BIT
// 0011---AIN3
// 0100---AIN4
// 0101---AIN5
// 0110---AIN6
// 0111---AIN7
// 1000---AIN8
// 1001---AIN9
// 1010---AIN10
//=================================================================================================
//这个数组定义了通道状态,通过不同的数组下标可选择不同通道
//这里TLC2543的所有通道状态均定义为:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -