MCS51单片机是我国应用最为广泛的单片机种。以往单片机应用程序主要用汇编语言编写,由于汇编语言程序的可读性和可移植性都较差,采用汇编语言编写单片机应用程序不但周期长,而且调试和排错也比较困难。为了提高编制单片机应用程序的效率,改善程序的可读性和可移植性,采用高级语言无疑是一种好的选择。C语言是一种通用的计算机程序设计语言,既具有一般高级语言的特点,又能直接对计算机的硬件进行操作,表达和运算能力也较强,许多以往只能采用汇编语言来解决的问题现在都可以改用c语言来解决。

德国Keil Software公司多年来致力于单片机c语言编译器的研究。该公司开发的Keil C51是一种专为8051单片机设计的高效率c语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储器空间极小,完全可以和汇编语言相媲美。Keil C51具有丰富的函数库,包含100多种功能函数,为用户编程提供了极大的方便。C51程序可以实现与汇编语言的接口,两者相互之间的调用十分方便。。高版本的Keil C51编译器,尤其是Keil Vision2(基于Windows操作系统的C51集成编译环境),以其性能优秀、使用方便,受到了众多单片机爱好者的欢迎。

在有些测量仪表中,常需要提供不同频率的低频正弦波信号源,它们的频率完全成整数倍关系。如测量电厂工业用水的电导为防止电极传感器的极化,要用低频正弦波信号作为激励源,双频测导法就要求提供精确双倍频率的正弦信号。常用的正弦波信号倍频或分频采用的方法有:方波信号分频后滤波;

锁相合成法;

单片机控制的D/A转换后再滤波等。

方法① 由于基频的谐波分量大,滤波效果差而很少采用;方法②采用的是压控振荡原理,常用于高频正弦信号的倍频或分频;方法③ 由于高频谐波分量远小于基波分量,滤波效果好且能精确定时,容易实现信号的倍频或分频。本文采用单片机AT89C2051控制D/A转换实现倍频正弦波信号的产生,编程语言采用的就是Keil C51。

1 硬件电路    图1为倍频正弦波信号发生电路,U2为l0位串行DA集成电路TLC5615(TEXAS仪器公司生产),VREF为2.5v的标准参考电压。U3 MAX813为看门狗复位集成电路,在U1(AT89C2051)出现程序跑飞时可自动复位。U1控制DA输出正弦变化的阶梯电压,经R1、C3滤波,C4隔直后即可得到波形较理想的正弦波,只要在一个周期内保证有足够多的输出点数。

图1  倍频正弦波发生电路

U1根据P1.3和P1.4(标号分别为SWF0和SWF1)的状态控制正弦波的产生与停止及基频与倍频,它们的组合关系为:SWF1=1、SWF0=x时DA无正弦信号输出;SWF1=0、SWF0=0时DA输出基本频率的正弦信号;SWF1=0、SWF0=1时DA输出双倍基频的正弦信号。DA转换器TLC5615遵从SPI标准的三线串行通信协议,三线分别是:/CS片选线,低电平有效;SCLK时钟线;DIN数据线。SPI串行总线上数据传送时序如图2所示,图中在/CS低电平有效时,时钟线SCLK上升沿时数据线DIN上的数据必须稳定,方可保证数据的正确传送,当/CS高电平时器件不接受数据,这样可在SPI串行总线上挂多个支持SPI标准的器件。有关SPI串行总线的具体参数请参阅器件资料。

图2 SPI串行数据总线数据传送时序图

2 Keil C51程序

单片机程序采用Keil C51编程语言编写,经编译后生成HEX文件即可固化在AT89C2051中。一个C,51工程(project)的源程序由C文件和H头文件等组成。本文下面给出的C文件wave.c中有主程序"void main(void)"、DA转换输出函数"void da.out(void)"和定时器中断函数"void timer0(void)interrupt 1 using 2"组成。两次DA转换之间采用定时器0进行定时。在产生基频正弦信号或倍频正弦信号时不改变定时器的定时时间,而是通过传送给DA不同的数字量来实现,即头文件中的产生基频正弦信号的wavel数组和产生倍频信号的waveh数组的长度一样,均为128,但wavel是一个周期内正弦波的数字量,waveh是两个周期内的数字量,前64个数值与后64个数值相同。这样可以避免执行重置定时常数的指令而引起的时间误差,从而得到精确的双倍频关系。另外,wavel数组中的峰-峰值(最大值-最小值)约为waveh数组中峰-峰值的一半,这样使得经RC滤波后两种频率的正弦波幅度近似相等,以满足使用要求。如程序中的定时常数(TH0=0xff,TL0=0x00),在晶振为20MHz时,测得基频为50.6Hz,倍频为101.2Hz。以下是C51源程序wave.c和H头文件wave.h,在Keil C51 V6.12下编译通过生成HEX文件。

C51源程序wave.c

#include

#include

#include "wave.h"

void da_out(void); //声明函数

sbit DIN=0x97; //P1.7位定义

sbit SCLK=0x96; //P1.6位定义

sbit DACS=0x95; //P1.5位定义

sbit SWF1 =0x94; //P1.4位定义

sbit SWF0 =0x93; //P1.3位定义

sbit WDI =0x92; //P1.2位定义

sbit FLAG = 0x90;

IUI word; //IUI即idata unsigned int,在wave.h中预定义

void main(void){

IUI i;

TMOD =0x01; //定时器0方式1;

TH0=0xff;TL0=0x00; //置定时器0常数;

TR0=1; //启动定时器0

ET0=1;EA=1; //开定时器中断及总中断

SWF0=1;SWF1=1; //设P1.3,P1.4为输入

WDI=1; //看门狗输入置高电平

while(1){

for(i=0;i<128;i++){

FLAG=1; //置标志,FLAG在定时器0中断程序中被清除

WDI=0;_nop_();WDI= 1;//看门狗复位

if(SWF1) word=512; //SWF1=1时,DA输出同一量,无正弦信号输出

else{

if(SWF0) word=waveh[i];//取倍频数字量

else word=wavel[i]; //取基频数字量

}

word=word<<6; //10位数字量移至高位

while(FLAG); //等待,直至定时器中断程序中清FLA G

da_out(); //调用DA输出子程序

}

}

}

void timer0(void) interrupt 1 using 2{

TH0=0xff;TL0=0x00;//重置定时器常数

FLAG=0;//清主程序中的等待标志

}

void da_out(void){

IUI i;

SCLK =0;_nop_();DACS=0; //准备传送数据

for(i=0;i<10;i++){

DIN= (bit)(word&Ox80); //取最高位送数据线

word = word << 1; //左移,准备下一位传送

SCLK =1;_nop_();SCLK =0; //一个CLK信号

}

DACS= 1;_nop_();SCLK=1; //传送结束

}

H头文件(wave.h):

typedef idata unsigned int IUI;

int code wavel[]={

512,524,537,550,563,698,707,715,723,731,775,775,774,772,770,698,689,679,669,658,

512,499,486,473,460,325,316,308,300,292,248,248,249,251,253,325,334,344,354,365,

};

int code waveh[]={

512,562,611,660,707,753,796,836,874,907,937,963,985,1001,1014,1021,

1023,1021,1014,1001,985,963,937,907,874,836,796,753,707,660,611,562,

512,46l,412,363,316,270,227,187,149,116,86,60,38,22,9,2,

0,2,9,22,38,60,86,116,149,187,227,270,316,363,412,461,

512,562,611,660,707,753,796,836,874,907,937,963,985,1001,1014,1021,

1023,1021,1014,1001,985,963,937,907,874,836,796,753,707,660,611,562,

512,461,412,363,316,270,227,187,149,116,86,60,38,22,9,2,

0,2,9,22,38,60,86,116,149,187,227,270,316,363,412,461

}:

3  小结

笔者有多年的单片机汇编语言编程经历,改用Keil C51后感觉很好,编程效率大为提高。本文是Keil C51在正弦波产生中的应用,由C源程序可见,程序较汇编语言程序可读性大为提高,非常简炼。本文介绍的倍频正弦波信号发生电路已用于某型电导率表中,效果很好。

keil编写正弦函数_Keil C51编程控制倍频正弦信号的产生相关推荐

  1. keil编写正弦函数_【高中数学】62个重要函数图像

    关注↑↑↑获得更多精彩内容! 教育意味着获得不同的视角,理解不同的人.经历和历史. 接受教育,但不要让你的教育僵化成傲慢. 教育应该是思想的拓展,同理心的深化,视野的开阔. 它不应该使你的偏见变得更顽 ...

  2. keil编写正弦函数_怎么用c语言编正弦函数计算

    展开全部 1.C语言中要编写62616964757a686964616fe58685e5aeb931333337613837sin函数,实质上要利用sin的泰勒公式,然后根据泰勒公式,将其中的每一项进 ...

  3. keil编写正弦函数_【STM32F407的DSP教程】第18章 DSP控制函数-更好用的SIN,COS计算...

    第18章       DSP控制函数-更好用的SIN,COS计算 本期教程主要讲解控制函数中的cos和sin函数数值的获取,这里使用的函数比起第13章中使用的sin和cos函数数值的获取要方便很多. ...

  4. 基于Ubuntu(x86)系统和STM32(Keil)编写C程序分别进行编程、验证

    文章目录 实验内容 一.基本概念 (一).全局变量 (二).局部变量 (三).堆和栈 二.编程验证 (一).基于Ubuntu用Linux系统编写C程序 (二).基于STM32用Keil编写C程序 三. ...

  5. 使用Keil语言的嵌入式C编程教程(上)

    使用Keil语言的嵌入式C编程教程(上) Embedded C Programming Tutorial with Keil Language Embedded System 嵌入式系统是指以单片机为 ...

  6. 用四位led数码管作显示器的篮球比赛24秒计时器求c语言代码,单片机编程控制LED七段数码管作显示的篮球赛计时计分系统...

    本次设计用由AT89C51编程控制LED七段数码管作显示的球赛计时计分系统.系统应具有赛程定时设置,赛程时间暂停,及时刷新甲.乙双方的成绩以及赛后成绩暂存等功能. 内容包括:显示.键盘.时钟等内容设计 ...

  7. 从51能不学编程只学c语言,51单片机C语言学习笔记8:单片机C51编程规范

    为了普及源圭表的质地和可庇护性,从而最终普及软件产物临蓐力,特编写此表率. 本程序规则了圭表打算职员举行圭表打算时务必遵命的表率.本表率要紧针对C51编程讲话和keil编译器而言,包罗排版.诠释.定名 ...

  8. labview高级编程与虚拟仪器工程应用 代码_用labview自己编程控制专用的声发射仪器...

    有些同学有时会问,能不能用labview编程直接控制专用的声发射设备进行数据采集,然后按自己的分析算法编写程序? 现在可以实现了--^_^ 专用的声发射采集卡和通用的数据采集卡有什么区别?1.硬件实时 ...

  9. Keil uVision5软件同时使用C51、ARM、Nuvoton单片机和STC单片机的安装和配置方法

    一.安装工具 1.Keil uVision5软件的C51安装包及破解软件 2.Keil uVision5软件的MDK(ARM)安装包及破解软件 3.新唐(Nuvoton)单片机关于Keil uVisi ...

  10. UR机器人C语言和Python编程控制

    UR机器人编程控制 一.通过 TCP/IP 进行远程控制 二.UR机器人通信端口类型 2.1.Modbus TCP端口(502端口) 2.2.C语言上位机编程端口(30001/30002/30003端 ...

最新文章

  1. 【 C 】用链表实现堆栈
  2. 计算机组成原理知识点概叙--计算机系统简介
  3. springboot整合postgre和hbase实现互相交互功能
  4. lambda表达式方法泛型_模板方法模式–使用Lambda表达式,默认方法
  5. action请求是什么意思_凭什么说大疆Osmo Action可以干掉 GoPro hero7?
  6. python中的集合set
  7. 前端httpd+keepalived加后端heartbeat+nfs+drbd实现httpd服务的高效应用及资源统一管理...
  8. Python查找所有类似于123-45-67+89 = 100的组合
  9. 078 numpy模块
  10. GAT1400---基于libcurl库的开发
  11. 群晖NAS设备安装和基础操作详细流程(例:DS920+)
  12. HL340(usb转串口线)驱动
  13. 【小萝莉说Crash】第一期:Unrecognized selector sent to instance xxxx
  14. Vue data 中随意更改一个属性,视图都会被更新吗?
  15. Navicat 打开数据库自动断开解决方法
  16. element ui的双层el-dialog样式控制
  17. HTML期末大作业—— 游戏网页(5个页面) ~ 全屏游戏美术大赛作品征集网页 HTML+CSS+JS ~ web课程设计网页规划与设计
  18. 卢俊卿谈亲情让城市充满温暖
  19. dB单位理解,声音,天线,功率
  20. 数据库设计思想深究----Mysql(图文)

热门文章

  1. 2022/12/11创建openai账号(chatgpt)
  2. mysql-mmm vip 切换问题_mysql-mmm复制延迟的想法
  3. Android实现校园新闻APP,基于android平台的校园新闻app的开发 大学毕业论文.doc
  4. 计算机设备选型原则,计算机中通信技术的选用应遵循什么原则
  5. LCD直流数显多功能电压电流功率表电压电流表电量量产资料
  6. 【游戏开发进阶】教你自制离线Maven仓库,实现Unity离线环境使用Gradle打包(Unity | Android | 谷歌 | Gradle)
  7. 诛仙斩龙墨雪服务器怎么找不到了,《诛仙3》5月13日服务器数据互通公告
  8. 【WPS表格】数据透视表:统计各商品及各分店的销售总额
  9. 宜搭自建费控应用如何与金蝶云星空对接打通
  10. linux两块硬盘主从,电脑双硬盘双系统启动的顺序调整及设置方法