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 ...
随机推荐
- Js操作Array数组
之前写过一篇文章,但是很模糊,不过却给我提供了一个思路,所以没有删除,这次写的是一个完善版本! 因为在很多的时候我们在选中了几行数据,然后存放在Array中,如下图: 看下控制台的数据 我双击了这两个 ...
- [原著]java或者Js 代码逻辑来处理 突破 oracle sql “IN”长度的极限的问题
注:本文出自:博主自己研究验证可行 [原著]java或者Js 代码逻辑来处理 突破 oracle sql "IN"长度的极限的问题 在很多的时候 使用 select ...
- Linux基础实操六
实操一: 临时配置网络(ip,网关,dns)+永久配置 #ifconfig ens33 192.168.145.134/24 #vim /etc/resolv.conf #route add defa ...
- centos7安装laravel
一. 安装前准备1. 安装screenyum install screen 2. 安装wgetyum install wget 3. 更新yumyum update 4. 安装额外资源库yum ins ...
- python网络爬虫笔记(九)
4.1.1 urllib2 和urllib是两个不一样的模块 urllib2最简单的就是使用urllie2.urlopen函数使用如下 urllib2.urlopen(url[,data[,timeo ...
- 雅礼 noip2018 模拟赛 day3 T3
典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...
- C++ Primer 笔记——理解std::move
标准库move函数是使用右值引用的模板的一个很好的例子.标准库是这样定义std::move的: template <typename T> typename remove_referenc ...
- jenkins原理
原理:Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 直白的说:这个jenkins是CI ...
- docker批量删除none镜像
1.直接用docker images | grep none | awk ‘{print $3}’ |xgars docker rmi 通过关键字搜索,得到docker id,进行删除
- 饮冰三年-人工智能-Python-14Python基础之变量与函数
1:函数:函数是逻辑结构化和过程化的一种编程方法.函数即变量 #参数组:**字典 *列表 def test(x,*args): print(args); print(args[0]); print(& ...