EDN首页   博客首页

最新日志

发表于:2007-9-5 16:43:10
标签:高精度采样程序  

1

两段高精度采样小程序

给老弟两段程序,这是老哥用在产品上的高精度采样程序。


非常可靠,为的是答谢老弟,告诉我虚拟仪器注册机。


AD 时钟是 3...几兆,关于变量老弟自几定义吧


 


/************************ ADC 通道切换函数 ***************************
* 名称: Switch_Gate
* 说明: 交叉数据采样
* 功能: 通道切换交叉启动 ADC
* 调用: 无
* 输入: 无
* 返回值: V_Scale  I_Scale
*********************************************************************/
void Switch_Gate(void)
{   
   ES = 0;
    
   Frequency = 0;
   Chnnl = 0;
            Bat_power = 0;
   ADC_End = 1;
   V_Scale = 0;
   I_Scale = 0;
   TR0 = 0;
      WDT_OFF = 1;
  for (;Frequency <= 3071;)
      {
      if (ADC_End == 1)
   {
   ADC_End = 0;          // 中断结束再入
   Chnnl++;              // 交叉启动
          if (Chnnl == 1 )
             {
       AMX0SL = 0x00;             // ADC 电流通道
             ADC0CF = Mea0.sure_PGA2;   // PGA 放大 N 倍
    ADC0CN = 0xbc;             // 启动 ADC
 //              while(Pow_OFF)WDTCN = 0xA5;   // 于电源同步 PWM
    ADC0CN = 0xb0;
    EIE2 = 0x02;      // 开 ADC 中断
             }
          if (Chnnl == 2 )
             {
       AMX0SL = 0x01;    // ADC 电压通道
                ADC0CF = 0x00;    // PGA 放大零倍
    ADC0CN = 0xbc;    // 启动 ADC
 //              while(Pow_OFF)WDTCN = 0xA5;   // 于电源同步 PWM
     ADC0CN = 0xb0;
    EIE2 = 0x02;      // 开 ADC 中断
                }
    if (Chnnl == 3 )
             {
       AMX0SL = 0x02;    // ADC 电压通道
                ADC0CF = 0x00;    // PGA 放大零倍
    ADC0CN = 0xbc;    // 启动 ADC
     ADC0CN = 0xb0;
    EIE2 = 0x02;      // 开 ADC 中断
                }
    }
             }
                V_Scale /= 1024;
                I_Scale /= 1024;
    WDT_OFF = 0;
    TR0 = 1;
ES = 1;
return;

/************************ ADC 中断函数 ******************************
* 名称: ADC_Sever
* 说明: 读取采样数据
* 功能: 保存采样数据
* 调用: 无
* 输入: 无
* 返回值: V_Scale 电压值积、 I_Scale 电流值积  V_power  电源电压值积
*********************************************************************/
void ADC_Sever(void) interrupt 15
{
           EIE2 = 0x00;     // 关 ADC 中断
     if (Bat_power == 0)
        {
   if (Chnnl == 1)
   {
   I_Scale += ADC0;
   }
     else if (Chnnl == 2)
   {
   V_Scale += ADC0;
   }
  else if(Chnnl == 3)
         {
    Chnnl=0;
   }
  }
    else if (Bat_power == 1)
            {
      V_power += ADC0;   
            }
 Frequency ++;
      ADC_End = 1;
return;
}

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(496)
发表于:2007-6-7 23:16:36
标签:无标签

0

[原创] MPK 1210 微型打印机 Demo 程序(续)


/***************************       延时凾数      ********************
* 名称: Delay
* 说明:
* 功能: 延时
* 调用:
* 输入: Temp 延时系数
* 返回值: 无
*********************************************************************/

以下放在这个文件中 <Variable.h> 

 
   unsigned char Index1[16];     // 菜单变量交换数组 

    sbit Print_STR = P1^0;    // 下面是引脚接打印机
    sbit Print_ACK = P1^1;

 

void Delay(char Temp)  
{
               char j;
        while (Temp--)
              {
              for (j=0 ; j <= 50; j++);
              }
return;
}

// *****  接口控制命令  *********
void Command_ACK()
{
 Print_STR = 0;
 Delay(5);
 Print_STR = 1;
 while (Print_ACK);
return;
}

// ****  打印结束 X+N 进纸命令  ****
void Formfeed(char Temp)
{
 P3 = 0x1b;
 Command_ACK();

 P3 = 0x4a;
 Command_ACK();

 P3 = Temp;
 Command_ACK();
return;
}

// ****  打印结束回车换行命令  ****
void Enter()
{
 P3 = 0x0a;
 Command_ACK();

 P3 = 0x0d;
 Command_ACK();
return ;
}

/*******************    字库选择 + 字号选择函数     *****************
* 名称: ASCII_cn(char zh,char xy)
* 说明: 进入字符集选择
* 调用: 接口控制命令 Command_ACK();
* 输入: 字库 zh   1 to 3  , 字号 xy 2 to 8
*********************************************************************/
void ASCII_cn(char zh,char xy)
{
     switch (zh)
   {
      case 1:
     P3 = 0x1c;    // 退出汉字方式命令 
     Command_ACK();
     P3 = 0x2e;   
     Command_ACK();
    
     P3 = 0x1b;      // 进入 ASCII 字符集  一级字库
     Command_ACK();    
     P3 = 0x36;
     Command_ACK();    
              break ;
      case 2:
     P3 = 0x1c;    // 退出汉字方式命令   
     Command_ACK();
     P3 = 0x2e;   
     Command_ACK();

     P3 = 0x1b;      // 进入 ASCII 字符集  二级字库
     Command_ACK();    
     P3 = 0x37;
     Command_ACK();    
              break ;
      case 3:     // 进入汉字方式字符集 三级字库
     P3 = 0x1c;   
     Command_ACK();    
     P3 = 0x26;
     Command_ACK();    
              break ;
   }

   // ****** 放大字体命令  *********
   P3 = 0x1b;   
   Command_ACK();    
   P3 = 0x57;
   Command_ACK();    
    
   P3 = xy;                // 字号 xy 2 to 8
   Command_ACK();    
return;
}
/*************************** 初始化 *********************************
* 名称: Tmod_Primary()
* 说明: 初始化系统
* 功能:
* 调用:
* 输入: 无
* 返回值: 无
*********************************************************************/
void Tmod_Primary(void)
{
         OSCXCN = 0x67; // 内部时钟配置
         OSCICN = 0x15; // 内部时钟 4MHz
          OSCICN = 0x08; // 外部时钟 5.5296MHz

  WDTCN = 0x07;    // 启动看门狗
    WDTCN = 0xDE;
    WDTCN = 0xAD;
    WDTCN = 0xFF;


 PRT1IF = 0x00;     // 端口配置 I/O
 PRT0CF = 0xf5; 
 PRT1CF = 0xf0;
 PRT2CF = 0x7f;
 PRT3CF = 0x00;     // 端口配置 I/O

   XBR0 = 0x0c;  
   XBR1 = 0x04;   
   XBR2 = 0x40;     // 交叉开关配置

        EA = 0;

// ******  初始化打印机  ******
        Print_STR = 1;

  P3 = 0x1b;
  Command_ACK();    

  P3 = 0x40;
  Command_ACK();    
     return;
}

/************************ 打印与显示菜单函数 ******************************
* 名称: Menu_Show(char)
* 说明: 打印与显示菜单
* 功能: 显示设备状态
* 调用:
* 调用:
* 调用:
* 输入: 菜单 Temp01
* 返回值: 无
*********************************************************************/
void Menu_Show(char Temp01)
{
switch(Temp01)
      {
     case 1: 
   Line_1.Char1 = ' ';                // 显示 MEM !!
   Line_1.Char2 = 'M';
   Line_1.Char3 = 'E';
   Line_1.Char4 = 'M';
   Line_1.Char5 = ' ';
   Line_1.Char6 = '!';
   Line_1.Char7 = '!';
   Line_1.Char8 = ' ';

   Line_2.Char1 = 'O';                // Overflow , Memory 存储器以满或溢出
   Line_2.Char2 = 'v';
   Line_2.Char3 = 'e';
   Line_2.Char4 = 'r';
   Line_2.Char5 = 'f'; 
   Line_2.Char6 = 'l';
   Line_2.Char7 = 'o';
   Line_2.Char8 = 'w';
            break ;
     case 2: 
   Line_1.Char1 = 'S';
   Line_1.Char2 = 'u';
   Line_1.Char3 = 'm';
   Line_1.Char4 = ' ';
   Line_1.Char5 = '5';
   Line_1.Char6 = '2';
   Line_1.Char7 = '3';
   Line_1.Char8 = '4';

   Line_2.Char1 = 'F';                // 选择 F1
   Line_2.Char2 = '1';
   Line_2.Char3 = 0x7f;
   Line_2.Char4 = ' ';
   Line_2.Char5 = 'W';                // wale 选择
   Line_2.Char6 = 'a';
   Line_2.Char7 = 'l';
   Line_2.Char8 = 'e';
            break ;
     case 3: 
   Line_1.Char1 = 'C';  // Commence 开始, 着手
   Line_1.Char2 = 'o';
   Line_1.Char3 = 'm';
   Line_1.Char4 = 'm';
   Line_1.Char5 = 'e';
   Line_1.Char6 = 'n';
   Line_1.Char7 = 'c';
   Line_1.Char8 = 'e';

   Line_2.Char1 = 'W';  // Work 手工,操作
   Line_2.Char2 = 'o';
   Line_2.Char3 = 'r';
   Line_2.Char4 = 'k';
   Line_2.Char5 = ' ';
   Line_2.Char6 = 0x7e;
   Line_2.Char7 = 'G';
   Line_2.Char8 = 'o';
            break ;
     case 4: 
   Line_1.Char1 = 'F';  // Fate 天数
   Line_1.Char2 = 'a';
   Line_1.Char3 = 't';
   Line_1.Char4 = 'e';
         Line_1.Char5 = ' ';
   Line_1.Char6 = ' ';
   Line_1.Char7 = '?';
   Line_1.Char8 = '?';

            Line_2.Char1 = 'Q';  // Quiz 提问
   Line_2.Char2 = 'u';
   Line_2.Char3 = 'i';
   Line_2.Char4 = 'z';
   Line_2.Char5 = ' ';
   Line_2.Char6 = ' ';
   Line_2.Char7 = '^';
   Line_2.Char8 = ' ';
            break ;
     case 5: 
   Line_1.Char1 = 'F';  // Fate 天数
   Line_1.Char2 = 'a';
   Line_1.Char3 = 't';
   Line_1.Char4 = 'e';
         Line_1.Char5 = ' ';
   Line_1.Char6 = ' ';

            Line_2.Char1 = 'Q';  // Quiz 提问
   Line_2.Char2 = 'u';
   Line_2.Char3 = 'i';
   Line_2.Char4 = 'z';
   Line_2.Char5 = ' ';
   Line_2.Char6 = ' ';
   Line_2.Char7 = ' ';
   Line_2.Char8 = '^';
            break ;
     case 6: 
   Line_1.Char1 = 'B';  // Base 基数
   Line_1.Char2 = 'a';
   Line_1.Char3 = 's';
   Line_1.Char4 = 'e';
         Line_1.Char5 = ' ';
   Line_1.Char6 = '?';
   Line_1.Char7 = '?';
   Line_1.Char8 = '?';

            Line_2.Char1 = 'Q';  // Quiz 提问
   Line_2.Char2 = 'u';
   Line_2.Char3 = 'i';
   Line_2.Char4 = 'z';
   Line_2.Char5 = ' ';
   Line_2.Char6 = '^';
   Line_2.Char7 = '^';
   Line_2.Char8 = '^';
            break ;
     case 7: 
   Line_1.Char1 = 'P';  // Pray 请求
   Line_1.Char2 = 'r';
   Line_1.Char3 = 'a';
   Line_1.Char4 = 'y';
         Line_1.Char5 = '<';
      Line_1.Char6 = '3';
      Line_1.Char7 = '2';
   Line_1.Char8 = '%';

            Line_2.Char1 = 'C';  // Charge 充电
   Line_2.Char2 = 'h';
   Line_2.Char3 = 'r';
   Line_2.Char4 = 'g';
   Line_2.Char5 = 'e';
   Line_2.Char6 = ' ';
   Line_2.Char7 = '!';
   Line_2.Char8 = '!';
            break ;
     case 8: 
   Line_1.Char1 = 'D';  // 清除 FLASH 存储器
   Line_1.Char2 = 'E';
   Line_1.Char3 = 'L';
   Line_1.Char4 = ' ';
         Line_1.Char5 = 'M';
   Line_1.Char6 = 'E';
   Line_1.Char7 = 'M';
   Line_1.Char8 = '!';

            Line_2.Char1 = 'O';  // Yes On
   Line_2.Char2 = 'n';
   Line_2.Char3 = ' ';
   Line_2.Char4 = '?';  // 显示设置清除密码
   Line_2.Char5 = ' ';
   Line_2.Char6 = 'Y';
   Line_2.Char7 = 'e';
   Line_2.Char8 = 's';
            break ;
     case 9: 
   Line_1.Char1 = ' ';                // 清除 FLASH 存储器
   Line_1.Char2 = 'D';
   Line_1.Char3 = 'E';
   Line_1.Char4 = 'L';
         Line_1.Char5 = ' ';
   Line_1.Char6 = 'O';
   Line_1.Char7 = 'K';
   Line_1.Char8 = ' ';

   Line_2.Char1 = ' ';                // key-press按键
   Line_2.Char2 = 0x7e;
   Line_2.Char3 = 'F';
   Line_2.Char4 = '2';
   Line_2.Char5 = ' '; 
   Line_2.Char6 = 'I';
   Line_2.Char7 = 'n';
   Line_2.Char8 = 's';
            break ;
     case 10: 
      Line_1.Char1 = 'P';
      Line_1.Char2 = 'o';
      Line_1.Char3 = 'w';
      Line_1.Char4 = 'e';
      Line_1.Char5 = 'r';
      Line_1.Char6 = '9';
      Line_1.Char7 = '8';
      Line_1.Char8 = '%';

   Line_2.Char1 = 'B';
   Line_2.Char2 = 'u';
   Line_2.Char3 = 's';
   Line_2.Char4 = 'k';
   Line_2.Char5 = ' ';
   Line_2.Char6 = 'F';
   Line_2.Char7 = '2';
   Line_2.Char8 = 0x7f;
            break ;
     case 11: 
   Line_1.Char1 = 'M';                // Message 通讯消息
   Line_1.Char2 = 'e';
   Line_1.Char3 = 's';
   Line_1.Char4 = 's';
   Line_1.Char5 = 'a';
   Line_1.Char6 = 'g';
   Line_1.Char7 = 'e';
   Line_1.Char8 = '!';

   Line_2.Char1 = 'C';                // COM , Data
   Line_2.Char2 = 'O';
   Line_2.Char3 = 'M';
   Line_2.Char4 = ' ';
   Line_2.Char5 = 'D'; 
   Line_2.Char6 = 'a';
   Line_2.Char7 = 't';
   Line_2.Char8 = 'a';
            break ;
     case 12: 
   Line_1.Char1 = ' ';     // setup 设置
   Line_1.Char2 = 'S';
   Line_1.Char3 = 'e';
   Line_1.Char4 = 't';
   Line_1.Char5 = 'u';
   Line_1.Char6 = 'p';
   Line_1.Char7 = ' ';
   Line_1.Char8 = ' ';

   Line_2.Char1 = 'B';
   Line_2.Char2 = 'u';
   Line_2.Char3 = 's';
   Line_2.Char4 = 'k';
   Line_2.Char5 = ' ';
   Line_2.Char6 = 'O';
   Line_2.Char7 = 'K';
   Line_2.Char8 = ' ';
            break ;
     case 13: 
   Line_1.Char1 = 'S';    // Start-up启动  Estate 状态
   Line_1.Char2 = 't';
   Line_1.Char3 = 'o';
   Line_1.Char4 = 'p';
   Line_1.Char5 = ' ';
   Line_1.Char6 = ' ';
   Line_1.Char7 = 'U';
   Line_1.Char8 = 'p';

   Line_2.Char1 = 'F';    // 启动 again 再一次
   Line_2.Char2 = '1';
   Line_2.Char3 = 0x7f;
   Line_2.Char4 = 'I';
   Line_2.Char5 = 'n'; 
   Line_2.Char6 = 0x7e;
   Line_2.Char7 = 'F';
   Line_2.Char8 = '3';
            break ;
     case 14: 
      Line_1.Char1 = '2';    // check 检查, 制止, 核对
      Line_1.Char2 = '2';
      Line_1.Char3 = '0';
      Line_1.Char4 = 0x7f;
      Line_1.Char5 = 0x7e;
      Line_1.Char6 = '5';
      Line_1.Char7 = '0';
      Line_1.Char8 = '0';

   Line_2.Char1 = 0x7e;    // key-press按键
   Line_2.Char2 = 'F';
   Line_2.Char3 = '2';
   Line_2.Char4 = ' ';
   Line_2.Char5 = 'W';     // wale 选择 
   Line_2.Char6 = 'a';
   Line_2.Char7 = 'l';
   Line_2.Char8 = 'e';
            break ;
    default: // ???
   break ;
       }

  Index1[0]  = Line_1.Char1;
  Index1[1]  = Line_1.Char2;
  Index1[2]  = Line_1.Char3;
  Index1[3]  = Line_1.Char4;
  Index1[4]  = Line_1.Char5;
  Index1[5]  = Line_1.Char6;
  Index1[6]  = Line_1.Char7;
  Index1[7]  = Line_1.Char8;
 
  Index1[8]  = Line_2.Char1;
  Index1[9]  = Line_2.Char2;
  Index1[10] = Line_2.Char3;
  Index1[11] = Line_2.Char4;
  Index1[12] = Line_2.Char5;
  Index1[13] = Line_2.Char6;
  Index1[14] = Line_2.Char7;
  Index1[15] = Line_2.Char8;
  return;
}

 

系统分类: 单片机   |    用户分类: 无分类    |    来源: 原创

评论(1) | 阅读(470)
发表于:2007-6-7 23:14:51
标签:无标签

0

[原创] MPK 1210 微型打印机 Demo 程序

[原创] MPK 1210 微型打印机 Demo 程序

#include <C:\Keil\C51\INC\Cygnal\c8051F000.h>    
#include <C:\Keil\C51\INC\math.h>
#include <Variable.h>

以下再创建 Main 程序文件


 void New_Main(void);            // 打印 DEMO
 void Tmod_Primary(void);           // 初始化
 void ASCII_cn(char zh,char xy);   // 字库与字号选择函数

void main ()
{
        Tmod_Primary();
 while(1)New_Main();
}

/************************    打印 DEMO        ***********************
* 名称: New_Main()
* 说明:
* 功能:
* 调用:
* 调用:
* 调用:
* 返回值:
*********************************************************************/
void New_Main(void)
{
unsigned char j1 = 0,j2 = 0;

     ASCII_cn(1,3);          // 字库选择 1 to 3 + 字号选择 2 to 8

for (j1=1 ; j1 <= 14 ; j1++)
 {
    Menu_Show(j1);           // ???

 for (j2=0 ; j2 <= 15 ; j2++)
  {
  P3 = Index1[j2];  // Index1[j] 打印内容
  Command_ACK();       // 调用: 接口控制命令
  }
 Enter();           // 回车换行命令
 }

 Formfeed(50);            // 进纸命令 0 to 255

Command_ACK();
return ;
}

以上是主程序 ^^^^^^^^^^

/*

系统主控制程序 MPK 1210  微型打印机是一款手持式热敏打印机。

引脚号  引脚名称  信号传输方向  说    明
 
1   STB(片选)  输入  选通触发,上升沿时读入数据 
3   D0(数据线)  输入  数据信号线,分别代表并行数据线零位到第八位的信息。信号输入为高电平,表示为逻辑“1”;输入为低电平,表示为逻辑“0” 
5   D1(数据线)  输入 
7   D2(数据线)  输入 
9   D3(数据线)  输入 
11  D4(数据线)  输入 
13  D5(数据线)  输入 
15  D6(数据线)  输入 
17  D7(数据线)  输入 
19  ACK(应答线)  输出  低电平表示数据已接收,且可接收下一组数据 
21  BUSY(忙信号)  输出  高电平表示打印机“忙”,不能接收数据 
23  PE(检测纸)  输出  高电平表示打印机有纸,低电平表示无纸 
25  SEL(状态线)  输出  一般接上拉电阻,表示打印机“在线” 
4   ERR(状态线)  输出  一般接上拉电阻,表示打印机无故障 
2,6,8,26  NC(空)  -  可以不接,或者接上拉电阻。一般情况下,为防止干扰建议接入上拉电阻 
10~24  GND(电源地)  -  接5V电源地。仅指10~24之间的偶数号引脚 

*/

 

系统分类: 单片机   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(458)
发表于:2007-5-12 23:01:07
标签:无标签

2

Max_187 ADC 小程序非常好用


#include <reg51.h>
                
                  int y;
sbit DAT = P1^0;
sbit CS2 = P1^1;
sbit CLK = P1^2;


unsigned int M_187();

void main()
{
unsigned long f;
  y="0";
 for (;y < 1024;)
     {      
     f += M_187();
     }
  f = f / 1024;  
  f="0";
}

unsigned int M_187()
{
  char i ;
  int  b = 0 ;
  CS2 = 0;
  for (;DAT != 1;) ;
  for (i = 12 ; i > 0 ; i--)
      {
      CLK = 0;
      CLK = 1;
      b <<= 1;
      if (DAT) b |= 0x01;
      }
  CS2 = 1;
  y++;
  return(b);
}

系统分类: 单片机   |    用户分类: 无分类    |    来源: 原创

评论(1) | 阅读(593)
总共 , 当前 /