合泰单片机生成pwm

合泰单片机生成pwm
合泰单片机生成pwm

#include "HT66FU70A.h"

#define RS _pc0

#define RW _pc1

#define E _pd6

float ad_shidu; //湿度变量

float ad_wendu; //温度变量

char Sunshine; //光照变量

char timer0_cnt;

long int m;

unsigned int temp=0;

void ad_init(void) //A/D转换初始化

{

//8分频;内部1.25V电压除能;内部参考电源电压来源于VDD

_adcr1 = 0x03;

//启动A/D转换模块(ADCR0寄存器第5位)

_adoff = 0;

}

void ad_pa1(void) //pa1端口ad配置

{

//定义PA1为A/D输入,即AN1

_pas0 = 0x30;

//选择模拟通道AN1;ADC数据高字节是ADRH的第7位,低字节是ADRL的第4位_adcr0 = 0x01;

}

void ad_pa3(void) //pa3端口ad配置

{

//定义PA1为A/D输入,即AN1

_pas1 = 0x30;

//选择模拟通道AN1;ADC数据高字节是ADRH的第7位,低字节是ADRL的第4位_adcr0 = 0x03;

}

//开始进行ad转换

void ad_switch(void)

{

//ADCR0寄存器第七位

_start=1;

//start位0->1->0,表示启动A/D转换

_start=0;

}

void pwn_1(void)

{

_pcc5=0; //输出

_pcpu5=1; //上拉

// _pc5 = 1;

_pcs2 |= (2 << 4); //PC5 功能选择为TM1输出

// _tm1c1=0b10101000;

// _tm1c0=0b00001111;

_tm0c0 |= (0 << 4); //fsys/4

_tm0c0 |= (1 << 0); //CCRP:001b

_tm0al = 0x3f;

_tm0ah = 0x00;

_tm0c1 |= (2 << 6); //PWM模式

_tm0c1 |= (2 << 4); //PWM 输出

_tm0c1 |= (1 << 3); //高有效

_tm0c1 &=~(1 << 1); //CCRP-周期CCRA-占空比_tm0c0 &=~(1 << 7); //运行定时器

_tm0c0 |= (1 << 3); //计数器On

/*_tm0c0 |= (1 << 3); //计数器On*/

}

void pwn_2(void)

{

_pcc6=0; //输出

_pcpu6=1; //上拉

// _pc5 = 1;

_pcs3 |= (1 << 0); //PC5 功能选择为TM1输出

// _tm1c1=0b10101000;

// _tm1c0=0b00001111;

_tm0c0 |= (0 << 4); //fsys/4

_tm0c0 |= (1 << 0); //CCRP:001b

_tm0al = 0x3f;

_tm0ah = 0x00;

_tm0c1 |= (2 << 6); //PWM模式

_tm0c1 |= (2 << 4); //PWM 输出

_tm0c1 |= (1 << 3); //高有效

_tm0c1 &=~(1 << 1); //CCRP-周期CCRA-占空比

_tm0c0 &=~(1 << 7); //运行定时器

_tm0c0 |= (1 << 3); //计数器On

/*_tm0c0 |= (1 << 3); //计数器On*/

}

//定时器

void time_init(void)

{

//保持对应的I/O口的原来功能

_pds2 = 0;

_phs0 = 0;

_tm0c0 = 0x00; //简易型TM(查找TMnC0寄存器),4分频

/*_tm0c1 = 0xc1; //简易型TM(TMnC1寄存器)计数器模式;比较器A匹配*/

/*计数值的上限是3FFH,这里取计数初值为356H,即每隔

(3FFH-356H)=169x1/(fsys/4)的时间触发一次中断*/

/* _tm0al = 0x56; //简易型TM(TM0 CCRA低字节寄存器)先写低字节

_tm0ah = 0x03; //简易型TM(TM0 CCRA高字节寄存器)先读高字节,再读低字节*/

_tm0al = 0x3f;

_tm0ah = 0x00;

_t0on = 1; //启动定时器0(TM0C0寄存器的bit3位)*/

_t0pe = 1; //定时器0比较器A匹配中断控制位(MFI0寄存器bit1位)

_mf0e = 1; //允许多功能中断0,多功能中断包括TM中断(INTC1寄存器bit1位)

}

void __attribute((interrupt(0x14))) time_int(void) //每1s中断一次,灯亮/灭一次

{

_emi = 0;

//

// MFI0寄存器bit5位,中断标志请求

// _t0af = 0;

//

// timer0_cnt--;

// if(!timer0_cnt){

// _pe = ~_pe;

// timer0_cnt = 2000;

// }

m++;

while(m==200000)

_tm0c0=0x10;

_t0pf=0;

_emi = 1;

}

void main()

{

//设置看门狗除能(使能应为:0b01010011) _wdtc = 0b10101011;

m=0;

time_init();

_emi = 1;//开总中断

pwn_1();

while(1)

{

}

}

用合泰单片机控制2个LED亮度,有51的程序。然后移植到了合泰单片机上 功能都一样的

如何移植一个51的程序到合泰单片机 下面是一个51的程序,通过一个按键控制2个LED灯的亮暗: #include #define uchar unsigned char #define uint unsigned int sbit button=P3^0; sbit cold=P1^2; sbit hot=P1^0; uchar flag,ZKBH,ZKBC,m=0,m1=0; bit eavalue,trvalue; long int keytime=0; uchar code tableh[5][5]={{0,0,0,0,0},{5,10,15,20,25},{10,20,30,40,50},{10,20,30,40,50},{10,20,30,40,50}}; uchar code tablec[5][5]={{10,20,30,40,50},{10,20,30,40,50},{10,20,30,40,50},{5,10,15,20,25},{0,0,0,0,0}}; void init_sys(void); void Delay10Ms(); void tiaose(); void liangdu(); void keyscan(); void main() { eavalue=0; trvalue=0; flag=0; P1=0xff; init_sys(); while(1) { ZKBH=tableh[m][m1]; ZKBC=tablec[m][m1]; keyscan(); /*得出了flag的值为长短按键选项*/ } } void init_sys(void) { TMOD=0X01; TH0=0XFF; TL0=0X9c; TR0=1; ET0=1; EA=1;

单片机如何产生PWM

单片机产生PWM 1.PWM定义 脉冲宽度调制(PWM)是英文“Pulse Width Modulation”的缩写,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。 脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。 2.PWM控制的基本原理 理论基础:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。 图1 形状不同而冲量相同的各种窄脉冲 面积等效原理: 分别将如图1所示的电压窄脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同窄脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述

脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。 图2冲量相同的各种窄脉冲的响应波形 3. PWM相关概念 占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比 如,一PWM的频率是1000Hz,那么它的时钟周期就是1ms,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。 分辨率:占空比最小能达到的值,如8位的PWM,理论的分辨率就是1:255(单斜率), 16位的的PWM理论就是1:65535(单斜率)。 频率:如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到。相对于周期就是65535*计数脉冲时间。 双斜率 / 单斜率: 假设一个PWM从0计数到80,之后又从0计数到80.......这个就是单斜率。 假设一个PWM从0计数到80,之后是从80计数到0.......这个就是双斜率。

合泰单片机生成pwm

#include "HT66FU70A.h" #define RS _pc0 #define RW _pc1 #define E _pd6 float ad_shidu; //湿度变量 float ad_wendu; //温度变量 char Sunshine; //光照变量 char timer0_cnt; long int m; unsigned int temp=0; void ad_init(void) //A/D转换初始化 { //8分频;内部1.25V电压除能;内部参考电源电压来源于VDD _adcr1 = 0x03; //启动A/D转换模块(ADCR0寄存器第5位) _adoff = 0; } void ad_pa1(void) //pa1端口ad配置 { //定义PA1为A/D输入,即AN1 _pas0 = 0x30; //选择模拟通道AN1;ADC数据高字节是ADRH的第7位,低字节是ADRL的第4位_adcr0 = 0x01; } void ad_pa3(void) //pa3端口ad配置 { //定义PA1为A/D输入,即AN1 _pas1 = 0x30; //选择模拟通道AN1;ADC数据高字节是ADRH的第7位,低字节是ADRL的第4位_adcr0 = 0x03; } //开始进行ad转换 void ad_switch(void)

{ //ADCR0寄存器第七位 _start=1; //start位0->1->0,表示启动A/D转换 _start=0; } void pwn_1(void) { _pcc5=0; //输出 _pcpu5=1; //上拉 // _pc5 = 1; _pcs2 |= (2 << 4); //PC5 功能选择为TM1输出 // _tm1c1=0b10101000; // _tm1c0=0b00001111; _tm0c0 |= (0 << 4); //fsys/4 _tm0c0 |= (1 << 0); //CCRP:001b _tm0al = 0x3f; _tm0ah = 0x00; _tm0c1 |= (2 << 6); //PWM模式 _tm0c1 |= (2 << 4); //PWM 输出 _tm0c1 |= (1 << 3); //高有效 _tm0c1 &=~(1 << 1); //CCRP-周期CCRA-占空比_tm0c0 &=~(1 << 7); //运行定时器 _tm0c0 |= (1 << 3); //计数器On /*_tm0c0 |= (1 << 3); //计数器On*/ } void pwn_2(void) { _pcc6=0; //输出 _pcpu6=1; //上拉 // _pc5 = 1; _pcs3 |= (1 << 0); //PC5 功能选择为TM1输出 // _tm1c1=0b10101000; // _tm1c0=0b00001111; _tm0c0 |= (0 << 4); //fsys/4 _tm0c0 |= (1 << 0); //CCRP:001b _tm0al = 0x3f; _tm0ah = 0x00; _tm0c1 |= (2 << 6); //PWM模式 _tm0c1 |= (2 << 4); //PWM 输出 _tm0c1 |= (1 << 3); //高有效

合泰单片机串口通讯C语言

/*和泰单片机串口通许,已调试通过,抗干扰超强,一些标志及定时器请自己定义*/ unsigned char count_uartout;//发送计数器 unsigned cha datin_buf[4]; //接收寄存器4个 unsigned cha datout_buf[9]; //发寄存器9个 #define tongxun_in datin_buf[0] //接收送识辨码寄存器 #define tongxun_out datout_buf[0] //发送识辨码寄存器 #define send_max 8 //设发的数据个数 DEFINE_ISR (Interrupt_uart, 0x2c) //串口中断地址 { if(++count_uartin>3) count_uartin=0; if((_usr&0b11110000)==0) //判断是否出错 { if(_rx8) //接收到首数据 { tongxun_in=_txr_rxr; if(tongxun_in==0x5a) 首数据正常则 { b_sendero=0; //清除错误标志 count_uartin=0; //接收数据地址清零 tongxun_time=0; //通许计时器清0,tongxun_time为1S计时器,到1S则b_tongxun=1;表示接收错误。 b_tongxun=0; } else b_sendero=1; //接收的数据出错 } else //出错处理 { if(!b_sendero) datin_buf[count_uartin]=_txr_rxr; //接收的数据正常 else b_tongxun=_txr_rxr; //接收的数据出错,需读_txr_rxr清除_usr的错误标志 } } else b_tongxun=_txr_rxr;// //接收的数据出错,需读_txr_rxr清除_usr的错误标志 } //---------------------------------------------------

51单片机产生PWM的程序

51单片机产生PWM的程序 其中P1.3 P1.4是两个输出/**************************************************************** *程序思路说明: * * *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 * *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样可以设定占空比可从1-100变化。即0.01ms*100=1ms * ***************************************************************** *************/ #include #define uchar unsigned char /**************************************************************** ************* * TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; * * TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*

* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 * * 间为1ms*65536=65.536ms * ***************************************************************** *************/ #define V_TH0 0XFF #define V_TL0 0XF6 #define V_TMOD 0X01 void init_sys(void); /*系统初始化函数*/ void Delay5Ms(void); unsigned char ZKB1,ZKB2; void main (void) { init_sys(); ZKB1=40; /*占空比初始值设定*/ ZKB2=70; /*占空比初始值设定*/ while(1) {

单片机PWM(脉冲宽度调制)原理与实现

、PWM原理 2、调制器设计思想 3、具体实现设计 一、PWM(脉冲宽度调制Pulse Width Modulation)原理: 脉冲宽度调制波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。图1所示为脉冲宽度调制系统的原理框图和波形图。该系统有一个比较器和一个周期为Ts的锯齿波发生器组成。语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。因此,从图1中可以看出,比较器输出一列下降沿调制的脉冲宽度调制波。 通过图1b的分析可以看出,生成的矩形脉冲的宽度取决于脉冲下降沿时刻t k时的语音信号幅度值。因而,采样值之间的时间间隔是非均匀的。在系统的输入端插入一个采样保持电路可以得到均匀的采样信号,但是对于实际中tk-kTs< (1) 其中,x{t}是离散化的语音信号;Ts是采样周期;是未调制宽度;m是调制指数。 然而,如果对矩形脉冲作如下近似:脉冲幅度为A,中心在t = k Ts处,在相邻脉冲间变化缓慢,则脉冲宽度调制波xp(t)可以表示为: (2) 其中,。无需作频谱分析,由式(2)可以看出脉冲宽度信号由语音信号x(t)加上一个直流成分以及相位调制波构成。当时,相位调制部分引起的信号交迭可以忽略,因此,脉冲宽度调制波可以直接通过低通滤波器进行解调。 二、数字脉冲宽度调制器的实现: 实现数字脉冲宽度调制器的基本思想参看图2。 图中,在时钟脉冲的作用下,循环计数器的5位输出逐次增大。5位数字调制信号用一个寄存器来控制,不断于循环计数器的输出进行比较,当调制信号大于循环计数器的输出时,比较器输出高电平,否则输出低电平。循环计数器循环一个周期后,向寄存器发出一个使能信号EN,寄存器送入下一组数据。在每一个计数器计数周期,由于输入的调制信号的大小不同,比较器输出端输出的高电平个数不一样,因而产生出占空比不同的脉冲宽度调制波。 图3 为了使矩形脉冲的中心近似在t=kTs处,计数器所产生的数字码不是由小到大或由大到小顺序变化,而是将数据分成偶数序列和奇数序列,在一个计数周期,偶数序列由小变大,直到最大值,然后变为对奇数序列计数,变化为由大到小。如图3例子。 奇偶序列的产生方法是将计数器的最后一位作为比较数据的最低位,在一个计数周期内,前半个周期计数器输出最低位为0,其他高位逐次增大,则产生的数据即为偶数序列;后半个周期输出最低位为1,其余高位依次减小,产生的数据为依次减小的偶序列。具体电路可以由以下电路图表示: 三、8051中的PWM模块设计:

holtek单片机怎么样_holtek单片机有什么特点

holtek单片机怎么样_holtek单片机有什么特点 holtek盛群半导体为台湾省专业微控制器IC设计领导厂商,营业范围主要包括微控制器IC及其周边组件之设计、研发与销售。自1998年成立以来,公司不断致力于新产品的研发及技术的创新,加上对市场趋势的掌握,期能提供广大电子市场最具竞争力之IC产品。 holtek bs84c12A 单片机开发 开发环境搭建 编辑编译调试是官方的HT-IDE3000,仿真器用的Elink,单片机的程序用C开发,使用代理商提供的触摸按键库。(这些资料后面都整体好提供下载)。软件的安装什么就不说了,直接就讲怎么和自己的硬件连接,进行在线调试。 开发环境使用 关于IDE3000的使用,安装好后可以在软件的帮助部分,查看一些V3进行C语言编程的对应内容;ELink的话有个《Elink仿真器使用说明》,关键就是“”BS84C12A_20150807_LIBV413--V3“”这个软件包,后续的开发都在这个软件包的基础上进行(触摸按键调用这个软件包提供的库就方便实现按键功能),具体怎么使用这个软件包,可以看他对应的使用手册。 关于使用Elink在线仿真,要注意就是要使用对应的支持在线调试的芯片,比如选的BS84C12A 对应的仿真芯对应的EV芯片。 关于编程 使用上面提到的软件包进行编程,其实就是已经帮搭建好了框架,void USER_PROGRAM_INITIAL()这个函数里面就是硬件初始化,void USER_PROGRAM()函数就是单片机程序需要循环执行的内容。 自己开发过程中编程时候遇到的问题主要如下: 1,堆栈溢出。 解决,查数据手册可以知道,选的BS84C12A是硬件堆栈5层,调用的触摸按键库,它的

按键控制单片机PWM输出设计

学号1322010110 天津城建大学 单片机原理及应用A课程 设计说明书 按键控制单片机PWM输出设计起止日期:2016年05月30日至2016年6月10日 学生姓名 班级 成绩 指导教师(签字) 控制与机械工程学院 2016年6月10日

目录 第一章系统方案设计 (1) 1.1 PWM (1) 1.2 STC12C5A60S2简介 (1) 1.3 仿真工具介绍 (2) 1.3.1 Protues简介 (2) 1.3.2 Keil uVision3简介 (4) 第二章硬件电路设计 (5) 2.1 复位电路 (5) 2.2 时钟电路 (5) 2.3 按键中断 (5) 2.4 显示电路 (6) 第三章程序设计流程图 (7) 第四章系统仿真 (8) 4.1 仿真图 (8) 4.2 程序 (8) 4.3 PCB.................................................................................................................. 错误!未定义书签。参考资料 ....................................................................................................................... 错误!未定义书签。

第一章系统方案设计 1.1 PWM PWM的全称是Pulse Width Modulation(脉冲宽度调制),它是通过改变输出方波的占空比来改变等效的输出电压。 1.2 STC12C5A60S2简介 STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。 1)管脚说明: 1、P0.0~P0.7 P0:P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。当P0口 作为输入/输出口时,P0是一个8位准双向口,内部有弱上拉电阻,无需外接上拉电阻。当P0作为地址/数据复用总线使用时,是低8位地址线A0~A7,数据线D0~D7 2、P1.0/ADC0/CLKOUT2 标准IO口、ADC输入通道0、独立波特率发生器的时钟输出 3、P1.1/ADC1 4、P1.2/ADC2/ECI/RxD2 标准IO口、ADC输入通道2、PCA计数器的外部脉冲输入脚,第二串口数据接收端 5、P1.3/ADC3/CCP0/TxD2 外部信号捕获,高速脉冲输出及脉宽调制输出、第二串口数据发送端 6、P1.4/ADC4/CCP1/SS非 SPI同步串行接口的从机选择信号 7、P1.5/ADC5/MOSI SPI同步串行接口的主出从入(主器件的输入和从器件的输出) 8、P1.6/ADC7/SCLK SPI同步串行接口的主入从出 9、P2.0~P2.7 10、P2口内部有上拉电阻,既可作为输入输出口(8位准双向口),也可作为高8位地址总线使用。 11、P3.0/RxD 标准IO口、串口1数据接收端 12、P3.1/INT0非 外部中断0,下降沿中断或低电平中断 13、P3.3/INT1 14、P3.4/T0/INT非/CLKOUT0 定时器计数器0外部输入、定时器0下降沿中断、定时计数器0的时钟输出 2)A/D转换器的结构: STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1口,有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型IO口,用户可以通过软件设置将8路中的任何一路设置为A/D 转换,不须作为A/D使用的口可继续作为IO口使用。 单片机ADC由多路开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器以及ADC_CONTER

合泰单片机C语言教程

Holtek 微控制器應用範例–使用Holtek C 語言目錄 第一章內容簡介 第二章選定Holtek C 語言的使用環境 2.1 進入HT-IDE3000 建立新的專案時, 選定Holtek C 編譯器 2.2 已開啟專案後, 選用Holtek C 編譯器 第三章微控制器C 語言程式的速成 3.1 定義主函式main() 3.2定義副函式(sub-function) 3.3定義全域變數(global variable) 3.4定義中斷服務函式(Interrupt Service Routine : ISR) 3.5 其他 第四章 C 語言程式 4.1 C 程式架構 4.2 開始用C 語言設計一個程式 4.2.1 定義主函式main 4.2.2 將標頭檔引入(include a header file) 4.2.3 定義文字符號及變數 4.2.4 設定微控制器及裝置的初始狀態 4.2.5 設計子函式 4.2.6 設計中斷服務函式 4.3變數(variable) 及資料型態(data type) 4.3.1 變數名 4.3.2 資料型態 4.3.3 變數的有效範圍(scope) 4.3.4 變數的資料型態(data type)

整數型(integer) 浮點型(floating point) 4.3.5 bit 資料型態 4.3.6儲存類別(storage class) 與修飾詞(qualifier) 儲存類別(storage class) 修飾詞(qualifier) 4.3.7絕對變數(absolute variable) 4.3.8常數(constant) 4.3.9指標(pointer) 與陣列(array) 指標的運算子& 與* 陣列(array) 4.3.10結構(struct) 與等位(union) 結構的運算子-> 與. 4.4運算子(Operators) 運算前的型態轉換 4.5程式流程控制(program flow control) 4.5.1if-else 敘述 4.5.2switch 敘述 4.5.3for 敘述 4.5.4while 敘述 4.5.5do-while 敘述 4.5.6goto 敘述 4.5.7break 與continue 敘述 4.6函式(Functions) 4.6.1參數(arguments) 4.6.2返回值(return values) 4.7中斷服務函式(Interrupt Service Routines) 4.8在C 語言程式中嵌入組合語言(in-line assembly code) 從組合語言的程式去存取 C 語言的物件(變數) 4.9前置處理指令(Preprocessor) 4.9.1 定義文字符號(#define)

单片机设计PWM三种方式

第一次学单片机,学到PWM 的时候刚好有很多事,就学的很是纠结。今晚不对是今晨,大概三点半有了一点思路,写下来,以飨初学者。 设计思路: A.单纯的通过延时程序,让单片机在某段时间内输出高电平,另一段时间内输出低 电平。思路很简单,但是稳定性有待商榷,频率不可调。 B.利用一个定时器,提高计时精度,if 语句 if(num == 1) // 设定占空比80% { led = 1; } else if(num == 5) { num = 0; led = 0; } 此方法稳定性也不是很高有大概10% 的占空比波动,当然也可以按位取反,不过占空比就只能是50% 了有一个人,做而论道这是他的百度 用户名,很强的一个人,使用三个定时器一个T0 控制频率两个外部中断INT0 INT1 分别控制pwm 的加减并且用数码管输出占空比的级数,程序摘录如 下,调节占空比的部分比较出彩 //========================================== #include unsigned int a, b; // ---------------------------- void main() { TMOD = 0x01; //T0 定时方式 1 TH0 = (65536-50000) / 256; //50ms@12MHz TLO = (65536-50000) % 256; TRO = 1; ET0 = 1; EX0 = 1; EX1 = 1;

IT0 = 1; IT1 = 1; EA = 1; a = 0; b = 10; while(1); } // ---------------------------- void time0() in terrupt 1 { TL0 = (65536-50000) % 256; TH0 = (65536-50000) / 256; 〃50ms@12MHz a++; if(a == 20) a = 0; // 在这里调整周期. if(a < b) P2 = 0xff; // 在这里调整占空比. else P2 = 0x00; P0 = ((b / 10) << 4) + b % 10; // 显示占空比等级 } // ---------------------------- void X0_INT() in terrupt 0 { b++; if(b > 19) b = 19; // 占空比等级最大为19 } // ---------------------------- void X1_INT() in terrupt 2 { b--; if(b < 1) b = 1; // 占空比等级最小为1. } //========================================== 原文链接关于MCS-51单片机实现PW啲方法_做而论道的空间_百度空间 C.在定时器里开启定时器,需要两个定时器,第一个控制频率,第二个控制 占空比稳定性非常高。 #include

合泰单片机总结

合泰单片机总结 --测试环境C编译器V2 1.Debug 2. 3.. 数 组 , 支 持 一 维 /二维数组(大小小于1bank>;

使用const关键字,变量将存储于程序存储区,如,const uint8_t tab[] = “1,2,3”。b5E2RGbCAP 5.中断服务函数: #pragma vector ISR_tmr0 @ 0x0c //定义中断入口地址 void ISR_tmr0(void> { tick++ 。} 6.中断函数中调用普通函数 (1>方法1 #pragma vector ISR_tmr0 @ 0x0c #pragma nolocal fun fun(> { } void ISR_tmr0(void> { fun(> 。 } (2>方法2 #pragma vector ISR_tmr0 @ 0x0c fun(>

{ } void ISR_tmr0(void> { #asm call _fun。 #endasm } 7.宏定义 #define _pa0 _12_0 //bit 0 of RAM address 0x12 8.位变量定义 对于有多个bank的MCU,位变量只能定义在bank0,使用如下方式 #pragma rambank0 bit flag 。 #pragma norambank 9.指针 (1)不支持指向“字符串数组” char *rainbow[] = { "red", "orange", "yellow" }。// not supportedp1EanqFDPw (2)只支持全局的静态函数指针,且所指函数不能带有参数

单片机原理与C51语言程序设计与基础教程课后习题答案

单片机原理与C51语言程序设计与基础教 程课后习题答案 习题 填空题 1.一般而言,微型计算机包括、、、四个基本组成部分。 2.单片机是一块芯片上的微型计算机。以为核心的硬件电路称为单片机系统,它属于地应用范畴。 3.Atmel 公司生产的CMOS型51系列单片机,具有内核,用 代替ROM作为程序存储器, 4.单片机根据工作温度可分为、和三种。民用级的温度范围是0℃一70℃,工业级是-40℃~85℃,军用级是-55℃-125℃(不同厂家的划分标推可能不同。 5.在单片机领域内,ICE的含义是。 选择题 1.单片机的工作电压一般为V? A 5V B 3V C 1V D 4V 2.单片机作为微机的一种,它具有如下特点: A 具有优异的性能价格比 B 集成度高、体积小、可靠性高 C 控制功能强,开发应用方便 D 低电压、低功耗。 3.民用级单片机的温度范围是: A -40℃~85℃ B 0℃一70℃ C -55℃-125℃ D 0℃一50℃ 4.MCS-51系列单片机最多有个中端源。 A 3 B 4 C 5 D 6 5.下列简写名称中不是单片机或单片机系统的是 A MCU B SCM C ICE D CPU 问答题 1.单片机常用的应用领域有哪些? 2.我们如何学习单片机这么技术? 3.单片机从用途上可分成哪几类?分别由什么用处? 答案 填空题 1.运算器、控制器、存储器、输入输出接口

2.单片机嵌入式系统 3.MCS-51 Flash ROM 4.民用级(商业级) 工业级军用级 5.在线仿真器 选择题 1.A 2.ABCD 3.B 4.C 5.D 问答题 1.单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: (1)在智能仪器仪表上的应用 单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。 (2)在工业控制中的应用 用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。 (3)在家用电器中的应用 可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。 (4)在计算机网络和通信领域中的应用 现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。 (5)单片机在医用设备领域中的应用 单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。 此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。2.首先,大概了解单片机的机构,例如本书的第2章则是主要讲了单片机的内部结构以及资源。对单片机的内部结构有了初步了解之后,读者就可以进行简单的实例练习,从而加深对单片机的认识。 其次,要有大量的实例练习。其实,对于单片机,主要是软件设计,也就是编程。目前最流行的用于51系列单片机地编程软件是Keil。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

合泰芯片休眠问题

合泰芯片休眠问题 由于公司产品需要低功耗,本人也是菜鸟,但是在网上要这方面的介绍但是不是很详细,所以本人就在边学习边调试,功夫不负有心人终于调试好了,以下是本人对合泰芯片休眠状态调试的心得,希望对初学合泰单片机的菜鸟们借鉴。也是对本人学习的巩固。 1.调试以前把PCB板上面的元器件都焊接好,保证调试板一定是OK的。 2.开始调试静态电流,把单片机取下来,看整个PCB板的静态电流是多少, 如果有其它的芯片配合的,先把芯片VDD断开,看看外围控制电路的电流是多少,如果外围静态电流大,就自己慢慢找,这里就不详细说明了。 3.外围电路电流达到你想要的值了,就可以开始单片机的设置了。 4.一般的休眠都有一个定时过程,起码要1分钟以上才能进入休眠吧,到合泰 芯片掩膜选项里面把看门狗关闭不用,注;(我这里是I/O脚唤醒,所以这样设置)。把要设定的唤醒口设置为wake-up 。然后再选择带上拉 pull-high。 5.再设定使用的I/O口,如果你把I/O口作为输入口就要带上拉 pull-high。如 果你把I/O口作为输出口,就不能带上拉。我知道由于控制需要有些I/O口一定要这样设置的,特别注意这里,因为这里会消耗几百uA电流的,把没有使用的I/O设置为输出口。或者在芯片内部没有引出了的也一样。 6.在进入休眠以前要把所使用的I/O口一定要按要求设置好,把init初始化里 面的特殊寄存器都要关闭,再进入休眠函数_halt();,如果单步进入函数程序,当程序运行到_halt();软件左下脚会显示“掉电模式”。程序会一直停留在这里,等待I/O口唤醒。 7.在休眠函数_halt();后面要把关闭掉的特殊寄存器按init初始的要求重新设定 好。注意;按前面的设置一样,要不然程序运行会不对的。只要按上面的要求设定好基本上是没有问题了。 8.如果还是不明白就联系我邮箱;liuyuron@https://www.360docs.net/doc/165568426.html,

51系列单片机输出PWM的两种方法

51系列单片机输出PWM的两种方法 51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。 一、原理原理图 图一 二、固定脉宽PWM输出 用T0定时器完成PWM输出,脉宽固定:65536微妙。T0定时器设置成:16位定时器 PWM: 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字)

PwmData1 ;T0定时t2所需的定时初值(字) PwmF ;PWM输出标志 ;********************************************************* setb tro ;启动T0 。。。。。。 T0Int:;T0中断服务程序 JB PwmF ,PwmOutH ;PWM输出未完成返回 Mov TH0,High(PwmData0) Mov TL0,Low(PwmData0) Setb tr0 Setb PwmF Clr p1.0 ;PWM输出脚 reti PwmOutH: Setb p1.0 Clr tr0 Mov TH0,High(PwmData1) Mov TL0,Low(PwmData1) Setb tr0 Clr PwmF reti 说明:在主程序中计算PwmData0、PwmData1的值。 三、可变脉宽PWM输出 用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。

T0、T1定时器设置成:16位定时器。 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字) PwmData1 ;T1定时T所需的定时初值(字);********************************************************* setb tro ;启动T0 setb tr1 。。。。。。 T0Int:;T0中断服务程序 Clr tr0 setb p1.0 ;PWM输出脚 reti T1Int:;T1中断服务程序 Clr p1.0 Clr tr0 Clr tr1 Mov TH0,High(PwmData0)

51单片机输出PWM的两种方法

51单片机输出PWM的两种方法 51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。 一、原理图 图一 二、固定脉宽PWM输出 用T0定时器完成PWM输出,脉宽固定:65536微妙。T0定时器设置成:16位定时器 PWM: 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字) PwmData1 ;T0定时t2所需的定时初值(字) PwmF ;PWM输出标志 ;********************************************************* SETB TR0 ;启动T0 T0Int:;T0中断服务程序 JB PwmF ,PwmOutH ;PWM输出未完成返回 Mov TH0,High(PwmData0) Mov TL0,Low(PwmData0) Setb tr0 Setb PwmF Clr p1.0 ;PWM输出脚 reti

PwmOutH: Setb p1.0 Clr tr0 Mov TH0,High(PwmData1) Mov TL0,Low(PwmData1) Setb tr0 Clr PwmF reti 说明:在主程序中计算PwmData0、PwmData1的值。 三、可变脉宽PWM输出 用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。T0、T1定时器设置成:16位定时器。 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字) PwmData1 ;T1定时T所需的定时初值(字) ;********************************************************* setb tro ;启动T0 setb tr1 。。。。。。 T0Int:;T0中断服务程序 Clr tr0 setb p1.0 ;PWM输出脚 reti T1Int:;T1中断服务程序 Clr p1.0 Clr tr0 Clr tr1 Mov TH0,High(PwmData0) Mov TL0,Low(PwmData0) Mov TH1,High(PwmData1) Mov TL1,Low(PwmData1) Setb tr1 Setb tr0 reti 说明:在主程序中计算PwmData0、PwmData1的值。

msp430单片机实现PWM

msp430单片机实现PWM PWM信号是一种具有固定周期(T)不定占空比(t)的数字信号,如下图所示。如果PWM信号的占空比随时间变化,那么通过滤波之后的输出信号将是幅度 变化的模拟信号。因此通过控制PWM信号的占空比,就可以产生不同的模拟 信号。 msp430单片机利用Timer_A或者Timer_B可以很好的实现产生任意PWM 信号。 Timer_A定时器的计数器工作在增计数方式,输出采用模式7(复位/置位模式),则可以利用CCR0控制PWM波形的周期,用某个寄存器CCRx控制占空比。 原理图如下:(注:这幅图片为网上下载,他用的是Timer_B定时器,故输出TBx) 摘录下面一段:www1.ti/customer/article/article12161.asp 将Timer_B配置为16-bit、up模式。在这种模式下计数器计数至CCR0,然 后复位从0开始重新计数。给CCR0赋值255也就意味着计数器的长度为 8bits。CCR1和TB1用于产生正弦波,CCR2和TB2用于产生直流电平。输出模式都选为模式7,即PWM复位/置位模式。如图2所示,在这种模式下,复 位后每一个定时器的输出都为高电平,直到计数器达到各自的CCRx值时变为 低电平,当计数器达到CCR0时再置位。也就是说CCRx的值决定了各自正脉 冲的宽带。若CCRx的值是变化的,就可以产生可变宽度的脉冲,下文中的正 弦波就是用这种办法产生的;若不变则产生的是固定宽度的脉冲,下文中的直 流电平就是这样产生的。最后SMCLK用作Timer_B的时钟源。系统采用 32768Hz的钟表晶振,通过采用内部硬件锁频环FLL(frequency-locked-loop),

(1小时学会C语言51单片机)C语言入门教程

相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机 (Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没 什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大 家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想 学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什 么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机, 但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片 机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候, 我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出, 或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看 我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具 体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上 书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似, 编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特 点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲 的全是C方面的,完全在浪费你的时间! 呵呵^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件 仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使 你每天捧着本书,把那本书翻烂,也永远学不会单片机的!刚接触单片机的朋友,看了资料,一定会对以下几个词见的比较多,但是具体的概 念还是比较模糊,现作如下说明: (1)编程器编程器是用来烧单片机芯片的,是把HEX或者BIN文件烧到单片机ROM里

相关文档
最新文档