• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

今天刚刚弄好的STC单片机免重启下载线!

  自己在学51单片机时选用的是AT89S5X系列的单片机,后来接触到STC89C5X系列和STC12、15系列后因为丰富的内部资源和合适的价格,而且直接用串口就能下载程序,大多数基本选用了STC的单片机。

  但是STC单片机有个说麻烦不麻烦,但说不麻烦又挺烦的问题。就是下载程序时需要重启电源,在写程序验证过程中不断修改程序在所难免,于是重启电源就成了不小的负担,而且影响心情还伤电源开关,这点就足以让我还对ATMEL的SPI烧写余情未了!人家多方便,一键OK。

  于是乎!百度看看有没有可以解决这个问题的方法,果然这STC单片机的这个不方便大家都有共识,但是真正有人愿意共享出来的资料,要么程序一看就有错误,分明STC15F104W没有串口模块偏写个串口中断,贴个电路图和程序都不搭边。。。我无语,看了文库里的资料那叫一个内牛满面。。。发资料的人你就不能不嘚瑟嘛,把他的心路历程有感情的看完后才发现人家也是COPY的,而且经过美化完全不成样子。。。

  于是乎!还是自力更生吧。。主控芯片选用STC15F104W。我喜欢STC15F104W这块单片机,因为它只有8个脚,小巧玲珑的东西就是看着喜欢。但为什么不给它装个UART模块,老姚(网上都这么叫)实在是太小气了!

  虽然说网上资料很坑,但是起码思路还有那么一丝靠谱。原理很简单,无非就是STC_ISP这个软件在加载完HEX文件后点击“下载”后,软件会给选中串口发送一连串相同的数据,我叫他握手信号吧,这个握手信号其实就是一个固定的波形,无非我用2400bps的波特率读出是“0x7F”,用9600bps读出的是“0xF8”,我程序就是9600bps的波特率。或者其他波特率读出是啥。。。自己看看就知道了。。。

  STC的单片机上电后首先是执行一小段验证程序,判断是否要进入烧写程序过程,如果没有这个验证信号就执行ROM里的程序,当然这个验证的程序是STC单片机生产时就定义了的我们没法改变。

  我要实现不用手动上电,那必须需要一个“电子开关”来帮我上电,三极管、继电器、MOS管。。。。随便你。

  我用的是继电器来给需要编程的STC单片机重新上电的。电路很简单,就一个8550加个电阻驱动一个小继电器再加个续流二极管,继电器控制电源正极对待编程单片机的供电,选择常闭那对接口。

  整个程序很简单,就是利用IO口来模拟串口接收数据,判断当连续接收到若干个握手信号后判断,断开待编程单片机的电源一段时间后重新接通电源,整个过程监控芯片(STC15F104W)没有输出数据到串口线,不影响STC单片机的烧写。

  最终效果很不错,达到预期的效果了。。。。感兴趣的你也试试!

  大体原理就这样,不喜欢藏着掖着,下面是所有资料:STC15F104免上电下载线.rar

上测试图,虽然这个效果在图片上完全不能体现,但还是喜欢贴子里有图片。

  

全部回复(11)
正序查看
倒序查看
2014-04-08 17:19
好帖子,感谢wwpwwp20088!
0
回复
178064035
LV.4
3
2014-04-11 19:20

我也做了一个STC免启动下载板,带逻辑分析仪。可以支持多种STC芯片下载

 

// 作品:STC免手动烧写(自适应波特率自动冷启) + 简易逻辑分析仪
// 主控:STC15F104E
// 晶振:45MHz
// 编译:Keil uVision4 V9.50a
// 
// 说明:自适应STC-ISP软件最低波特率(1200bps/2400bps/4800bps)
//		 3种模式:①自动烧写  (默认)	   【LED_key不亮:模式① ,LED亮:通电 ,LED不亮:关电】
//		          ②逻辑分析仪(正向波形) 【LED_key亮  :模式② ,LED亮:预备 ,LED不亮:采样】
//		          ③逻辑分析仪(反向波形) 【LED_key闪烁:模式③ ,LED亮:预备 ,LED不亮:采样】
//       ①②③模式下,系统板都可以正常串口通信。
//       ②③模式下,也可以烧写程序(手动烧写),不过正在“采样”时请不要烧写程序以及系统板串口通信。
//
// 	 注:建议烧写程序时启动看门狗(预分频数256,约2.2S @ 45MHz)
//
//	 另:关于STC-ISP V4.88版本,发现用PL2303HX芯片烧写STC15系列很难成功,最低/高波特率都选用4800bps才可以烧写。
//		 关于STC-ISP V6.06版本,用PL2303HX芯片烧写STC15系列非常好(直接用默认的最低/高波特率),
//       但V6.06版本内部R/C振荡器最高只可以选33.1776MHz。
//		 用FT232芯片烧写,则通杀STC-ISP所有版本(直接用默认的最低/高波特率)。
//
//※ 江湖游客BXAK,2011/10/30
//※ http://hi.baidu.com/江湖游客bxak/home

#include "STC15F104E.H"
#include "MY_SET.h"

 sbit LED   = P3^0;	 //指示灯
 sbit KEY   = P3^1;  //按键
 sbit TXB   = P3^2;                       
 sbit RXB   = P3^3;
 sbit PNP   = P3^4;	 //PNP三极管
 sbit IO_in = P3^5;	 //分析仪采样引脚

uint8   Mode;		 //模式
bit		B_init;		 //初始化标志
uint8   KEY_Value; 	 //按键消抖计数
bit	    ON;			 //按键标志
bit     Over;
bit		LED_key;	 //模式指示灯(在按键上扩展)
uint16  Count;		 //闪烁计数
bit     P_N;		 //正向标志
uint8   BIT8,cnt,Dat;
uint16  Time;

uint8 TBUF,RBUF;	 //发送/接收缓存
uint8 TDAT,RDAT;	 //发送/接收数据暂存
uint8 TCNT,RCNT;	 //发送/接收计数器
uint8 TBIT,RBIT;	 //发送/接收比特数
bit   TING,RING;	 //开始发送/接收标志
bit   TEND,REND;	 //发送/接收完成标志

bit   START;         //重启标志
uint8 Correct_nums;	 //『连续正确』计数器
uint8 Error_nums;	 //错误累加计数器
uint8 Status;        //波特率状态

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:延时
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void YS(uint8 n)
{
  uint8 a,b,c;

  while(n--)
  {
	 for(c=66;c>0;c--)
     for(b=100;b>0;b--)
     for(a=100;a>0;a--);
  }
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:串口初始化
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void UART_INIT()
{
   TING = 0;
   RING = 0;
   TEND = 1;
   REND = 0;
   TCNT = 0;
   RCNT = 0;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:逻辑分析仪初始化
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Analyzer_Init()		
{
   TR1 = 0;
   TF1 = 0;
   Time = 0;
   BIT8 = 0;
   TL0 = 0x7E; 	 //初始化T0和设定重载值
   TH0 = 0xFF;	 //修改成 115200bps
   LED = 0;		 //指示灯开
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:自动烧写模式下波特率切换(定时器0模拟)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void UART_Change()
{
   if(++Status > 2)Status=0;
   switch(Status)
   {
	 case 0: TL0=(65536-15000000/1200); TH0=(65536-15000000/1200)>>8; break; // 1200bps 
	 case 1: TL0=(65536-15000000/2400); TH0=(65536-15000000/2400)>>8; break; // 2400bps 
	 case 2: TL0=(65536-15000000/4800); TH0=(65536-15000000/4800)>>8; break; // 4800bps 
   }
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:重启程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Restart()
{		 	 
  if(START)
  {
	 START = 0;
				 
	 TR0 = 0;
	 PNP = 1;		    //关电
	 LED = 1;
	 YS(10);	        //从『加载HEX』到『提示上电』有5秒,但不必等到『提示上电』
	 WDT_CONR |= 0x10;  //清看门狗(预分频数256,约2.2S @ 45MHz)
	 PNP = 0;		    //通电
 	 LED = 0;
	 YS(30);
	 WDT_CONR |= 0x10;  //清看门狗(预分频数256,约2.2S @ 45MHz)

	 TR0 = 1;
	 RING = 0;
     REND = 0;
     RCNT = 0;
  }
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main()
{
   uint8 i;
	
   P33 	= 1;
   WDT_CONR |= 0x10; //清看门狗(预分频数256,约2.2S @ 45MHz)	
   PNP = 0;		     //通电
   LED  = 0;
   LED_key = 1;		 //关
   
   for(i=0;i<30;i++){ YS(1); LED = ~LED; } //冷启/低压复位 指示
   WDT_CONR |= 0x10; //清看门狗(预分频数256,约2.2S @ 45MHz)
   		   
   TMOD = 0x00;      //T0、T1处于16位自动重装模式
   AUXR = 0xC0;      //T0、T1工作在1T模式 
   TL1 = (65536-903);
   TH1 = (65536-903)>>8;	  			    
   UART_Change();
   TR0 = 1;  
   EA  = 1;        
   ET0 = 1;  
   PT0 = 1;          //提高T0的中断优先级
   ET1 = 1;                 			  
   UART_INIT();

   Mode = 0;

   while(1)
   {                             
	 switch(Mode)
     {
	    case 0: if(B_init)
		        { 
				   B_init=0; 
				   TR1=0; 
                   PNP = 0;		     //通电
				   LED=0; 
				   UART_Change(); 
				   UART_INIT();
				}
				Restart();	
			    LED_key = 1;	   			         
		        break;  

	    case 1: if(B_init){ B_init=0; P_N=1; Analyzer_Init(); }
		        if(!IO_in){ TR1=1; LED=1;  }        //启动定时器1,采样开始
	            if(Over)  
				{ 
				   Over=0; 
				   if(++Time > 3320)Analyzer_Init();//约16.6秒(5ms * 3320),即每次采集完,过4秒(16.6S-12.6S)后重新工作 
				} 
				LED_key = 0;					     
		        break;

		case 2: if(B_init){ B_init=0; P_N=0; Analyzer_Init(); }
		        if(!IO_in){ TR1=1; LED=1;  }        
	            if(Over)
				{ 
				   Over=0; 
				   if(++Time > 3320)Analyzer_Init(); 
				} 
				if(++Count >10000){ Count=0; LED_key=!LED_key;} //闪烁
		        break;
	
		default:Mode=0;
		        break;		
     }
	 
	 //按键检测
	 KEY = 1;		  //拉高电平
	 NOP12();		  //稍微延时
	 if(!KEY)
	 {
		if(ON==0)KEY_Value++;
		if(KEY_Value > 200)
	    {
	       KEY_Value = 0; 
		   ON = 1;	      //按键标志置“1”	   
		   if(++Mode > 2)Mode=0;
		   B_init = 1;	  //『初始化标志』置“1”
	    }
	 }
	 else { KEY_Value=0; ON=0; } 
						    
	 //恢复指示灯状态
	 if(LED_key)KEY=1; 
	 else       KEY=0;

	 WDT_CONR |= 0x10;     //清看门狗(预分频数256,约2.2S @ 45MHz)
   }
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:定时器0中断程序,模拟串口
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void tm0() interrupt 1 using 1
{					
   if(RING)
   {
      if(--RCNT == 0)
      {
         RCNT = 3;             //复位接收波特率计数器
         if(--RBIT == 0)
         {		  
            RBUF = RDAT;       //保存数据到RBuf管理
            RING = 0;          //停止接收
            REND = 1;          //设置接收完成标志
         }
         else
         {
            RDAT >>= 1;
            if(RXB) RDAT |= 0x80; //RX数据转移到RX缓冲区
         }
      }
   }
   else if(!RXB)			   //是否检测到低电平
   {
      RING = 1;                //设置开始接收标志
      RCNT = 4;                //初始接收波特率计数器
      RBIT = 9;                //初化始接收比特数(8个数据位+1个停止位)
   }
    
   if(--TCNT == 0)
   {
      TCNT = 3;                //复位发送波特率计数器
      if(TING)                 //判断是否发送
      {
         if(TBIT == 0)
         {
            TXB = 0;           //发送起始位
            TDAT = TBUF;       //加载数据从TBUF至TDAT
            TBIT = 9;          //初化始发送比特数(8位数据位+1个停止位)
         }
		 else
         {
            TDAT >>= 1;        //位移数据至CY
            if(--TBIT == 0)
            {
               TXB = 1;
               TING = 0;       //停止发送
               TEND = 1;       //设置发送完成标志
            }
            else
            {
               TXB = CY;       //写CY至TX端口
            }
         }
      }
   }
					  
   if((Mode==0) && REND)			
   {				   
      REND = 0;
      if(RBUF == 0x7F)
	  { 		   	   	 
		 if(++Correct_nums > 10)
		 {				 
		    START=1;            
			Correct_nums=0;	
			Error_nums=0;
		 }
	  } 
	  else 		   
	  {
	     Correct_nums=0;
		 if(++Error_nums > 6)
		 {
		    TR0 = 0;
			Error_nums=0;
			Correct_nums=0;	
			UART_Change();
            RING = 0;
            REND = 0;
            RCNT = 0;
			TR0 = 1;
		 } 
	  }
   }
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:定时器1中断程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void tm1() interrupt 3         
{						   
	if(IO_in)Dat |= 0x01;   
 	if(++BIT8 == 8) 		 //每采集8次发送一次
	{
	  if(P_N)TBUF =  Dat;	 //正向输出
	  else	 TBUF = ~Dat;	 //反向输出
      TING = 1;
	  BIT8 = 0;
  	}
	Dat <<= 1;			 
	if(++cnt == 0)Over=1;     //约5ms置1一次
}

 

0
回复
2014-04-11 22:53
@178064035
[图片]我也做了一个STC免启动下载板,带逻辑分析仪。可以支持多种STC芯片下载 //作品:STC免手动烧写(自适应波特率自动冷启)+简易逻辑分析仪//主控:STC15F104E//晶振:45MHz//编译:KeiluVision4V9.50a////说明:自适应STC-ISP软件最低波特率(1200bps/2400bps/4800bps)//3种模式:①自动烧写(默认)【LED_key不亮:模式①,LED亮:通电,LED不亮:关电】//②逻辑分析仪(正向波形)【LED_key亮:模式②,LED亮:预备,LED不亮:采样】//③逻辑分析仪(反向波形)【LED_key闪烁:模式③,LED亮:预备,LED不亮:采样】//①②③模式下,系统板都可以正常串口通信。//②③模式下,也可以烧写程序(手动烧写),不过正在“采样”时请不要烧写程序以及系统板串口通信。////注:建议烧写程序时启动看门狗(预分频数256,约2.2S@45MHz)////另:关于STC-ISPV4.88版本,发现用PL2303HX芯片烧写STC15系列很难成功,最低/高波特率都选用4800bps才可以烧写。//关于STC-ISPV6.06版本,用PL2303HX芯片烧写STC15系列非常好(直接用默认的最低/高波特率),//但V6.06版本内部R/C振荡器最高只可以选33.1776MHz。//用FT232芯片烧写,则通杀STC-ISP所有版本(直接用默认的最低/高波特率)。////※江湖游客BXAK,2011/10/30//※http://hi.baidu.com/江湖游客bxak/home#include"STC15F104E.H"#include"MY_SET.h"sbitLED=P3^0;//指示灯sbitKEY=P3^1;//按键sbitTXB=P3^2;sbitRXB=P3^3;sbitPNP=P3^4;//PNP三极管sbitIO_in=P3^5;//分析仪采样引脚uint8Mode;//模式bitB_init;//初始化标志uint8KEY_Value;//按键消抖计数bitON;//按键标志bitOver;bitLED_key;//模式指示灯(在按键上扩展)uint16Count;//闪烁计数bitP_N;//正向标志uint8BIT8,cnt,Dat;uint16Time;uint8TBUF,RBUF;//发送/接收缓存uint8TDAT,RDAT;//发送/接收数据暂存uint8TCNT,RCNT;//发送/接收计数器uint8TBIT,RBIT;//发送/接收比特数bitTING,RING;//开始发送/接收标志bitTEND,REND;//发送/接收完成标志bitSTART;//重启标志uint8Correct_nums;//『连续正确』计数器uint8Error_nums;//错误累加计数器uint8Status;//波特率状态/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:延时┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidYS(uint8n){uint8a,b,c;while(n--){for(c=66;c>0;c--)for(b=100;b>0;b--)for(a=100;a>0;a--);}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:串口初始化┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidUART_INIT(){TING=0;RING=0;TEND=1;REND=0;TCNT=0;RCNT=0;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:逻辑分析仪初始化┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidAnalyzer_Init(){TR1=0;TF1=0;Time=0;BIT8=0;TL0=0x7E;//初始化T0和设定重载值TH0=0xFF;//修改成115200bpsLED=0;//指示灯开}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:自动烧写模式下波特率切换(定时器0模拟)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidUART_Change(){if(++Status>2)Status=0;switch(Status){case0:TL0=(65536-15000000/1200);TH0=(65536-15000000/1200)>>8;break;//1200bpscase1:TL0=(65536-15000000/2400);TH0=(65536-15000000/2400)>>8;break;//2400bpscase2:TL0=(65536-15000000/4800);TH0=(65536-15000000/4800)>>8;break;//4800bps}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:重启程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidRestart(){if(START){START=0;TR0=0;PNP=1;//关电LED=1;YS(10);//从『加载HEX』到『提示上电』有5秒,但不必等到『提示上电』WDT_CONR|=0x10;//清看门狗(预分频数256,约2.2S@45MHz)PNP=0;//通电LED=0;YS(30);WDT_CONR|=0x10;//清看门狗(预分频数256,约2.2S@45MHz)TR0=1;RING=0;REND=0;RCNT=0;}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidmain(){uint8i;P33=1;WDT_CONR|=0x10;//清看门狗(预分频数256,约2.2S@45MHz)PNP=0;//通电LED=0;LED_key=1;//关for(i=0;i>8;UART_Change();TR0=1;EA=1;ET0=1;PT0=1;//提高T0的中断优先级ET1=1;UART_INIT();Mode=0;while(1){switch(Mode){case0:if(B_init){B_init=0;TR1=0;PNP=0;//通电LED=0;UART_Change();UART_INIT();}Restart();LED_key=1;break;case1:if(B_init){B_init=0;P_N=1;Analyzer_Init();}if(!IO_in){TR1=1;LED=1;}//启动定时器1,采样开始if(Over){Over=0;if(++Time>3320)Analyzer_Init();//约16.6秒(5ms*3320),即每次采集完,过4秒(16.6S-12.6S)后重新工作}LED_key=0;break;case2:if(B_init){B_init=0;P_N=0;Analyzer_Init();}if(!IO_in){TR1=1;LED=1;}if(Over){Over=0;if(++Time>3320)Analyzer_Init();}if(++Count>10000){Count=0;LED_key=!LED_key;}//闪烁break;default:Mode=0;break;}//按键检测KEY=1;//拉高电平NOP12();//稍微延时if(!KEY){if(ON==0)KEY_Value++;if(KEY_Value>200){KEY_Value=0;ON=1;//按键标志置“1”if(++Mode>2)Mode=0;B_init=1;//『初始化标志』置“1”}}else{KEY_Value=0;ON=0;}//恢复指示灯状态if(LED_key)KEY=1;elseKEY=0;WDT_CONR|=0x10;//清看门狗(预分频数256,约2.2S@45MHz)}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:定时器0中断程序,模拟串口┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidtm0()interrupt1using1{if(RING){if(--RCNT==0){RCNT=3;//复位接收波特率计数器if(--RBIT==0){RBUF=RDAT;//保存数据到RBuf管理RING=0;//停止接收REND=1;//设置接收完成标志}else{RDAT>>=1;if(RXB)RDAT|=0x80;//RX数据转移到RX缓冲区}}}elseif(!RXB)//是否检测到低电平{RING=1;//设置开始接收标志RCNT=4;//初始接收波特率计数器RBIT=9;//初化始接收比特数(8个数据位+1个停止位)}if(--TCNT==0){TCNT=3;//复位发送波特率计数器if(TING)//判断是否发送{if(TBIT==0){TXB=0;//发送起始位TDAT=TBUF;//加载数据从TBUF至TDATTBIT=9;//初化始发送比特数(8位数据位+1个停止位)}else{TDAT>>=1;//位移数据至CYif(--TBIT==0){TXB=1;TING=0;//停止发送TEND=1;//设置发送完成标志}else{TXB=CY;//写CY至TX端口}}}}if((Mode==0)&&REND){REND=0;if(RBUF==0x7F){if(++Correct_nums>10){START=1;Correct_nums=0;Error_nums=0;}}else{Correct_nums=0;if(++Error_nums>6){TR0=0;Error_nums=0;Correct_nums=0;UART_Change();RING=0;REND=0;RCNT=0;TR0=1;}}}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:定时器1中断程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidtm1()interrupt3{if(IO_in)Dat|=0x01;if(++BIT8==8)//每采集8次发送一次{if(P_N)TBUF=Dat;//正向输出elseTBUF=~Dat;//反向输出TING=1;BIT8=0;}Dat
居然放个ATMEL的单片机。比我的好看,说说看,怎么实现逻辑分析的?
0
回复
shenx123
LV.10
5
2014-04-24 14:08

我也想做DIY板, 给我点建议啊

0
回复
2014-04-25 22:16
唉,我天生就喜欢看别人做实验,楼主, 再表述的详细点,我收藏了
0
回复
2014-04-26 20:37
@山东大汉
唉,我天生就喜欢看别人做实验,楼主,再表述的详细点,我收藏了
我觉得我描述得已经够了。。。稍有点单片机基础完全OK的!
0
回复
2014-04-27 00:04
@wwpwwp20088
我觉得我描述得已经够了。。。稍有点单片机基础完全OK的!
蛮好的,我比较喜欢看视频
0
回复
2014-04-27 11:45
@178064035
[图片]我也做了一个STC免启动下载板,带逻辑分析仪。可以支持多种STC芯片下载 //作品:STC免手动烧写(自适应波特率自动冷启)+简易逻辑分析仪//主控:STC15F104E//晶振:45MHz//编译:KeiluVision4V9.50a////说明:自适应STC-ISP软件最低波特率(1200bps/2400bps/4800bps)//3种模式:①自动烧写(默认)【LED_key不亮:模式①,LED亮:通电,LED不亮:关电】//②逻辑分析仪(正向波形)【LED_key亮:模式②,LED亮:预备,LED不亮:采样】//③逻辑分析仪(反向波形)【LED_key闪烁:模式③,LED亮:预备,LED不亮:采样】//①②③模式下,系统板都可以正常串口通信。//②③模式下,也可以烧写程序(手动烧写),不过正在“采样”时请不要烧写程序以及系统板串口通信。////注:建议烧写程序时启动看门狗(预分频数256,约2.2S@45MHz)////另:关于STC-ISPV4.88版本,发现用PL2303HX芯片烧写STC15系列很难成功,最低/高波特率都选用4800bps才可以烧写。//关于STC-ISPV6.06版本,用PL2303HX芯片烧写STC15系列非常好(直接用默认的最低/高波特率),//但V6.06版本内部R/C振荡器最高只可以选33.1776MHz。//用FT232芯片烧写,则通杀STC-ISP所有版本(直接用默认的最低/高波特率)。////※江湖游客BXAK,2011/10/30//※http://hi.baidu.com/江湖游客bxak/home#include"STC15F104E.H"#include"MY_SET.h"sbitLED=P3^0;//指示灯sbitKEY=P3^1;//按键sbitTXB=P3^2;sbitRXB=P3^3;sbitPNP=P3^4;//PNP三极管sbitIO_in=P3^5;//分析仪采样引脚uint8Mode;//模式bitB_init;//初始化标志uint8KEY_Value;//按键消抖计数bitON;//按键标志bitOver;bitLED_key;//模式指示灯(在按键上扩展)uint16Count;//闪烁计数bitP_N;//正向标志uint8BIT8,cnt,Dat;uint16Time;uint8TBUF,RBUF;//发送/接收缓存uint8TDAT,RDAT;//发送/接收数据暂存uint8TCNT,RCNT;//发送/接收计数器uint8TBIT,RBIT;//发送/接收比特数bitTING,RING;//开始发送/接收标志bitTEND,REND;//发送/接收完成标志bitSTART;//重启标志uint8Correct_nums;//『连续正确』计数器uint8Error_nums;//错误累加计数器uint8Status;//波特率状态/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:延时┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidYS(uint8n){uint8a,b,c;while(n--){for(c=66;c>0;c--)for(b=100;b>0;b--)for(a=100;a>0;a--);}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:串口初始化┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidUART_INIT(){TING=0;RING=0;TEND=1;REND=0;TCNT=0;RCNT=0;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:逻辑分析仪初始化┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidAnalyzer_Init(){TR1=0;TF1=0;Time=0;BIT8=0;TL0=0x7E;//初始化T0和设定重载值TH0=0xFF;//修改成115200bpsLED=0;//指示灯开}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:自动烧写模式下波特率切换(定时器0模拟)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidUART_Change(){if(++Status>2)Status=0;switch(Status){case0:TL0=(65536-15000000/1200);TH0=(65536-15000000/1200)>>8;break;//1200bpscase1:TL0=(65536-15000000/2400);TH0=(65536-15000000/2400)>>8;break;//2400bpscase2:TL0=(65536-15000000/4800);TH0=(65536-15000000/4800)>>8;break;//4800bps}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:重启程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidRestart(){if(START){START=0;TR0=0;PNP=1;//关电LED=1;YS(10);//从『加载HEX』到『提示上电』有5秒,但不必等到『提示上电』WDT_CONR|=0x10;//清看门狗(预分频数256,约2.2S@45MHz)PNP=0;//通电LED=0;YS(30);WDT_CONR|=0x10;//清看门狗(预分频数256,约2.2S@45MHz)TR0=1;RING=0;REND=0;RCNT=0;}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidmain(){uint8i;P33=1;WDT_CONR|=0x10;//清看门狗(预分频数256,约2.2S@45MHz)PNP=0;//通电LED=0;LED_key=1;//关for(i=0;i>8;UART_Change();TR0=1;EA=1;ET0=1;PT0=1;//提高T0的中断优先级ET1=1;UART_INIT();Mode=0;while(1){switch(Mode){case0:if(B_init){B_init=0;TR1=0;PNP=0;//通电LED=0;UART_Change();UART_INIT();}Restart();LED_key=1;break;case1:if(B_init){B_init=0;P_N=1;Analyzer_Init();}if(!IO_in){TR1=1;LED=1;}//启动定时器1,采样开始if(Over){Over=0;if(++Time>3320)Analyzer_Init();//约16.6秒(5ms*3320),即每次采集完,过4秒(16.6S-12.6S)后重新工作}LED_key=0;break;case2:if(B_init){B_init=0;P_N=0;Analyzer_Init();}if(!IO_in){TR1=1;LED=1;}if(Over){Over=0;if(++Time>3320)Analyzer_Init();}if(++Count>10000){Count=0;LED_key=!LED_key;}//闪烁break;default:Mode=0;break;}//按键检测KEY=1;//拉高电平NOP12();//稍微延时if(!KEY){if(ON==0)KEY_Value++;if(KEY_Value>200){KEY_Value=0;ON=1;//按键标志置“1”if(++Mode>2)Mode=0;B_init=1;//『初始化标志』置“1”}}else{KEY_Value=0;ON=0;}//恢复指示灯状态if(LED_key)KEY=1;elseKEY=0;WDT_CONR|=0x10;//清看门狗(预分频数256,约2.2S@45MHz)}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:定时器0中断程序,模拟串口┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidtm0()interrupt1using1{if(RING){if(--RCNT==0){RCNT=3;//复位接收波特率计数器if(--RBIT==0){RBUF=RDAT;//保存数据到RBuf管理RING=0;//停止接收REND=1;//设置接收完成标志}else{RDAT>>=1;if(RXB)RDAT|=0x80;//RX数据转移到RX缓冲区}}}elseif(!RXB)//是否检测到低电平{RING=1;//设置开始接收标志RCNT=4;//初始接收波特率计数器RBIT=9;//初化始接收比特数(8个数据位+1个停止位)}if(--TCNT==0){TCNT=3;//复位发送波特率计数器if(TING)//判断是否发送{if(TBIT==0){TXB=0;//发送起始位TDAT=TBUF;//加载数据从TBUF至TDATTBIT=9;//初化始发送比特数(8位数据位+1个停止位)}else{TDAT>>=1;//位移数据至CYif(--TBIT==0){TXB=1;TING=0;//停止发送TEND=1;//设置发送完成标志}else{TXB=CY;//写CY至TX端口}}}}if((Mode==0)&&REND){REND=0;if(RBUF==0x7F){if(++Correct_nums>10){START=1;Correct_nums=0;Error_nums=0;}}else{Correct_nums=0;if(++Error_nums>6){TR0=0;Error_nums=0;Correct_nums=0;UART_Change();RING=0;REND=0;RCNT=0;TR0=1;}}}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:定时器1中断程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidtm1()interrupt3{if(IO_in)Dat|=0x01;if(++BIT8==8)//每采集8次发送一次{if(P_N)TBUF=Dat;//正向输出elseTBUF=~Dat;//反向输出TING=1;BIT8=0;}Dat
谢谢提供代码。。。
0
回复
2014-06-26 13:43

我自己也做个几条,现在不记得了,反正插在串口就可以反复直接下载程序。

板上加了个MOS,用来延时控制输出5V

0
回复
wwpwwp20088
LV.5
11
2014-06-27 19:32
@贺赫无名
我自己也做个几条,现在不记得了,反正插在串口就可以反复直接下载程序。板上加了个MOS,用来延时控制输出5V
其实继电器、三极管、MOS。。。。只要是开关元件都行,我手头有个小继电器没用就图方便焊上去了,可以听见滴答声比较舒服。。。呵呵。。
0
回复
2014-07-20 10:40
 

有偿求数字电流电压表,要求如下:

空间器件排放要求

1:在25mm(长)*28mm(宽)这个区域内左边放三个数码管,从下向上,一次放三个数码管。

2:在最下面数码管下面放两个发光二极管,分别是“V”“A

3:在这个区域内右边放三个按键,从下向上,一次放三个按键,分别是“向上”“向下”“循环”

器件要求:

1:数码管尽可能小,三个单独,或者三个一起的,共阴共阳无要求。

2:使用ST公司单片机STM8S003F3P6TR

3:器件在市场上容易买到。

技术条件:

1:输入电压为DC10V~DC14V,精度小数点后一位。

2:环境温度-2540

3显示电流0A-4A,精度小数点后两位。

软件要求:

1:默认显示输出电流值,点亮“A”发光二极管。

2:按一下键“循环”,显示输出电压值,点亮“V”发光二极管

3:再按一下键“循环”,就轮流显示输出电压电流

4:按一下键“向上”,能够调高输出电压,每次0.1V,一直可以调节到DC14V,再按向上键,无效。

5:按一下键“向下”,能够调低输出电压,每次0.1V,一直可以调节到DC10V,再按向下键,无效。

6485通信接口,通过AB可以读取输出电压输出电流,也调节输出电压。

成本要求:

1:低于8元。

工艺要求:

便于加工。

有意者联系QQ67418420,价格面议。

0
回复