[应用相关] 电赛电源程序

[复制链接]
982|7
 楼主| 拉克丝 发表于 2016-5-25 19:56 | 显示全部楼层 |阅读模式
DC-DC,15年电赛电源程序

DC-DC.zip

56.96 KB, 下载次数: 14

643757107 发表于 2016-5-25 21:07 | 显示全部楼层

帮你贴出来。


  1. #include <reg52.H>
  2. #include "1602.h"
  3. #include "adcchaxun.h"
  4. #include "delay.h"
  5. #include "stdio.h"

  6. sbit key_chongdian = P2^0;//定义按键
  7. sbit key_fangdian = P2^1;
  8. sbit key_zidong = P2^2;

  9. sbit cd = P3^0;
  10. sbit fd1 = P3^1;
  11. sbit fd2 = P3^2;
  12. uchar a;
  13. unsigned char KeyScan();
  14. void chongdian();
  15. void fangdian();
  16. void zidong();

  17. main()
  18. {

  19.   key_chongdian = 1;
  20.   key_fangdian = 1;
  21.   key_zidong = 1; //按键输入端口电平置高

  22.   InitADC();
  23.         LCD_Init();           //初始化液晶
  24.   DelayMs(20);          //延时有助于稳定
  25.         LCD_Clear();          //清屏


  26.                 while(1)
  27.                 {                       
  28.                         KeyScan();
  29.                  switch(a)
  30.                  {
  31.        case 1:chongdian();break;
  32.        case 2:fangdian();break;
  33.        case 3:zidong();break;
  34.                          default:return 0;break;
  35.      }
  36.   
  37.     }
  38. }


  39. unsigned char KeyScan()
  40. {
  41.         if(!key_chongdian)  //如果检测到低电平,说明按键按下
  42.         {
  43.                
  44.                  a=1;
  45.         }
  46.         if(!key_fangdian)  //如果检测到低电平,说明按键按下
  47.         {
  48.                
  49.                  a=2;
  50.         }
  51.         if(!key_zidong)  //如果检测到低电平,说明按键按下
  52.         {
  53.                 a=3;
  54.         }
  55. }
  56. void chongdian()
  57. {
  58.         uchar i,num1, num2,num3;
  59.   unsigned char temp[7];//定义显示区域临时存储数组
  60.   float U1,U2,I,U4,U;  
  61.         cd = 0;//充电   LM2596 5脚高电平不工作
  62.         fd1 = 0;//UCC 28019  4,6脚 均高电平工作
  63.         fd2 = 0;

  64.        
  65.         /*************读电流**********/
  66.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  67.         num1=GetADCResult(0);      //采样电压计算电流,
  68.         U4=(float)num1*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  69.         I = (float)U4/2.2;
  70.         sprintf(temp,"I1 %3.2fA",I);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  71.         LCD_Write_String(8,0,temp);
  72.        
  73.         LCD_Write_String(0,0,"MOD1 CD");
  74.        
  75.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  76.   num2=GetADCResult(1);
  77.        
  78.         U=(float)num2*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  79.         U1=U*6.7;
  80.   sprintf(temp,"U1 %3.2f ",U1);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  81.         LCD_Write_String(0,1,temp);
  82.        
  83.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  84.   num3=GetADCResult(2);      
  85.         U2=(float)num3*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  86.   sprintf(temp,"U2 %3.2f ",U2);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  87.         LCD_Write_String(8,1,temp);
  88.        
  89.         if(U>4)
  90.                 cd = 1;//停止充电
  91. }
  92. void fangdian()
  93. {
  94.         uchar i,num1, num2,num3;
  95.   unsigned char temp[7];//定义显示区域临时存储数组
  96.   float U1,U2,I,U,U3,U4;  
  97.         cd = 1;//放电
  98.         fd1 = 1;fd2 = 1;//放电工作
  99.        
  100.         /*************读电流**********/
  101.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  102.         num1=GetADCResult(0);      //采样电压计算电流,
  103.         U4=(float)num1*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  104.         I = (float)U4/2.2;
  105.         sprintf(temp,"I1 %3.2fA",I);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  106.         LCD_Write_String(8,0,temp);
  107.        
  108.         LCD_Write_String(0,0,"MOD2 FD");
  109.        
  110.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  111.   num2=GetADCResult(1);      
  112.         U=(float)num2*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  113.         U1=U*6.7;
  114.   sprintf(temp,"U1 %3.2f ",U1);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  115.         LCD_Write_String(0,1,temp);
  116.        
  117.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  118.   num3=GetADCResult(2);      
  119.         U2=(float)num3*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  120.   U3=U2*;
  121.         sprintf(temp,"U3 %3.2f ",U3);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  122.         LCD_Write_String(8,1,temp);
  123.        
  124.        
  125. }
  126. void zidong()
  127. {
  128.         uchar i,num1, num2,num3;
  129.   unsigned char temp[7];//定义显示区域临时存储数组
  130.   float U1,U2,I,U,U4,U3;  

  131.         /*************读电流**********/
  132.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  133.         num1=GetADCResult(0);      //采样电压计算电流,
  134.         U4=(float)num1*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  135.         I = (float)U4/2.2;
  136.         sprintf(temp,"I1 %3.2fA",I);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  137.         LCD_Write_String(8,0,temp);
  138.         LCD_Write_String(0,0,"MOD3 ZD");
  139.        
  140.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  141.   num2=GetADCResult(1);      
  142.         U=(float)num2*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  143.         U1=U*6.7;
  144.   sprintf(temp,"U1 %3.2f ",U1);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  145.         LCD_Write_String(0,1,temp);
  146.        
  147.         for(i=0;i<10;i++)//连续读5次,取最后一次,以便读取稳定值
  148.   num3=GetADCResult(2);      
  149.         U2=(float)num3*5/256;   //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
  150.   U3=U2*;
  151.         sprintf(temp,"U2 %3.2f ",U2);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位
  152.         LCD_Write_String(8,1,temp);
  153.        
  154.        
  155.         if(U3>30)
  156.         {
  157.                 cd=0;//充电
  158.                 fd1=0;
  159.                 fd2=0;
  160.         }
  161.         else
  162.         {
  163.                 cd=1;//放电
  164.                 fd1=1;
  165.                 fd2=1;
  166.                
  167.   }
  168.        
  169. }


643757107 发表于 2016-5-25 21:08 | 显示全部楼层
  1. /*-----------------------------------------------
  2.   名称:IIC协议
  3.   编写:shifang
  4.   修改:无
  5.   内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
  6.                 周期,即晶振频率要小于12MHZ)
  7. ------------------------------------------------*/  
  8.   
  9.               
  10. #include "i2c.h"
  11. #include "delay.h"

  12. #define  _Nop()  _nop_()  //定义空指令
  13. #define AddWr 0x90   //写数据地址
  14. #define AddRd 0x91   //读数据地址
  15.                         
  16. bit ack;                      //应答标志位

  17. sbit SDA=P3^1;
  18. sbit SCL=P3^0;

  19. /*------------------------------------------------
  20.                     启动总线
  21. ------------------------------------------------*/
  22. void Start_I2c()
  23. {
  24.   SDA=1;   //发送起始条件的数据信号
  25.   _Nop();
  26.   SCL=1;
  27.   _Nop();    //起始条件建立时间大于4.7us,延时
  28.   _Nop();
  29.   _Nop();
  30.   _Nop();
  31.   _Nop();   
  32.   SDA=0;     //发送起始信号
  33.   _Nop();    //起始条件锁定时间大于4μ
  34.   _Nop();
  35.   _Nop();
  36.   _Nop();
  37.   _Nop();      
  38.   SCL=0;    //钳住I2C总线,准备发送或接收数据
  39.   _Nop();
  40.   _Nop();
  41. }
  42. /*------------------------------------------------
  43.                     结束总线
  44. ------------------------------------------------*/
  45. void Stop_I2c()
  46. {
  47.   SDA=0;    //发送结束条件的数据信号
  48.   _Nop();   //发送结束条件的时钟信号
  49.   SCL=1;    //结束条件建立时间大于4μ
  50.   _Nop();
  51.   _Nop();
  52.   _Nop();
  53.   _Nop();
  54.   _Nop();
  55.   SDA=1;    //发送I2C总线结束信号
  56.   _Nop();
  57.   _Nop();
  58.   _Nop();
  59.   _Nop();
  60. }




  61. /*----------------------------------------------------------------
  62.                  字节数据传送函数               
  63. 函数原型: void  SendByte(unsigned char c);
  64. 功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  65.      此状态位进行操作.(不应答或非应答都使ack=0 假)     
  66.      发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  67. ------------------------------------------------------------------*/
  68. void  SendByte(unsigned char c)
  69. {
  70. unsigned char BitCnt;

  71. for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
  72.     {
  73.      if((c<<BitCnt)&0x80)SDA=1;   //判断发送位
  74.        else  SDA=0;               
  75.      _Nop();
  76.      SCL=1;               //置时钟线为高,通知被控器开始接收数据位
  77.       _Nop();
  78.       _Nop();             //保证时钟高电平周期大于4μ
  79.       _Nop();
  80.       _Nop();
  81.       _Nop();         
  82.      SCL=0;
  83.     }
  84.    
  85.     _Nop();
  86.     _Nop();
  87.     SDA=1;               //8位发送完后释放数据线,准备接收应答位
  88.     _Nop();
  89.     _Nop();   
  90.     SCL=1;
  91.     _Nop();
  92.     _Nop();
  93.     _Nop();
  94.     if(SDA==1)ack=0;     
  95.        else ack=1;        //判断是否接收到应答信号
  96.     SCL=0;
  97.     _Nop();
  98.     _Nop();
  99. }

  100. /*------------------------------------------------
  101.                写入DA转换数值
  102. 输入参数:dat 表示需要转换的DA数值,范围是0-255
  103. ------------------------------------------------*/
  104. bit WriteDAC(unsigned char dat)
  105. {
  106.    Start_I2c();               //启动总线
  107.    SendByte(AddWr);             //发送器件地址
  108.      if(ack==0)return(0);
  109.    SendByte(0x40);            //发送器件子地址
  110.      if(ack==0)return(0);
  111.    SendByte(dat);             //发送数据
  112.      if(ack==0)return(0);
  113.    Stop_I2c();  
  114. }

  115. /*------------------------------------------------
  116.              读AD转值程序
  117. 输入参数 Chl 表示需要转换的通道,范围从0-3
  118. 返回值范围0-255
  119. ------------------------------------------------*/
  120. unsigned char ReadADC(unsigned char Chl)
  121. {
  122.    unsigned char Val;
  123.    Start_I2c();               //启动总线
  124.    SendByte(AddWr);             //发送器件地址
  125.      if(ack==0)return(0);
  126.    SendByte(0x40|Chl);            //发送器件子地址
  127.      if(ack==0)return(0);
  128.    Start_I2c();
  129.    SendByte(AddWr+1);
  130.       if(ack==0)return(0);
  131.    Val=RcvByte();
  132.    NoAck_I2c();                 //发送非应位
  133.    Stop_I2c();                  //结束总线
  134.   return(Val);
  135. }


  136. /*----------------------------------------------------------------
  137.                  字节数据传送函数               
  138. 函数原型: unsigned char  RcvByte();
  139. 功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
  140.      发完后请用应答函数。  
  141. ------------------------------------------------------------------*/       
  142. unsigned char  RcvByte()
  143. {
  144.   unsigned char retc;
  145.   unsigned char BitCnt;
  146.   
  147.   retc=0;
  148.   SDA=1;             //置数据线为输入方式
  149.   for(BitCnt=0;BitCnt<8;BitCnt++)
  150.       {
  151.         _Nop();           
  152.         SCL=0;       //置时钟线为低,准备接收数据位
  153.         _Nop();
  154.         _Nop();      //时钟低电平周期大于4.7us
  155.         _Nop();
  156.         _Nop();
  157.         _Nop();
  158.         SCL=1;       //置时钟线为高使数据线上数据有效
  159.         _Nop();
  160.         _Nop();
  161.         retc=retc<<1;
  162.         if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
  163.         _Nop();
  164.         _Nop();
  165.       }
  166.   SCL=0;   
  167.   _Nop();
  168.   _Nop();
  169.   return(retc);
  170. }



  171. /*----------------------------------------------------------------
  172.                      应答子函数
  173. 原型:  void Ack_I2c(void);

  174. ----------------------------------------------------------------*/
  175. /*void Ack_I2c(void)
  176. {
  177.   
  178.   SDA=0;     
  179.   _Nop();
  180.   _Nop();
  181.   _Nop();      
  182.   SCL=1;
  183.   _Nop();
  184.   _Nop();              //时钟低电平周期大于4μ
  185.   _Nop();
  186.   _Nop();
  187.   _Nop();  
  188.   SCL=0;               //清时钟线,钳住I2C总线以便继续接收
  189.   _Nop();
  190.   _Nop();   
  191. }*/
  192. /*----------------------------------------------------------------
  193.                      非应答子函数
  194. 原型:  void NoAck_I2c(void);

  195. ----------------------------------------------------------------*/
  196. void NoAck_I2c(void)
  197. {
  198.   
  199.   SDA=1;
  200.   _Nop();
  201.   _Nop();
  202.   _Nop();      
  203.   SCL=1;
  204.   _Nop();
  205.   _Nop();              //时钟低电平周期大于4μ
  206.   _Nop();
  207.   _Nop();
  208.   _Nop();  
  209.   SCL=0;                //清时钟线,钳住I2C总线以便继续接收
  210.   _Nop();
  211.   _Nop();   
  212. }






  213. /*----------------------------------------------------------------
  214.                     向无子地址器件发送字节数据函数               
  215. 函数原型: bit  ISendByte(unsigned char sla,ucahr c);  
  216. 功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
  217.            如果返回1表示操作成功,否则操作有误。
  218. 注意:    使用前必须已结束总线。
  219. ----------------------------------------------------------------*/
  220. /*bit ISendByte(unsigned char sla,unsigned char c)
  221. {
  222.    Start_I2c();               //启动总线
  223.    SendByte(sla);             //发送器件地址
  224.      if(ack==0)return(0);
  225.    SendByte(c);               //发送数据
  226.      if(ack==0)return(0);
  227.   Stop_I2c();                 //结束总线
  228.   return(1);
  229. }
  230. */

  231. /*----------------------------------------------------------------
  232.                     向有子地址器件发送多字节数据函数               
  233. 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  
  234. 功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
  235.           地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
  236.            如果返回1表示操作成功,否则操作有误。
  237. 注意:    使用前必须已结束总线。
  238. ----------------------------------------------------------------*/
  239. /*bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
  240. {
  241.    unsigned char i;
  242. for(i=0;i<no;i++)
  243.     {
  244.    Start_I2c();               //启动总线
  245.    SendByte(sla);             //发送器件地址
  246.      if(ack==0)return(0);
  247.    SendByte(suba);            //发送器件子地址
  248.      if(ack==0)return(0);

  249.      SendByte(*s);            //发送数据
  250.        if(ack==0)return(0);
  251.      Stop_I2c();                  //结束总线
  252.          DelayMs(1);               //必须延时等待芯片内部自动处理数据完毕
  253.          s++;
  254.          suba++;
  255.     }
  256.   return(1);
  257. }
  258. */
  259. /*----------------------------------------------------------------
  260.                     向无子地址器件读字节数据函数               
  261. 函数原型: bit  IRcvByte(unsigned char sla,ucahr *c);  
  262. 功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
  263.           址sla,返回值在c.
  264.            如果返回1表示操作成功,否则操作有误。
  265. 注意:    使用前必须已结束总线。
  266. ----------------------------------------------------------------*/
  267. /*bit IRcvByte(unsigned char sla,unsigned char *c)
  268. {
  269.    Start_I2c();                //启动总线
  270.    SendByte(sla+1);            //发送器件地址
  271.      if(ack==0)return(0);
  272.    *c=RcvByte();               //读取数据
  273.      NoAck_I2c();              //发送非就答位
  274.      Stop_I2c();               //结束总线
  275.   return(1);
  276. }

  277. */
  278. /*----------------------------------------------------------------
  279.                     向有子地址器件读取多字节数据函数               
  280. 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  
  281. 功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
  282.           地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
  283.            如果返回1表示操作成功,否则操作有误。
  284. 注意:    使用前必须已结束总线。
  285. ----------------------------------------------------------------*/
  286. /*bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
  287. {
  288.    unsigned char i;

  289.    Start_I2c();               //启动总线
  290.    SendByte(sla);             //发送器件地址
  291.      if(ack==0)return(0);
  292.    SendByte(suba);            //发送器件子地址
  293.      if(ack==0)return(0);

  294.    Start_I2c();
  295.    SendByte(sla+1);
  296.       if(ack==0)return(0);

  297.   for(i=0;i<no-1;i++)
  298.     {
  299.      *s=RcvByte();              //发送数据
  300.       Ack_I2c();                //发送就答位
  301.      s++;
  302.     }
  303.    *s=RcvByte();
  304.     NoAck_I2c();                 //发送非应位
  305.     Stop_I2c();                    //结束总线
  306.   return(1);
  307. }
  308. */


643757107 发表于 2016-5-25 21:09 | 显示全部楼层
  1. #include "delay.h"
  2. /*------------------------------------------------
  3. uS延时函数,含有输入参数 unsigned char t,无返回值
  4. unsigned char 是定义无符号字符变量,其值的范围是
  5. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  6. 长度如下 T=tx2+5 uS
  7. ------------------------------------------------*/
  8. void DelayUs2x(unsigned char t)
  9. {   
  10. while(--t);
  11. }
  12. /*------------------------------------------------
  13. mS延时函数,含有输入参数 unsigned char t,无返回值
  14. unsigned char 是定义无符号字符变量,其值的范围是
  15. 0~255 这里使用晶振12M,精确延时请使用汇编
  16. ------------------------------------------------*/
  17. void DelayMs(unsigned char t)
  18. {
  19.      
  20. while(t--)
  21. {
  22.      //大致延时1mS
  23.      DelayUs2x(245);
  24.          DelayUs2x(245);
  25. }
  26. }


643757107 发表于 2016-5-25 21:10 | 显示全部楼层
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include "adcchaxun.h"

  4. int Vo;
  5. //void main()
  6. //{
  7. //    InitUart();                     //Init UART, use to show ADC result
  8. //    InitADC();                      //Init ADC sfr
  9. //    while (1)
  10. //    {
  11. //        ShowResult(0);              //Show Channel0
  12. //        ShowResult(1);              //Show Channel1
  13. //        ShowResult(2);              //Show Channel2
  14. //        ShowResult(3);              //Show Channel3
  15. //        ShowResult(4);              //Show Channel4
  16. //        ShowResult(5);              //Show Channel5
  17. //        ShowResult(6);              //Show Channel6
  18. //        ShowResult(7);              //Show Channel7
  19. //    }
  20. //}

  21. /*----------------------------
  22. Send ADC result to UART
  23. ----------------------------*/
  24. //void ShowResult(uchar ch)
  25. //{
  26. //    SendData(ch);                   //Show Channel NO.
  27. //    SendData(GetADCResult(ch));     //Show ADC high 8-bit result

  28. ////if you want show 10-bit result, uncomment next line
  29. ////    SendData(ADC_LOW2);             //Show ADC low 2-bit result
  30. //}

  31. /*----------------------------
  32. Get ADC result
  33. ----------------------------*/
  34. uchar GetADCResult(uchar ch)
  35. {
  36.    
  37.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  38.     _nop_();                        //Must wait before inquiry
  39.     _nop_();
  40.     _nop_();
  41.     _nop_();
  42.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  43.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC
  44. //   Vo=ADC_RES*5*10/256;
  45.         return ADC_RES;
  46.                   //Return ADC result
  47. }

  48. /*----------------------------
  49. Initial UART
  50. ----------------------------*/
  51. //void InitUart()
  52. //{
  53. //    SCON = 0x5a;                    //8 bit data ,no parity bit
  54. //    TMOD = 0x20;                    //T1 as 8-bit auto reload
  55. //    TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
  56. //    TR1 = 1;                        //T1 start running
  57. //}

  58. /*----------------------------
  59. Initial ADC sfr
  60. ----------------------------*/
  61. void InitADC()
  62. {
  63.     P1ASF = 0xff;                   //Open 8 channels ADC function
  64.     ADC_RES = 0;                    //Clear previous result
  65.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  66.     Delay(2);                       //ADC power-on and delay
  67. }

  68. /*----------------------------
  69. Send one byte data to PC
  70. Input: dat (UART data)
  71. Output:-
  72. ----------------------------*/
  73. //void SendData(uchar dat)
  74. //{
  75. //    while (!TI);                    //Wait for the previous data is sent
  76. //    TI = 0;                         //Clear TI flag
  77. //    SBUF = dat;                     //Send current data
  78. //}

  79. /*----------------------------
  80. Software delay function
  81. ----------------------------*/
  82. void Delay(uint n)
  83. {
  84.     uchar x;

  85.     while (n--)
  86.     {
  87.         x = 5000;
  88.         while (x--);
  89.     }
  90. }


643757107 发表于 2016-5-25 21:10 | 显示全部楼层
  1. #ifndef __adcchaxun_H__
  2. #define __adcchaxun_H__

  3. #define FOSC    11059200L
  4. #define BAUD    9600

  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. /*Declare SFR associated with the ADC */
  8. sfr ADC_CONTR   =   0xBC;           //ADC control register
  9. sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register
  10. sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
  11. sfr P1ASF       =   0x9D;           //P1 secondary function control register

  12. /*Define ADC operation const for ADC_CONTR*/
  13. #define ADC_POWER   0x80            //ADC power control bit
  14. #define ADC_FLAG    0x10            //ADC complete flag
  15. #define ADC_START   0x08            //ADC start control bit
  16. #define ADC_SPEEDLL 0x00            //420 clocks
  17. #define ADC_SPEEDL  0x20            //280 clocks
  18. #define ADC_SPEEDH  0x40            //140 clocks
  19. #define ADC_SPEEDHH 0x60            //70 clocks
  20. extern int result1;
  21. void InitUart();
  22. void InitADC();
  23. void SendData(uchar dat);
  24. uchar GetADCResult(uchar ch);
  25. void Delay(uint n);
  26. void ShowResult(uchar ch);




  27. #endif


643757107 发表于 2016-5-25 21:11 | 显示全部楼层
  1. /*-----------------------------------------------
  2.   名称:LCD1602.h
  3.   编写:shifang
  4.   日期:2009.5
  5.   修改:无
  6.   内容:
  7.   引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
  8. ------------------------------------------------*/
  9. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  10. #include<intrins.h>

  11. #ifndef __1602_H__
  12. #define __1602_H__


  13. bit LCD_Check_Busy(void) ;

  14. void LCD_Write_Com(unsigned char com) ;

  15. void LCD_Write_Data(unsigned char Data) ;

  16. void LCD_Clear(void) ;

  17. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;

  18. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;

  19. void LCD_Init(void) ;
  20.    
  21. #endif


643757107 发表于 2016-5-25 21:12 | 显示全部楼层
  1. /*-----------------------------------------------
  2.   名称:LCD1602
  3.   编写:shifang
  4.   日期:2009.5
  5.   修改:无
  6.   内容:
  7.   引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
  8. ------------------------------------------------*/
  9. #include "1602.h"
  10. #include "delay.h"

  11. sbit RS = P2^4;   //定义端口
  12. sbit RW = P2^5;
  13. sbit EN = P2^6;

  14. #define RS_CLR RS=0
  15. #define RS_SET RS=1

  16. #define RW_CLR RW=0
  17. #define RW_SET RW=1

  18. #define EN_CLR EN=0
  19. #define EN_SET EN=1

  20. #define DataPort P0

  21. /*------------------------------------------------
  22.               判忙函数
  23. ------------------------------------------------*/
  24. bit LCD_Check_Busy(void)
  25. {
  26. DataPort= 0xFF;
  27. RS_CLR;
  28. RW_SET;
  29. EN_CLR;
  30. _nop_();
  31. EN_SET;
  32. return (bit)(DataPort & 0x80);
  33. }
  34. /*------------------------------------------------
  35.               写入命令函数
  36. ------------------------------------------------*/
  37. void LCD_Write_Com(unsigned char com)
  38. {  
  39. while(LCD_Check_Busy()); //忙则等待
  40. DelayMs(5);
  41. RS_CLR;
  42. RW_CLR;
  43. EN_SET;
  44. DataPort= com;
  45. _nop_();
  46. EN_CLR;
  47. }
  48. /*------------------------------------------------
  49.               写入数据函数
  50. ------------------------------------------------*/
  51. void LCD_Write_Data(unsigned char Data)
  52. {
  53. while(LCD_Check_Busy()); //忙则等待
  54. DelayMs(5);
  55. RS_SET;
  56. RW_CLR;
  57. EN_SET;
  58. DataPort= Data;
  59. _nop_();
  60. EN_CLR;
  61. }

  62. /*------------------------------------------------
  63.                 清屏函数
  64. ------------------------------------------------*/
  65. void LCD_Clear(void)
  66. {
  67. LCD_Write_Com(0x01);
  68. DelayMs(5);
  69. }
  70. /*------------------------------------------------
  71.               写入字符串函数
  72. ------------------------------------------------*/
  73. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  74. {     
  75. if (y == 0)
  76.         {     
  77.          LCD_Write_Com(0x80 + x);     //表示第一行
  78.         }
  79. else
  80.         {      
  81.         LCD_Write_Com(0xC0 + x);      //表示第二行
  82.         }        
  83. while (*s)
  84.         {     
  85. LCD_Write_Data( *s);     
  86. s ++;     
  87.         }
  88. }
  89. /*------------------------------------------------
  90.               写入字符函数
  91. ------------------------------------------------*/
  92. // void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  93. // {     
  94. // if (y == 0)
  95. //         {     
  96. //         LCD_Write_Com(0x80 + x);     
  97. //         }   
  98. // else
  99. //         {     
  100. //         LCD_Write_Com(0xC0 + x);     
  101. //         }        
  102. // LCD_Write_Data( Data);  
  103. // }
  104. /*------------------------------------------------
  105.               初始化函数
  106. ------------------------------------------------*/
  107. void LCD_Init(void)
  108. {
  109.    LCD_Write_Com(0x38);    /*显示模式设置*/
  110.    DelayMs(5);
  111.    LCD_Write_Com(0x38);
  112.    DelayMs(5);
  113.    LCD_Write_Com(0x38);
  114.    DelayMs(5);
  115.    LCD_Write_Com(0x38);  
  116.    LCD_Write_Com(0x08);    /*显示关闭*/
  117.    LCD_Write_Com(0x01);    /*显示清屏*/
  118.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  119.    DelayMs(5);
  120.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  121.    }
  122.    


您需要登录后才可以回帖 登录 | 注册

本版积分规则

150

主题

920

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部