STC15W408AS简单使用教程-简单的光强检测!
第一步:搭建开发环境

安装最新版本的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简单使用教程-简单的光强检测!的更多相关文章
- Jmeter教程 简单的压力测试
Jmeter教程 简单的压力测试:http://www.cnblogs.com/TankXiao/p/4059378.html
- OpenMP的简单使用教程
转自:http://binglispace.com/2015/01/09/openmp-intro/ OpenMP的简单使用教程 今天有幸参加了一个XSEDE OpenMP的workshop讲座,真是 ...
- 程序员,一起玩转GitHub版本控制,超简单入门教程 干货2
本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注 ...
- knockout简单实用教程3
在之前的文章里面介绍了一些KO的基本用法.包括基本的绑定方式,基本的ko的绑定语法包括text绑定,html绑定等等(如有不明请参照上两篇文章),下面呢介绍一下关于ko的其他方面的知识.包括比较特殊绑 ...
- GitHub这么火,程序员你不学学吗? 超简单入门教程 【转载】
本GitHub教程旨在能够帮助大家快速入门学习使用GitHub. 本文章由做全栈攻城狮-写代码也要读书,爱全栈,更爱生活.原创.如有转载,请注明出处. GitHub是什么? GitHub首先是个分布式 ...
- sea.js简单使用教程
sea.js简单使用教程 下载sea.js, 并引入 官网: http://seajs.org/ github : https://github.com/seajs/seajs 将sea.js导入项目 ...
- vim简单使用教程【转】
vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...
- 简单脱壳教程笔记(2)---手脱UPX壳(1)
本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记. ximo早期发的脱壳基础视频教程 下载地址如下: http://down.52pojie.cn/%E5%90%BE%E7%88%B1%E7% ...
- 【git】git简单使用教程
git的简单使用教程: 1.安装git bash客户端 2.打开git bash,cd到需要存储代码的路径下, 执行:git clone -b deploy ssh://git@gitlab.xxxx ...
随机推荐
- cocos2dx-lua控制台报错集合
1.invalid 'cobj' in function 'lua_cocos2dx_Node_getLocalZOrder' 这个报错是lua的变量还在,但是他底层对应的C++对象已被销毁.
- 12c rac On redhat 7
1 准备工作 1.1 关于GRID的一些变化 1.1.1 简化的基于映像的Oracle Grid Infrastructure安装 从Oracle Grid Infrastructure 12 ...
- hash·余数hash和一致性hash
网站的伸缩性架构中,分布式的设计是现在的基本应用. 在memcached的分布式架构中,key-value缓存的命中通常采用分布式的算法 一.余数Hash 简单的路由算法可以使用余数Hash: ...
- ssh 登录报错 packet_write_wait: Connection to x.x.x.x port 22: Broken pipe
问题 更新个人博客文章时遇到:Error: packet_write_wait: Connection to 192.30.253.113 port 22: Broken pipe packet_wr ...
- Oracle12c Release1 安装图解(详解)
Oracle12c Release1 安装图解(详解) Oracle12c 终于发布了,代号为 c,即为 Cloud(云),替代了网格 (Grid)运算. 我的机器基础环境:Windows8(x64) ...
- Confluence 6 创建-使用-删除快捷链接
创建快捷链接 如何创建一个快捷键链接: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 在左侧面板中选择 快捷链接(Shortcut Links). 为 ...
- js中去除字符串中所有的html标签
对于获取了一大堆字符串但是又不想要里面的html标签怎么办? 特别是像博客园这个富文本框中,可以带样式的,取出来的文章内容也是带样式的. 但是在某些地方只要显示文本不想显示其他标签,只好这样做. &l ...
- PDF文件怎么修改,PDF文件编辑方法
PDF文件是一种独特的文件,在日常办公中已经成为我们使用最广泛的电子文档格式.在使用PDF文件中会遇到PDF文件有错区的时候,再从新制作一个PDF文件会比较麻烦,只能通过工具来对PDF文件进行修改,这 ...
- CF558E
非常好的一道题,是线段树的常见玩法 将字符串转化为1~26个数 对区间开一棵线段树,用两个数组分别维护区间中1~26每个数的个数以及一个区间覆盖标记,表示这个区间是否被某一个值覆盖了 在每次排序时,首 ...
- JAVA之复制数组
//复制数组 //Arrays.copyOf(arr, 5) //arr:要复制的对象,5为新数组的长度 import java.util.Arrays; public class Cope { pu ...