这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » th152210的MCU DIY进程贴-自动校时万年历之收音机

共54条 4/6 |‹ 1 2 3 4 5 6 跳转至
助工
2011-12-23 09:27:20     打赏
31楼
等待了好几天,终于收到货了。   这几天将串口电路焊接好,准备开始学习stc单片机。首先应该做的是程序下载。怕我的pl2303模块不能用,我还从淘宝网上购买了一个usb转rs232的连接线。设置好下载软件,开始下载程序。 被重重的打击了,居然还是那天那个情况:仍在连接中, 请给 MCU 上电... 怎么回事,这次又是什么原因? 取下单片机,短接p3.0和p3.1,串口调试助手发送数据,这是接收到相同的数据,max232没问题啊。 插上单片机,重新下载,依然不行,用了网上说的方法,把下载的波特率改成相同的,我依次从低速到高速,试了个遍,也没把程序下载进去。 怀疑是请两天网友的一个错误,线序接反了。于是用了两个usb转串口,测试一下,没有问题。然后用另一个usb串口模块捕捉单片机向上位机发送的数据,捕捉到了,如下 发送数据: 7F 接收数据: 68 00 3B 00 02 D2 02 D2 02 D2 02 D2 02 D2 02 D2 02 D2 02 D2 43 43 ED F0 02 82 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2A 16   先不管是什么通信协议,反正单片机是没有问题吧,(这个我也不清楚,希望大家讨论一下)。再捕捉一下上位机的数据,7F,7F,7F,7F,7F,7F,7F,7F,7F,7F,7F,7F,7F,7F 时钟是这个数据,不停息啊。难道是上位机的问题吗?不得而知了。现在都更新到最新的下载软件了,不可能是软件的问题啊。   补充一点,我捕捉的单片机到上位机的数据是经常变的,比如
68 00 3B 00 02 D2 02 D2 02 CE 02 D2 02 D2 02 D2 02 D2 02 D2 43 43 ED F0 02 82 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 26 16
68 00 3B 00 02 D2 02 CE 02 D2 02 D2 02 D2 02 D2 02 CE 02 D2 43 43 ED F0 02 82 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 16
不知道是不是单片机的问题。抑或是电路的问题。
  依然在不懈努力中,一定要解决问题。还剩一周多的时间,得抓紧了。

助工
2011-12-25 23:54:23     打赏
32楼

 

今天又研究了一下我的电路板,准备尝试下载程序,幻想着能下载成功。结果是出现了让人更失望的现象:单机连下载程序的指令都接收不到了。为什么呢? 经过不懈努力,排查重重可能的原因,发现,我用的插座触点松了,而且是p3.0的那个脚松了。那个纠结啊。好在今天我从公司隔爆开关的综合保护器电路板上找到了一个令人兴奋的芯片-stc90c58rd+。这又让我继续使用stc单片机的信心重新建立起来了。 换上stc90c58rd+测试一下程序下载,终于成功了,如下所示   Chinese:正在尝试与 MCU/单片机 握手连接 ... Chinese:连接失败,请尝试以下操作:  1.在单片机停电状态下,点下载按钮,再给单片机上电  2.停止下载,重新选择 RS-232 串口, 接好电缆  3.可能需要先将 P1.0/P1.1 短接到地  4.可能外部时钟未接  5.因 PLCC、PQFP 转换座引线过长而引起时钟不振荡,请    调整参数  6.可能要升级电脑端的 STC-ISP.exe 软件  7.若仍然不成功,可能 MCU/单片机内无 ISP 系统引导码,    或需退回升级,或 MCU 已损坏  8.若使用 USB 转 RS-232 串口线下载,可能会遇到不兼容    的问题,可以让我们帮助购买兼容的 USB 转 RS-232    串口线    仍在连接中, 请给 MCU 上电... MCU Type is: STC89LE58RD+ MCU Firmware Version: 4.3C Chinese:MCU 固件版本号: 4.3C Double speed / 双倍速:          12T/单倍速 振荡放大器增益:                  full gain 下次冷启动须 P1.0/P1.1=0/0 才下载, 快速启动 内部扩展AUX-RAM:        允许访问(强烈推荐) 下次下载用户应用程序时将数据Flash区擦除:YES 用户软件启动内部看门狗后:     复位关看门狗 ALE pin 仍为 ALE 内部时钟频率:11.053554M. 外部时钟频率:11.053554M. Chinese:正在重新连接 ... Current Baud is: / 当前波特率为: 2400 bps. We are erasing MCU flash... 正在擦除应用程序区... ( 00:03 ) 正在下载... ( 开始时间: 09:32:40 ) MCU Type is: STC89LE58RD+ MCU Firmware Version: 4.3C Chinese:MCU 固件版本号: 4.3C Double speed / 双倍速:          12T/单倍速 振荡放大器增益:                  full gain 下次下载时 P1.0/P1.1 与下载无关 内部扩展AUX-RAM:        允许访问(强烈推荐) 下次下载用户应用程序时将数据Flash区擦除: NO 用户软件启动内部看门狗后:     复位关看门狗 ALE pin 仍为 ALE 设置选项成功。 Program OK / 下载 OK Verify OK / 校验 OK erase times/擦除时间 : 00:03 program times/下载时间: 00:07 Encrypt OK/ 已加密


此时的下载速率为固定的速度,2400bps。

有图有真相:

助工
2011-12-25 23:57:25     打赏
33楼
尝试了一下其他的速度,最快能到 115200 bps

菜鸟
2011-12-26 00:06:23     打赏
34楼
学习

助工
2011-12-26 00:34:58     打赏
35楼
你也喜欢晚上学习工作?

助工
2011-12-26 10:26:57     打赏
36楼

main.c文件中的内容

#include <rtx51tny.h>  //包含rtx51 tiny系统头文件,必须得有
#include <main.h>

unchar ledbuf;

 //任务0,系统运行入口
 //完成系统初始化
job0 () _task_ 0   
{
 os_create_task(1);
 //os_create_task(2);

 //os_send_signal(1);  //启动任务1
 while(1)
 os_delete_task(0);
}

//单流水灯,从低位到高位
job1 () _task_ 1      
{
 ledbuf = 0x01;
 while(1)
 {
  //os_wait1(SIG_EVENT);
  led = ~ledbuf;
  ledbuf <<= 1;
  if(ledbuf == 0)
  {
   ledbuf = 1;
   //os_send_signal(2);
   //os_wait1(SIG_EVENT);
  }
  os_wait(K_TMO,25,0);
 }
}

mian.h中的内容:

#include <reg52.h>
#define unchar unsigned char
#define unint unsigned int

//接口宏定义
#define led P1


助工
2011-12-27 09:37:35     打赏
37楼

流水灯程序的升级版本:实现左流水灯和右流水灯的切换。
切换时间由INT_CLOCK决定。




程序如下:

#include <rtx51tny.h>  //包含rtx51 tiny系统头文件,必须得有
#include <main.h>

unchar ledbuf;

 //任务0,系统运行入口
 //完成系统初始化
job0 () _task_ 0   
{
 os_create_task(1);  //创建任务1
 os_create_task(2);  //创建任务2
 
 ledbuf = 0x01;   //初始化变量
 os_send_signal(1);  //启动任务1
 while(1)
 os_delete_task(0);  //初始化完毕,删除任务0
}

//单流水灯,从低位到高位
job1 () _task_ 1      
{
 while(1)
 {
  os_wait1(K_SIG);    //等待信号
  while(1)
  {
   led = ~ledbuf;
   if(ledbuf == 0x80)
   {
    os_send_signal(2); //任务1运行结束,启动任务2
    break;
   } 
   ledbuf <<= 1;     
   os_wait(K_TMO,25,0); //等待25个时间节拍,在conf_tny.a51中修改时间节拍长度
  }
 }
}

//单流水灯,从高位到低位
job2 () _task_ 2
{
 //ledbuf = 0x80;
 while(1)
 {
  os_wait1(K_SIG);     //等待信号
  while(1)
  {
   led = ~ledbuf;
   if(ledbuf == 1)
   {
    os_send_signal(1);   //任务2运行结束,启动任务1
    break;
   } 
   ledbuf >>= 1;
   os_wait(K_TMO,25,0);  //等待时间节拍
  }
 }
}

效果视频:http://v.youku.com/v_show/id_XMzM3OTUzMjcy.html


助工
2011-12-28 17:32:05     打赏
38楼
我从信德电子买的stc单片机,型号为stc12c5a32s2,芯片上是这么写的,我前面的帖子有图。后来焊接好最小项系统,无论如何都下载不进去(前面的帖子也提到过),苦思冥想找不到原因。
前几天下载了一个mcuisp软件,如下图所示,可以自动识别单片机型号。由于前几次usbcom口没法成功更改为com1,点击下面的com1控件也老是弹出错误,所以很长时间没有去研究那个破单片机,改用了stc90cxx系列(从某个地方拆下来的)。
今天心血来潮,又研究了一下usb232改串口号,结果更改成功,并用mcuisp下载了一下程序,结果芯片有诈,stc12c5a32s2变成了stc89c52rc。我晕啊。怪不得用那个stc-isp下载不进去,芯片型号没选对,现在找到原因了,可以正常下载。
但是,我就是不明白,这是怎么回事。难道单片机会变质?


助工
2011-12-30 23:49:24     打赏
39楼

利用12864和ds1302显示时间,简单的程序。还是在rtx51下编的程序。程序内容如下。

#include <rtx51tny.h>  //
包含rtx51 tiny系统头文件,必须得有

#include "main.h"

#include "lcd12864.h"

#include "ds1302.h"

 

uchar getTimebuf[7];//用于存放获取的时间数据

uchar lcdTimeDisp[16]; //lcd时间显示

 

 //任务0,系统运行入口

 //完成系统初始化

job0 () _task_ 0   

{

         os_create_task(1);  //创建任务1

         os_create_task(2);  //创建任务2

 

         Init1302();//初始化DS1302

         init_lcd();

         os_send_signal(1);  //启动任务1

         while(1)

         os_delete_task(0);  //初始化完毕,删除任务0

}

 

//读取ds1302中的数据,存储到数组中,并格式化数据

job1 () _task_ 1               

{

         while(1)

         {

                   v_Get1302(getTimebuf);//获取DS13027个时间日期数据存入数组getTimebuf[].

         }

}

 

//lcd12864显示

job2 () _task_ 2

{

         while(1)

         {

                   writecommend(0x80);

                   writedata('2');

                   writedata('0');

                   writedata(getTimebuf[6]/16+0x30);

                   writedata(getTimebuf[6]%16+0x30);

                   writelcd("");

                   writedata(getTimebuf[4]/16+0x30);

                   writedata(getTimebuf[4]%16+0x30);

                   writelcd("");

                   writedata(getTimebuf[3]/16+0x30);

                   writedata(getTimebuf[3]%16+0x30);

                   writelcd("");

                   writecommend(0x90);

                   writedata(getTimebuf[2]/16+0x30);

                   writedata(getTimebuf[2]%16+0x30);

                   writedata(':');

                   writedata(getTimebuf[1]/16+0x30);

                   writedata(getTimebuf[1]%16+0x30);

                   writedata(':');

                   writedata(getTimebuf[0]/16+0x30);

                   writedata(getTimebuf[0]%16+0x30);

        

                   writecommend(0x95);

                   writelcd("");

                   switch(getTimebuf[5])

                   {

                            case 1:writelcd("");

                                                         break;

                            case 2:writelcd("");

                                                         break;

                            case 3:writelcd("");

                                                         break;

                            case 4:writelcd("");

                                                         break;

                            case 5:writelcd("");

                                                         break;

                            case 6:writelcd("");

                                                         break;

                            case 7:writelcd("");

                                                         break;

                   }

 

 

         }

}


助工
2011-12-30 23:56:53     打赏
40楼

lcd12864文件中的内容为:
#include"main.h"
#include"lcd12864.h"
uchar lcd;
void lcd_delay(uchar m)
{
 uchar i,j;
 for (i=m;i;i--)
  for (j=150;j;j--);
}
//lcd 写数据
void writedata(uchar dat)
{
 lcd_rs=1;
 lcd_rw=0;
 lcd_e=1;
 lcd_data=dat;
 lcd_delay(100);
 lcd_e=0;
 lcd=1;lcd=1;lcd=1;
}
//lcd 读数据
void writecommend(uchar commend)
{
 lcd_rs=0;
 lcd_rw=0;
 lcd_e=1;
 lcd_data=commend;
 lcd_delay(100);
 lcd_e=0;
 lcd=1;lcd=1;lcd=1;
}
//lcd 写要显示的字符串
void writelcd(uchar *dat)
{
  for(;*dat!='\0';dat++)
   writedata(*dat);
}
//lcd 先写显示地址,后写要显示的字符串
void writelcdwords(uchar addr,uchar *words)
{
  writecommend(addr);
  for(;*words!='\0';words++)
   writedata(*words);
}
//写指示符号
void writelcd_select(uchar addr,bit thf)
{
 uchar i;
 writecommend(addr);
 if(thf) writedata(' ');
 writedata(0x18);
 writedata(0x18);
 writecommend(0x90);
 for(i=0;i<16;i++)
 {
  if(i==(addr&0x0f))
  {
   if(thf)
   {
    i++;
    writecommend(addr+1);
    writedata(0x18);
    writedata(' ');
   }
  }
   else
   writelcdwords(0x90+i,"  ");
 
 }
}
//初始化 lcd
void init_lcd()
{
 lcd_delay(200);
 lcd_delay(200);lcd_delay(200);lcd_delay(200);lcd_delay(200);lcd_delay(200);lcd_delay(200);
 writecommend(FUN_MODE);
 lcd_delay(200);
 writecommend(FUN_MODE);
 lcd_delay(200);
 writecommend(DISPLAY_ON);
 lcd_delay(200);
 writecommend(CLEAR_SCREEN);
 lcd_delay(800);
}

ds1302文件中的内容为:
/**************************/
/* ds1302实时时钟C程序    */
/**************************/
#include "main.h"
#include "ds1302.h"
//往DS1302写入1Byte数据
void v_WTInputByte(uchar ucDa)
{
uchar i;
ACC= ucDa;
for(i=8; i>0; i--)
{
 T_IO = ACC0; //相当于汇编中的 RRC
 T_CLK = 0;
 T_CLK = 1;  //上升沿
 ACC =ACC>>1;
}
}
//从DS1302中读取1Byte数据
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
 ACC = ACC>>1; //相当于汇编中的 RRC
 T_CLK = 1; //高电平时ds1302输出数据
 T_CLK = 0;//低电平时mcu读取数据
 ACC7 = T_IO;
}
return(ACC);
}
//往DS1302先写入地址,后写入数据
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK =0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
v_WTInputByte(ucDa); /* 写1Byte数据*/
T_RST =0;
}
//往DS1302先先写地址,后读数据
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK =0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_RST =0;
return(ucDa);
}
/*//设置初始时间
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); // 控制命令,WP=0,允许写操作
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); //秒 分 时 日 月 星期 年
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); // 控制命令,WP=1,写保护
}*/
// 读取DS1302当前时间
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
 ucCurtime[i] = uc_R1302(ucAddr);//格式为: 秒 分 时 日 月 星期 年
 ucAddr += 2;
}
}
//初始化DS1302
void Init1302(void)
{
v_W1302(0x8e,0x00); //控制写入WP=0
//v_W1302(0x90,0xa5); //辅助电源充电命令

/*
v_W1302(0x80,0x00); //写秒
v_W1302(0x82,0x03); //写分
v_W1302(0x84,0x11); //写时
v_W1302(0x86,0x28); //写日
v_W1302(0x88,0x12); //写月
v_W1302(0x8a,0x03); //写星期
v_W1302(0x8c,0x11); //写年     09-5-7 10:59:00
*/

v_W1302(0x8e,0x80); //写保护WP=1
}


共54条 4/6 |‹ 1 2 3 4 5 6 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]