keil+IAP15F2K61S2+CH452的使用过程。

目录

记录一下我用keil+IAP15F2K61S2+CH452的使用过程。

1.下载编译器,添加芯片包

1.1 keil共存版本安装 

1.2 新版keil破解软件

2.程序烧录和仿真。

2.1 stc-isp下载:

2.2 往keil里添加STC芯片包

3.keil设置测试

4.keil仿真调试

4.1 开始仿真模拟调试

4.2 退出仿真模拟调试

4.3 keil真机调试

5.CH452数码管显示。

5.1 ch452数码管接线顺序和官方手册不一样,导致数码管显示乱码。

6.CH452键盘使用




记录一下我用keil+IAP15F2K61S2+CH452的使用过程。

1.下载编译器,添加芯片包

1.1 keil共存版本安装 

参考这一篇,和这位作者的公众号,有如何将C51和STM32共存的操作。

https://blog.csdn.net/Initdev/article/details/80704205

1.2 新版keil破解软件

他这个的破解包失效了,我这里提供一个最新的破解软件,操作是一样的。

链接:https://pan.baidu.com/s/1uQApWKWysPlwxJkO1HrZIg 
提取码:keil 
复制这段内容后打开百度网盘手机App,操作更方便哦。

2.程序烧录和仿真。

我用的是IAP15F2K61S2,需要添加STC芯片包,

2.1 stc-isp下载:

链接:https://pan.baidu.com/s/1obZJZhk9ZY7ajsNm9i4QeQ 
提取码:keil 
复制这段内容后打开百度网盘手机App,操作更方便哦。

2.2 往keil里添加STC芯片包

将串口线TX、RX和地,以及电源线连接到芯片后,就可以设置单片机型号,

如何添加还是参考那位作者https://blog.csdn.net/Initdev/article/details/80934393。

然后选择60s2这个系列的芯片就可以了。

之后会出现“正在检测目标单片机”,许多人卡在这里不知道怎么办,其实这时候只需要重新上电就可以自动烧写仿真引导程序了(好像是因为冷启动的关系,具体我也不太了解)。

keil+IAP15F2K61S2+CH452的使用过程。_第1张图片

3.keil设置测试

新建项目,输入好项目名称后点击STC芯片包,在下方选择60s2,就可以新建项目了。

右键左边Target->addGroup,填一个自己喜欢的名字,我这里填的main,再右键main这个Group,选择“add New item to Group main”,就可以添加文件了,这里可以先添加一个c文件。

keil+IAP15F2K61S2+CH452的使用过程。_第2张图片

再在这个文件里输入以下代码进行测试,鼠标点到头文件那块儿,右键选择第二个open document...能打开头文件STC15F2K60S2.H 就证明成功了。然后点击左上角project上面的三个按钮(检查 、编译单文件、编译多文件)都没问题以后,就可以进行下一步了。(这里建议自己可以写一些其他代码)

#include


//延时程序 毫秒,适用于11.0592Mhz
void delay_ms(int n)
{
    int i,j;
    for(i=n;i>0;i--)
        for(j=114;j>0;j--);
}

//app程序
void appRun()
{
	int i = 1;
	delay_ms(200);
	i=i+1;
}



//主程序
void main()
{
	int apprun = 1;
	while (apprun)
	{
		appRun();
	}
}

4.keil仿真调试

4.1 开始仿真模拟调试

直接点击菜单栏的debug->start/stop debug session 可以看到窗口发生了变化。

可以选择想要看到变量右键添加到watch 1.再点击F10,或者F11,(这两个功能不一样,一个step 一个stepover,我就不详细说了,用一下就明白了),然后跟着黄色箭头就可以看到变量的变化了。如果watch 里的value值是16进制的,可以右击value,把hexadecimal display 的对勾点掉,就变成10进制了。

4.2 退出仿真模拟调试

还是点击这个debug->start/stop debug session。

4.3 keil真机调试

首先,需要下载好程序代码。

在串口什么都调整好以后,打开程序文件,选择你的项目文件夹里的objects文件夹里的hex文件,如果没有右键keil左边文件树的Target1,->options for Target1,点击OUTPUT,把里面create hex file 的√给它打上。

调低IRC频率到5.5296 或者 6,点击下载,正在检测目标单片机,重新上电,。。。操作成功。

keil+IAP15F2K61S2+CH452的使用过程。_第3张图片

然后再点击keil仿真设置,烧写仿真引导程序。

然后打开keil,跟着我的图片点下来就能真机仿真了,你这边keil里走一步,单片机就走一步,很好用。这个功能只有有这个功能的单片机才能用,例如这一款stc15f2k61s2.

keil+IAP15F2K61S2+CH452的使用过程。_第4张图片

5.CH452数码管显示。

这里我参考了官方给的参考程序、http://www.wch.cn/downloads/CH452IF_ZIP.html。

根据60s2的头文件更改PIN.H中的对应引脚,这个PIN.H文件还有几个需要对照着STC15F2K60S2的头文件更改的,这里就不详细说了,自己对一下,不然编译的时候也会提示错误。

keil+IAP15F2K61S2+CH452的使用过程。_第5张图片

然后就可以根据EXAM.C来更改自己想要的程序了。总的来说只需要留下面三个文件,要用到他的write和read函数来和ch452通讯。具体的还是要看你板子上的线是怎么接的。然后再结合官方技术手册(http://www.wch.cn/downloads/CH452DS1_PDF.html),查阅命令自己写两个ch452的功能文件。

keil+IAP15F2K61S2+CH452的使用过程。_第6张图片

数码管显示函数:ch452的命令是12位的数据。前四位代表第几个数码管,后八位的二进制数代表每个数码管的八个段。keil+IAP15F2K61S2+CH452的使用过程。_第7张图片

5.1 ch452数码管接线顺序和官方手册不一样,导致数码管显示乱码。

可是这个时候我碰到了一个问题,我按照官方给的代码,发现我的数码管显示总是乱码,连或上0以后显示的都不太正常,好像数码管段的位置错了一样,仔细检查了一下发现,我的数码管接的和官方的接法不一样。

官方手册是这么接的:

keil+IAP15F2K61S2+CH452的使用过程。_第8张图片

而我的是这么接的:

keil+IAP15F2K61S2+CH452的使用过程。_第9张图片

于是我就根据官方的我的接法重新推了一下:

keil+IAP15F2K61S2+CH452的使用过程。_第10张图片

就有了如下代码:前面的digx需要根据自己的电路图进行选择,看看自己的数码管的com(公共端)接的是几。


/*数码管管码表,我自己根据我的电路推的版本,按照官方的接法的话则不需要这么麻烦,直接写标准的就好。
xdata unsigned int smg[] = {183,24,213,217,120,233,237,184,253,249};//0-9

void smgDisplayInit()
{
CH452_Write(CH452_SYSON2);	//打开键盘和数码管显示功能
CH452_Write(CH452_NO_BCD);   // 不使用BCD译码
CH452_Write(CH452_DIG7 | smg[6]);
CH452_Write(CH452_DIG6 | smg[6]);
CH452_Write(CH452_DIG5 | smg[6]);
CH452_Write(CH452_DIG4 | smg[6]);
}

6.CH452键盘使用

ch452键盘在有按键发生的时候会在DOUT脚产生一个低电平中断,可以使用外部中断,和中断服务函数来实现按键的功能。按照常理来说CH452是应该把DOUT接到P3.2或者P3.3这种外部中断脚上的,可以方便的使用外部中断0或外部中断1来进行键盘响应。然而很不幸,老师发给我的板子上这个脚接在了P5.4,我还没有掌握如何用普通的IO口作为外部中断口,所以我就在P5.4和P3.2口之间跳了一根杜邦线连接了起来。

//按键码表枚举,根据自己的键盘连接去官方手册里找对应的按键码来获得这个表。
enum keycode{key1=0x4f,key2=0x4e,key3=0x4d,key4=0x4c,key5=0x47,key6=0x46,key7=0x45,key8=0x44};

void keyBoardInit()
{
  IE=0; //中断寄存器清零,防止有初始值
  EA=1; //将总中断控制打开
  EX0=1;//打开外部中断0
  IT0=0;//电平触发
}

/*
brief:读取ch452最近一次检测到的有效按键值。
*/
void check_keyboard(void) interrupt 0 //外部中断0的服务函数
{
  unsigned char keycode=0;  
  keycode = CH452_Read();                                 
  switch(keycode)//根据对应的按键码选择相应的功能服务函数
    {
      case key1:key1_serv();break;
      case key2:key2_serv();break;
      case key3:key3_serv();break;
      case key4:key4_serv();break;
      case key5:key5_serv();break;
      case key6:key6_serv();break;
      case key7:key7_serv();break;
      case key8:key8_serv();break; 
      default:
      break;
    }
  EA=1;
  EX0=1;//因为进过一次中断后,中断使能就会清零了,所以需要重新使能,不然会只能进入一次中断
}


/*以下是键盘功能函服务函数*/

void key1_serv()
{
  CH452_Write(CH452_DIG7 | smg[1]);
}

void key2_serv()
{

  CH452_Write(CH452_DIG6 | smg[2]);
}
void key3_serv()
{
  CH452_Write(CH452_DIG5 | smg[3]);
}
void key4_serv()
{
  CH452_Write(CH452_DIG4 | smg[4]);
}
void key5_serv()
{
  //TODO
}
void key6_serv()
{
  //TODO
}
void key7_serv()
{
  //TODO
}
void key8_serv()
{
  //TODO
}

所以总的应该这么写,在main函数里调用ch452Run();即可,以上所有函数均需要在头文件里声明,头文件怎么写我就不说了,发的其他帖子里有个推荐视频。

void ch452Run()
{
    smgDisplayInit();//设置数码管显示,初始显示为6666
    keyBoardInit();//开外部中断0
    while(1) 
    {
      app(); //可以去做其他事情了,等待键盘中断响应即可。
    }
}

做到这里,整个利用keil+IAP15F2K61S2+ch452的应用就结束了,以后有其他的功能我还会继续补充。

你可能感兴趣的:(单片机,嵌入式)