基于STC51系列单片机的SPWM波形实现,程序如何编写急急急急

基于STC51系列单片机的SPWM波形实现,程序如何编写急急急急,第1张

/

// 载波比选为N=24,调制比M=Uc/Ur=1,晶振频率12M

// 正弦波频率50Hz

// 高电平的宽度Tpw = Tt/2(1+Msimwt)

// 低电平的宽度Tpw = Tt/2(1-Msimwt)

// Tt周期

// T2是产生SPWM波形,并从P1^1输出,用导线连接到P34作为测试频率使用。

// T1工作在定时方式1,定时1s

// T0工作在计数方式,对输入的脉冲进行计数,溢出产生中断。

// 16位计数器最大值是65536,1s内可能会产生多次溢出,所以在中断处理程序对中断的次数进行

// 计数。1s到后,将中断的计数器里的计数值取出进行综合处理,处理后的数据送显示。

//信号频率的计算方法:

// T0工作在计数方式,假设1s内溢出C1次,最后未溢出的计数值是C2,则频率公式为:

// F=C12^16+C2 = C165536+TH0256+TL0)

//使用12MHz时钟,测量的最大范围是不大于500KHz。

/

#include "reg52h"

#define uchar unsigned char

#define uint unsigned int

uchar disp[8]={0,0,0,0,0,0,0,0};

uchar FreStr[]="Friquency is:";

uchar T0count,T1count;

uchar code x[]={66,38,26,89,15,97,7,102,2,103,1,102,2,

97,7,89,15,78,26,66,38,38,66,26,78,15,

89,7,97,2,102,1,103,1,103,2,102,7,97,15,

89,26,78,38,66};

uchar ky,kc,count=255;

sbit L1=P1^1;

void delayms(uchar ms)

{

uchar i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

//LCD定义开始

//以下三个是定义LCD的引脚

sbit lcden=P0^5;

sbit lcdwrite=P0^6;

sbit lcdrs=P0^7;

//延时程序

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//lcd的写指令

void write_com(uchar com)

{

lcdrs=0;

lcden=0;

P2=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//lcd的写数据

void write_data(uchar da)

{

lcdrs=1;

lcden=0;

P2=da;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//初始化

void Lcd_init()

{

lcdwrite=0;

lcden=0;

write_com(0x38); //162显示,57点阵,8位数据

write_com(0x0c);//显示开,关光标

write_com(0x06); //移动光标

write_com(0x01);//清除LCD的显示内容

}

//LCD定义结束

//计算频率值

void calc()

{

uchar i;

long frequency;

frequency=(T0count256+TH0)256+TL0;

for(i=7;i>0;i--)

{

disp[i]=frequency%10;

frequency=frequency/10;

}

disp[0]=frequency;

}

void init()

{

T0count=0;

T1count=0;

TH0=0;

TL0=0;

}

void main()

{

uchar dis;

init();

Lcd_init();

TMOD=0x15;

TH1=(65536-5110592/12)/256;

TL1=(65536-5110592/12)/256%10;

ET1=1;

ET0=1;

EA=1;

TR1=1;

TR0=1;

//以下四句的作用是在P11引脚上形成1000Hz的脉冲,用导线连接到P34作为测试用。将其中

//高8位和低8位的初始值更改后可输出不同频率的脉冲。

T2MOD = 0x02;

TH2=255-x[ky];

TL2=255-x[ky];

ET2=1;

EX0=1;

TR2=1;

L1=1;

write_com(0x80);

for(dis=0;dis<12;dis++)

write_data(FreStr[dis]);

while(1)

{

write_com(0xC0);

for(dis=0;dis<8;dis++)

write_data(disp[dis]+0x30); //显示频率

}

}

//计算输入脉冲的次数

void time0() interrupt 1

{

T0count++;

}

//计算1s时间

void time1() interrupt 3

{

TH1=(65536-5110592/12)/256;

TL1=(65536-5110592/12)/256%10;

if(T1count==20)

{

calc();

init();

}

else T1count++;

}

//这是产生SPWM波形、

void M() interrupt 5

{

TH2=255-x[ky];

TL2=255-x[ky];

kc++;

if(kc==count)

{

kc=0;

L1=~L1;

ky++;

if(ky==49) ky=0;

}

}

//这是使用外部中断0可以调整输出波形的频率

void MM() interrupt 0

{

delayms(300);

if(INT0==0)

{

count=count-5;

if(count==0) count=255;

}

}

相信喜欢单片机的朋友都用过STC的单片机,用过STC单片机的朋友都有这种感受:实惠、易用、功能强大!就是每次下载都要冷启动特别恶心,相信很多朋友的开发板上的电源键都按烂了。

其实STC单片机可以不用免掉电下载,想要知道怎样才能免掉电下载,我们先要了解STC单片机是怎样实现串口下载的,其实STC单片机出厂时就预置了一段ISP监控程序,我们称作ISP引导码,这段ISP监控程序就好比电脑硬盘的系统引导区。我们对STC单片机上电启动时,单片机首先执行ISP引导码检测串口是否下载程序的命令,如果上位机在对单片机下载程序时,单片机检测到下载数据流就启动ISP下载功能对单片机进行程序下载,这就是我们平时实验时点击下载后按开发板电源键的过程。

STC单片机在进行冷启动时会从ISP引导码开始执行程序,而进行热启动或按复位键软启动时是从用户程序段开始执行的。然而熟悉STC单片机的朋友知道STC单片机增加了ISP/IAP控制寄存器ISP_CONTR,用来管理ISP/IAP功能和是否软启动,其各位功能大家可参照STC公司相关资料。当我们将ISP_CONTR置为0x60时单片机自动复位从ISP引导码开始执行。由此我们在需要下载程序时将ISP_CONTR置为0x60就可以完成下载了。

/

标题: 试验数码管显示时钟

通过本例程了解 DS1302时钟芯片的基本原理和使用 ,理解并掌握DS1302时钟芯片

驱动程序的编写以及实现数字字符在数码管中的显示。

注意:JP1302跳线冒要短接。

请学员认真消化本例程,懂DS1302在C语言中的 *** 作

/

#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include <intrinsh>

sbit SCK=P3^6; //时钟

sbit SDA=P3^4; //数据

sbit RST = P3^5;// DS1302复位

sbit LS138A=P2^2;

sbit LS138B=P2^3;

sbit LS138C=P2^4;

bit ReadRTC_Flag;//定义读DS1302标志

unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00

unsigned char l_tmpdisplay[8];

code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位

code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

//共阴数码管 0-9 '-' '熄灭‘表

//

/ 函数声明 /

//

void Write_Ds1302_byte(unsigned char temp);

void Write_Ds1302( unsigned char address,unsigned char dat );

unsigned char Read_Ds1302 ( unsigned char address );

void Read_RTC(void);//read RTC

void Set_RTC(void); //set RTC

void InitTIMER0(void);//inital timer0

//

/ 主函数 /

//

void main(void)

{

InitTIMER0(); //初始化定时器0

Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽

while(1)

{

if(ReadRTC_Flag)

{

ReadRTC_Flag=0;

Read_RTC();

l_tmpdisplay[0]=l_tmpdate[2]/16; //数据的转换,因我们采用数码管0~9的显示,将数据分开

l_tmpdisplay[1]=l_tmpdate[2]&0x0f;

l_tmpdisplay[2]=10; //加入"-"

l_tmpdisplay[3]=l_tmpdate[1]/16;

l_tmpdisplay[4]=l_tmpdate[1]&0x0f;

l_tmpdisplay[5]=10;

l_tmpdisplay[6]=l_tmpdate[0]/16;

l_tmpdisplay[7]=l_tmpdate[0]&0x0f;

}

}

}

//

/ 定时器0初始化 /

//

void InitTIMER0(void)

{

TMOD|=0x01;//定时器设置 16位

TH0=0xef;//初始化值

TL0=0xf0;

ET0=1;

TR0=1;

EA=1;

}

//

/ 写一个字节 /

//

void Write_Ds1302_Byte(unsigned char temp)

{

unsigned char i;

for (i=0;i<8;i++) //循环8次 写入数据

{

SCK=0;

SDA=temp&0x01; //每次传输低字节

temp>>=1; //右移一位

SCK=1;

}

}

//

/ 写入DS1302 /

//

void Write_Ds1302( unsigned char address,unsigned char dat )

{

RST=0;

_nop_();

SCK=0;

_nop_();

RST=1;

_nop_(); //启动

Write_Ds1302_Byte(address); //发送地址

Write_Ds1302_Byte(dat); //发送数据

RST=0; //恢复

}

//

/ 读出DS1302数据 /

//

unsigned char Read_Ds1302 ( unsigned char address )

{

unsigned char i,temp=0x00;

RST=0;

_nop_();

_nop_();

SCK=0;

_nop_();

_nop_();

RST=1;

_nop_();

_nop_();

Write_Ds1302_Byte(address);

for (i=0;i<8;i++) //循环8次 读取数据

{

if(SDA)

temp|=0x80; //每次传输低字节

SCK=0;

temp>>=1; //右移一位

_nop_();

_nop_();

_nop_();

SCK=1;

}

RST=0;

_nop_(); //以下为DS1302复位的稳定时间

_nop_();

RST=0;

SCK=0;

_nop_();

_nop_();

_nop_();

_nop_();

SCK=1;

_nop_();

_nop_();

SDA=0;

_nop_();

_nop_();

SDA=1;

_nop_();

_nop_();

return (temp); //返回

}

//

/ 读时钟数据 /

//

void Read_RTC(void) //读取 日历

{

unsigned char i,p;

p=read_rtc_address; //地址传递

for(i=0;i<7;i++) //分7次读取 秒分时日月周年

{

l_tmpdate[i]=Read_Ds1302(p);

p++;

}

}

//

/ 设定时钟数据 /

//

void Set_RTC(void) //设定 日历

{

unsigned char i,p,tmp;

for(i=0;i<7;i++){ //BCD处理

tmp=l_tmpdate[i]/10;

l_tmpdate[i]=l_tmpdate[i]%10;

l_tmpdate[i]=l_tmpdate[i]+tmp16;

}

Write_Ds1302(0x8E,0X00);

p=write_rtc_address; //传地址

for(i=0;i<7;i++) //7次写入 秒分时日月周年

{

Write_Ds1302(p,l_tmpdate[i]);

p++;

}

Write_Ds1302(0x8E,0x80);

}

//

/ 定时器中断函数 /

//

void tim(void) interrupt 1 using 1

//中断,用于数码管扫描

{

static unsigned char i,num;

TH0=0xf5;

TL0=0xe0;

P0=table[l_tmpdisplay[i]]; //查表法得到要显示数字的数码段

switch(i)

{

case 0:LS138A=0; LS138B=0; LS138C=0; break;

case 1:LS138A=1; LS138B=0; LS138C=0; break;

case 2:LS138A=0; LS138B=1; LS138C=0; break;

case 3:LS138A=1; LS138B=1; LS138C=0; break;

case 4:LS138A=0; LS138B=0; LS138C=1; break;

case 5:LS138A=1; LS138B=0; LS138C=1; break;

case 6:LS138A=0; LS138B=1; LS138C=1; break;

case 7:LS138A=1; LS138B=1; LS138C=1; break;

}

i++;

if(i==8)

{

i=0;

num++;

if(10==num) //隔段时间读取1302的数据。时间间隔可以调整

{

ReadRTC_Flag=1; //使用标志位判断

num=0;

}

}

}

STC 先安装<STC 单片机编程工具>软件到计算机中, 然后进行下面的 *** 作。 以下是烧录程序的主要界面。 烧录过程非常简单, *** 作也非常简单。 图中红色的五个大数字就 表示了整个过程。简简单单的五步就可以了(实际上只需 4 步)。 启动本烧录程序后, 第一步就是选择烧录器件。 本烧录软件支持STC 全系列的 51 单片机芯片, 因此, 第一步必须选择相对应的型号。 由于本实验板选用的单片机芯片就是本烧录软 件首次启动默认的型号,所以,本项一般都不需要选择。另外,“ AP Memory”是指该芯片的内存大小和起止地址, 根据器件型号自动更改, 不必 理会。 选择了器件型号, 第二步就应该选择将要被烧录的 HEX 机器码文件。 HEX 文件由单片机开发环境输入、 编辑代码, 最后编绎产生。至于如何产生 HEX 文件, 很多资料也都有介绍, 本板光盘中有详细的说明, 并且提供了多套开发软件(每套都能用) 。 通过对照自学完全可以很快掌握 *** 作。 并且,本实验板光盘也提供了多 种单片机开发环境供大家学习研究。 本光盘中提供了一些例子程序, 大家可以点“open file”按钮, d出以下窗口(源程序也 有,但这里不显示),先选择一些例子程序烧录实验。 选好了文件后, 大家可以发现“文件校验和” 中的数据发生了变化, 大家可以通过留意这个数据是否 变化来确 定打开文件是否成功, 或者文件刷 新是否 有更改。 当然, 文件打开后, 会显示在右边的数据区, 大家也可以观查右边数据区是否有更改。不过, 当数据太多时, 更改的地方又很少时, 观查“文件校验和” 会更快更准确。 选好了器件, 选好了文件, 第三步就可以设置串口和串口通信速度了。 串口是一个九针的插座, 老式的鼠标口就是串口。 为了让通信可靠, 我们可以适当的选低一些的速度, 这个串 口线较长时非常重要。 烧录过程中, 如果出现失败, 可以考虑将串口通信速度降低再试, 这是由于机器配置以及当地环境因素决定的, 当环境干扰过大时, 必需选低一点的波特率(即通信速率) 。烧录成功与失败,可以从信息区的提示看出。 选择并设置好串口后(一般不需更改) , 进入第四步, 而这一步基本上不用更改。 设置时钟倍频主要是为了提高工作速度, 设置时钟增益是为了降低电磁幅射。 这些, 对于高级工程人员和最终产品会很有用, 对于初学者来说, 只当没有看见就行了。第五步是最后一步, 点击“Download/下载” , 就可以进入烧录状态。特别 说明 :点击“ Download/ 下载”之前实验板的电源开关必须关闭,使单片 机彻底断电, 点击“Download/下载” 之后才可以使单片机上电,完成 程序的烧录。 注意: 点击“Re-Download/重复下载” 也可以, 这常用于大批量的编程, 不必每次都去点“Download/下载” 。 出现以下图状态时, 给实验板通电就可以完成编程过程(如果实验 板已经通电,则必须关掉电源 1 秒钟再次通电)。 重点注意事项: 注意: 整个烧录过程中(任何过程中) , 不要用手或者导体接触单片机集成电路的引脚或者电路! 这样很可能会永久性的损坏单片机实验板或者集成电路或者电脑主机。 原因: 绝对大多数的电脑没有采取良好的接地措施! 而电脑主机、 显示器的电源电路中,又有电容直接连接到市电, 这个电压和电流经常会达到很高, 当我们触摸电脑机箱后, 有时会感受到明显的电击, 就是这个原因! 另外尽量消除人体的高压静电, 高压静电也可能对 集成电路或者电路已经造成永久性的损坏。 解决方法: 当实验板与电脑连接时, 尽量不要用手接触单片机引脚; 尽量消除人体的高 压静电(实验时保持手有一定的潮湿度,可有效抑制静电产生) 现在就过过瘾吧! 在本光盘中提供了一些例子程序, 并且提供了已经编译好的HEX文件, 立即打开,试着分别烧录试试吧! 同一块集成电路(MCU), 通过不同的源程序代码, 倾刻间表现出不同的功能, 并且可以长期稳定工作, 这就是单片机的魅力所在! 只有懂了单片机, 才能设计开发出更复杂 、更可靠、更稳定的产品! 所以说, 不论学习电子技术多少年, 不论有了多少年电子工作经验, 不论是否会修理电 子产品,如果不懂单片机,就始终低人一等!!! 单片机不难, 采用本站最新S TC 编程、 实验、 开发一体化功能单片机板, 先实践, 后理 论,在书和光盘的帮助下,让你最快速度学会单片机! 仕别三日, 当令人刮目相看! 要实现理想, 从现在做起!

以上就是关于基于STC51系列单片机的SPWM波形实现,程序如何编写急急急急全部的内容,包括:基于STC51系列单片机的SPWM波形实现,程序如何编写急急急急、stc单片机带有出厂程序、STC单片机可编程时钟怎么用,再好给个例子,因为STC资料里的例子试过发生不了时钟波形,谢谢了。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9586319.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存