第一步:搭建开发环境

安装最新版本的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. swift 实践- 03 -- UILabel

    class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 标签 let ...

  2. SpringMVC简介

    一.SpringMVC 是什么? 后续编辑,先上Demo>> SpringMVCDemo

  3. Confluence 6 配置推荐更新邮件通知默认的初始化设置

    Confluence 为订阅者发送常规邮件报告,这个邮件报告中包含有用户具有查看权限的空间的最新的内容.这个被称为 推荐更新(Recommended Updates)通知. 如果你具有 Conflue ...

  4. AXI Traffic Generator 生成axi-lite axi4 axis 的IP

    addr.coe memory_initialization_radix = ; memory_initialization_vector = ,,,,,,,,ffffffff; ctrl.coe m ...

  5. 《剑指offer》二叉树中和为某一值的路径

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  6. uva11865 二分流量+最小生成树

    uva好题真多 本题用二分法找flow,把流量小于flow的全部筛掉,剩下的边建立最小树形图,如果权值大于c或者不能建图,那么修改二分边界 上代码,觉得最小树形图的代码很优美 /* 题意:给定n个点, ...

  7. 10进制 VS 2进制

    10进制 VS 2进制 时间限制: 1 Sec  内存限制: 32 MB 题目描述 样例输出 623 #include<stdio.h> #include<string.h> ...

  8. Python中的xxx+=xxx和xxx=xxx+xxx一些区别及执行过程

    预知小知识: Python中的变量与其他语言稍有差异,如a = 10并不是直接在内存中创建一个变量a其值为10,而是在内存中创建一个a这个a指向这个10,在Python中所有牵扯到等号的均不是值赋值, ...

  9. Android Studio 删除多余的虚拟设备(Virtual Device)

    操作系统:Windows 10 x64 IDE:Android Studio 3.2.1 菜单:Tools > AVD Manager 在Android Virtual Device Manag ...

  10. C++ Primer 笔记——嵌套类 局部类

    1.嵌套类是一个独立的类,与外层类基本没什么关系.特别的是,外层类的对象和嵌套类的对象是相互独立的.在嵌套类的对象中不包含任何外层类定义的成员,在外层类的对象中也不包含任何嵌套类定义的成员. 2.嵌套 ...