第一步:搭建开发环境

安装最新版本的STC_ISP程序烧录软件,链接:http://pan.baidu.com/s/1slLPnOD 密码:6bov

安装keil C51的51系列单片机集成IDE软件,链接:https://www.keil.com/c51/demo/eval/c51.htm

安装串口程序,链接:http://rj.baidu.com/soft/detail/27520.html?ald

安装Altium Designer,链接:http://www.mr-wu.cn/altium-designer-16-ad16-full-crack-baidu-pan-share/

安装CH340的驱动程序,链接:http://pan.baidu.com/s/1nvG7Mlz 密码:b0ka

第二步:绘制完整的PCB版图

          

手工焊好的洞洞板(注意这里的问题:串口的电源不要给芯片供电哟~):                                                                                     原件清单:

    

第三部:编写程序

main.c主程序:

 #include <STC15W.h>
#include <intrins.h>
#include <BandGap.H>
#include "USART.h" void main (void)
{
uint ADC_Res=;
int i = ;
float Voltage = 0.0; Delay20ms();
InitADC();
Usart1_init();
P1n_standard();
SendString("STC15W408AS\r\nFlux Detect!\r\n");
while ()
{
//P10 = 0;
//delay_500ms();
for(i=;i<;i++)
{
ADC_Res += GetADCResult();
Delay20ms();
}
//P10 = 1;
delay_s();
ADC_Res = ADC_Res/;
Voltage = ((float)ADC_Res)/1024.0*5.0;
SendNumber(Voltage);
ADC_Res = ;
}
}

STC15W头文件上传到了我的博客园文件盘当中:http://files.cnblogs.com/files/uestc-mm/STC15W.rar

ADC模块程序:

 #include <STC15W.h>
#include <intrins.h> #define uchar unsigned char
#define uint unsigned int
unsigned int v;
//ADCÏà¹ØÉ趨²ÎÊý
#define ADC_POWER 0x80 //ADCµçÔ´¿ØÖÆÎ»
#define ADC_FLAG 0x10 //ADCÍê³É±êÖ¾
#define ADC_START 0x08 //ADCÆðʼ¿ØÖÆÎ»
#define ADC_SPEEDLL 0x00 //540¸öʱÖÓ
#define ADC_SPEEDL 0x20 //360¸öʱÖÓ
#define ADC_SPEEDH 0x40 //180¸öʱÖÓ
#define ADC_SPEEDHH 0x60 //90¸öʱÖÓ #define ID_ADDR_ROM 0x1ff7 //8K³ÌÐò¿Õ¼äµÄMCU void Delay20ms() //@12.000MHz
{
unsigned char i, j, k; _nop_();
_nop_();
i = ;
j = ;
k = ;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
} void delay_500ms(void)
{
int i=;
for(;i>;i--)
{
Delay20ms();
}
} void delay_s(char N)
{
char i=;
for(i=;i<N;i++)
{
delay_500ms();
delay_500ms();
}
}
/*----------------------------
³õʼ»¯ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x02; //ÉèÖÃP1¿ÚΪAD¿Ú P1.1½Ó¿ÚΪADCÊäÈë½Ó¿Ú
ADC_RES = ; //Çå³ý½á¹û¼Ä´æÆ÷
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay20ms();
}
/*----------------------------
¶ÁÈ¡ADC½á¹û
----------------------------*/
uint GetADCResult(uchar ch)
{
uint ADC_10BIT_RES;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //µÈ´ý4¸öNOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//µÈ´ýADCת»»Íê³É
ADC_CONTR &= ~ADC_FLAG; //¹Ø±Õ ADC
ADC_10BIT_RES=ADC_RES; //µÃµ½¸ß8λ
ADC_10BIT_RES<<=;
ADC_10BIT_RES+=ADC_RESL; //µÃµ½µÍ2λ
return ADC_10BIT_RES; //·µ»ØADC½á¹û } /*----------------------------
·¢ËÍADC½á¹û
----------------------------*/
void ShowResult(uchar ch)
{
uint adc_res10,//²âÁ¿É趨ͨµÀadcÖµ
bandgap, //bandgapÔ¤´¢´æÐ£×¼Öµ£¬µ¥Î»ºÁ·ü
adc_9gallery_res; //²âÁ¿µÚ¾ÅͨµÀ£¨bandgap£©Öµ
float power_voltage, //ϵͳ¹©µçµçѹ£¬µ¥Î»ºÁ·ü
ADC_voltage; //É趨ͨµÀµçѹֵ£¬µ¥Î»ºÁ·ü uchar code *cptr; //¶¨ÒåROM(´úÂë)ÇøÖ¸Õë
//uchar idata *iptr;//¶¨ÒåRAM(ÄÚ´æ)ÇøÖ¸Õë cptr = ID_ADDR_ROM; //´Ó³ÌÐòÇø¶ÁÈ¡BandGapµçѹֵ(µ¥Î»:ºÁ·ümV)
bandgap=*cptr++;
bandgap<<=;
bandgap+=*cptr;
/*iptr = ID_ADDR_RAM; //´ÓÄÚ´æÇø¶ÁÈ¡BandGapµçѹֵ(µ¥Î»:ºÁ·ümV)
bandgap=*iptr++; //Á½ÖÖ·½·¨½á¹ûÒ»Ñù£¬ÉÏÃæµÄ·½·¨ÐèÒªÔÚÏÂÔØÊ½¹´Ñ¡"ÔÚIDºÅǰÌí¼ÓÖØÒª²âÊÔ²ÎÊý"Ñ¡Ïî,²Å¿ÉÔÚ³ÌÐòÖлñÈ¡´Ë²ÎÊý
bandgap<<=8; //ÏÂÃæµÄ·½·¨²»ÐèÒª
bandgap+=*iptr; */
//²âÁ¿É趨ͨµÀadcÖµ
ADC_RES = ; //Çå³ý½á¹û¼Ä´æÆ÷
P1ASF = 0x80; //ÉèÖÃP1¿ÚΪAD¿Ú
GetADCResult(ch);
GetADCResult(ch); //¶ÁÈý´Î»ñµÃÎȶ¨
adc_res10= GetADCResult(ch);
//²âÁ¿µÚ¾ÅͨµÀ£¨bandgap£©Öµ
ADC_RES = ; //Çå³ý½á¹û¼Ä´æÆ÷
P1ASF = 0x00; //ÉèÖöÁµÚ¾ÅͨµÀ
GetADCResult(); //²âbandgapʱ£¬µ÷Óô˺¯ÊýʱͨµÀÊýÖ»ÄÜÌî0
GetADCResult(); //¶ÁÈý´Î»ñµÃÎȶ¨
adc_9gallery_res=GetADCResult();
//¼ÆËãϵͳ¹©µçµçѹ
power_voltage=(float)bandgap*/adc_9gallery_res;
//¼ÆËãADCͨµÀ²âµÃµçѹֵ
ADC_voltage=(float)bandgap*adc_res10/adc_9gallery_res;
v=ADC_voltage;
v=v*;
}

USART模块程序:

 /* 

 SBUF: UART1 uses register SBUF (address:99H) to hold both the received and transmitted data passing through pins RxD and TxD.all have two in the chip, one for transmit and the other for receive(OK)

 PCON&SCON:Serial port 1 of STC15 series has two control registers: Serial port control register (SCON) and PCONwhich used to select Baud-Rate
SCON:SM0 SM1 Mode BaudRate
0 1 1 (T1 or T2)/4 (OK)
0 0 0 SYSclk/12
PCON:
B7-SMOD
0 : Disable double Baud rate of the UART(OK)
1 : Enable double Baud rate of the UART in mode 1,2,or 3.
B6-SMOD0
0 : SCON.7 is SM0 function(OK)
1 : SCON.7 is FE function. Note that FE will be set after a frame error regardless of the state of SMOD0. AUXR:
B6-T1x12:Timer 1 clock source bit
0 : The clock source of Timer 1 is SYSclk/12. It will compatible to the traditional 8051 MCU
1 : The clock source of Timer 1 is SYSclk/1. It will drive the T0 faster than a traditional 8051 MCUIf T1 is used as the baud-rate generator of UART1, T1x12 will decide whether UART1 is 1T or 12T.(OK)
B0 - S1ST2 : the control bit that UART1 select Timer 2 as its baud-rate generator.
0 : Select Timer 1 as the baud-rate generator of UART1(OK)
1 : Select Timer 2 as the baud-rate generator of UART1. Timer 1 is released to use in other functions IE:
B7-EA : disables all interrupts.
0 : no interrupt will be acknowledged.
1 : each interrupt source is individually enabled or disabled by setting or clearing its enable bit.(OK)
B4-ES : Serial port 1(UART1) interrupt enable bit.
0 : Serial port 1(UART1) interrupt would be diabled.
1 : Serial port 1(UART1) interrupt would be enabled.(OK) Timer1 Configuration£º
#define Timer1_Load(n) TH1 = (n)/256,TL1 = (n)%256 Use this sentence to set the T1.So we need to calculate the buad_rate we need£¡ ×ÛºÏÉÏÊöµÄ¼Ä´æÆ÷µÄÅäÖã¬ÎÒÃǽ«Ñ¡ÔñTimer1À´²úÉúUSART1µÄ²¨ÌØÂʵÄʱÖÓÔ´£¬ÎÒÃÇÑ¡ÔñµÄSerial PortµÄģʽMode=1,µ±Êý¾Ý´«ÊäÍê³Éʱ»á²úÉúÖжϣ¬
ÎÒÃÇ¿ÉÒÔͨ¹ý¼ì²éÖжÏÏòÁ¿TI(SCON-B1)µÄÖµÀ´ÅжÏÊý¾ÝµÄ´«ÊäÊÇ·ñÍê³É£¬Íê³ÉÔòΪ1£¬Î´Íê³ÉÔòΪ0£ºwhile(TI == 0); --> TI = 0;(²»ÒªÍü¼ÇÇåÁã) ÄÇô²¨ÌØÂʵļÆËãÈçÏ£ºBuad_Rate = T1/4
É趨µÄTimer1ʱÖÓÈçÏ£ºTime_Clk = SYSclk/1
*/
#include <STC15W.h>
#include <intrins.h> typedef unsigned char BYTE;
typedef unsigned int WORD; #define FOSC 18432000L //System frequency 18.432MHz
#define BAUD 115200 //UART1 baud-rate void Usart1_init(void);
void SendData(BYTE dat);
void SendString(char *s); void Usart1_init(void)
{
SCON = (SCON & 0x3f) | 0x40; //Ñ¡Ôñusart1µÄmodeΪ1
S1_USE_P30P31();
Timer2_1T(); //The clock source of Timer 2 is SYSclk/1.
Timer2_AsTimer(); // TMOD &= ~(1<<6) ¶¨Ê±Æ÷1ÓÃ×ö¶¨Ê±Æ÷
S1_BRT_UseTimer2(); //Select Timer 1 as the baud-rate generator
T2L = ( - (FOSC//BAUD)); //Set the preload value
T2H = ( - (FOSC//BAUD))>>;
EA = ;
ES = ;
Timer2_Run(); // Æô¶¯¶¨Ê±Æ÷1
} void SendData(BYTE dat)
{
SBUF = dat;
while(!TI);
TI = ;
} void SendString(char *s)
{
while (*s)
{
SendData(*s++);
}
} void SendNumber(float num)
{
int a,b;
a = (int)num;
b = (int)((num-a)*);
SendData((unsigned char)(a+));
SendData('.');
SendData((unsigned char)(b+));
SendData('\n');
}

第五步:下载程序

我用的是CP2102的驱动芯片

                                                            这里是我的选择的设置

注:在这过程中遇到的问题罗列如下

1 下载程序出现BUG:

STC-ISP提示“调整频率无响应”,下载失败的字样,按照官网的步骤意义排查,还是没能解决问题,最后看到宏晶官网的重要提示(参考网站:http://www.stcisp.com/q_and_a_stcisp.html):

一、(特别注意:烧写点击编程键后,单片机必须断电进行冷启动!)

二、部分USB转串口线会通过RxD/TxD引脚对单片机供电,导致下载时不能彻底断电。可在单片机的TxD引脚串一个二极管(接正极,如图),使单片机可彻底断电冷启动。(注:若USB转串口芯片共板,不要对USB芯片断电,否则USB转换的串口会消失)

  三、供电部分最好不要用串口的VCC和GND来连接,直接用单独的电源就好。

2 Keil C51的集成IDE中未能找到STC15W408AS的解决办法(参考网站:http://www.stcmicro.com/wtjd.html):

*STC 单片机应使用何种编译器/汇编器?

  1任何老的编译器/汇编器都可以支持,流行用Keil C51

  2.把STC单片机,当成Intel的8052/87C52/87C54/87C58,Philips的P87C52/P87C54/P87C58就可以了

  3.如果要用到扩展的专用特殊功能寄存器,直接对该地址单元设置就行了,当然先声明特殊功能寄存器的地址较好

*Keil C51编译器中无STC单片机型号,怎么办?

  1.把STC单片机,当成Intel的8052/87C52/87C54/87C58,Philips的P87C52/P87C54/P87C58就可以了

  2.也可安装STC仿真器的驱动程序,这样就看到型号了.

实验结果:

STC15W408AS简单使用教程-简单的光强检测!的更多相关文章

  1. Jmeter教程 简单的压力测试

    Jmeter教程 简单的压力测试:http://www.cnblogs.com/TankXiao/p/4059378.html

  2. OpenMP的简单使用教程

    转自:http://binglispace.com/2015/01/09/openmp-intro/ OpenMP的简单使用教程 今天有幸参加了一个XSEDE OpenMP的workshop讲座,真是 ...

  3. 程序员,一起玩转GitHub版本控制,超简单入门教程 干货2

    本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注 ...

  4. knockout简单实用教程3

    在之前的文章里面介绍了一些KO的基本用法.包括基本的绑定方式,基本的ko的绑定语法包括text绑定,html绑定等等(如有不明请参照上两篇文章),下面呢介绍一下关于ko的其他方面的知识.包括比较特殊绑 ...

  5. GitHub这么火,程序员你不学学吗? 超简单入门教程 【转载】

    本GitHub教程旨在能够帮助大家快速入门学习使用GitHub. 本文章由做全栈攻城狮-写代码也要读书,爱全栈,更爱生活.原创.如有转载,请注明出处. GitHub是什么? GitHub首先是个分布式 ...

  6. sea.js简单使用教程

    sea.js简单使用教程 下载sea.js, 并引入 官网: http://seajs.org/ github : https://github.com/seajs/seajs 将sea.js导入项目 ...

  7. vim简单使用教程【转】

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...

  8. 简单脱壳教程笔记(2)---手脱UPX壳(1)

    本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记. ximo早期发的脱壳基础视频教程 下载地址如下: http://down.52pojie.cn/%E5%90%BE%E7%88%B1%E7% ...

  9. 【git】git简单使用教程

    git的简单使用教程: 1.安装git bash客户端 2.打开git bash,cd到需要存储代码的路径下, 执行:git clone -b deploy ssh://git@gitlab.xxxx ...

随机推荐

  1. Go语言环境安装&搭建(Linux)

    Linux的东西果然不记不行啊~ 下载&安装 下载 我们先找到linux版的下载链接 https://golang.org/dl/ 打开网址找到Linux对应的链接右键复制下载地址 然后连接服 ...

  2. python并发编程之IO模型,

    了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...

  3. 【rabbitmq】安装卸载

    安装: 1. 在http://www.rabbitmq.com/install-rpm.html下载对应系统的rpm包  我下载的是rabbitmq-server-3.6.6-1.el6.noarch ...

  4. ES6 Promise 全面总结

    转载:点击查看原文 ES6 Promise对象 ES6中,新增了Promise对象,它主要用于处理异步回调代码,让代码不至于陷入回调嵌套的死路中. @-v-@ 1. Promise本质 Promise ...

  5. 从认识面向对象到构造函数的标准写法(构造函数的继承、多态、ECMA6中新代替语法class) - 下

    笔记一个包含:认识面向对象.构造函数的封装.继承.多态.ECMA6中新代替语法class 下:包括构造函数的继承.多态.ECMA6中新代替语法class 构造函数的继承 从父一级延续下来的属性和功能( ...

  6. C++ Primer 笔记——变量

    1. 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替. 2.使用列表初始化内置类型的变量时,如果初始值存在丢失信息的风险,则编译器将报错 ...

  7. 集腋成裘-05-angularJS -初识angular

    私以为angular的最大特点是:只关注数据 1.1 angular之:双向绑定 <!DOCTYPE html> <html ng-app=""> < ...

  8. G: Dave的时空迷阵(next数组)

    G: Dave的时空迷阵 Time Limit: 1 s      Memory Limit: 128 MB Submit My Status Problem Description 皇家理工本部隐藏 ...

  9. SQL Server常见的操作符

    常见的操作符:Sort.Hash Match(聚合).Filter.Compute Scalar等 一:Sort select Shelf from Production.ProductInvento ...

  10. android app使用微信登录接口回调没有被执行的问题研究

    本人开发的一个app使用了sharesdk集成微信登录功能,在测试的过程中微信授权登录界面有调用,但是授权后原应用的回调没有被执行 应用的包名是com.kimi.searcher 首先,确认微信点击授 ...