找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3084|回复: 0
收起左侧

单片机使DAC0832输出锯齿波、三角波,并用示波器显示

[复制链接]
ID:624135 发表于 2020-6-12 20:50 | 显示全部楼层 |阅读模式
仿真电路:
51hei.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <math.h>
  3. #define DAC_PORT P2 //如图,DAC0832连接端口

  4. //两种波

  5. #define W_TRI 0
  6. #define W_SAW 1

  7. #define PI 3.1415926f //圆周率

  8. //简化类型符写法
  9. typedef unsigned char u8;
  10. typedef unsigned int u16;
  11. typedef unsigned long u32;

  12. sbit DAC_WR=P3^6; //DAC0832使能口
  13. sbit DAC_CS=P1^7;

  14. //全局变量
  15. u8 mode;//模式:锯齿波,三角波
  16. u16 freq;//频率
  17. u8 time;//计次参数
  18. u8 AM;//调幅


  19. void Timer0Init(void);
  20. void sys_init(void);
  21. void tri_wave(u8 location);//三……
  22. void saw_wave(u8 location);//锯……

  23. void Timer0Init(void)                //100微秒@12.000MHz
  24. {
  25.         TMOD &= 0xF0;                //设置定时器模式
  26.         TMOD |= 0x02;                //设置定时器模式
  27.         TL0 = 0x9C;                //设置定时初值
  28.         TH0 = 0x9C;                //设置定时重载值
  29.         TF0 = 0;                //清除TF0标志
  30.         TR0 = 1;                //定时器0开始计时
  31.         EA = 1;         //开总中断
  32.         ET0 = 1;        //开定时器0中断
  33. }

  34. void sys_init(void)//系统初始化
  35. {
  36.         time=0;
  37.         DAC_WR=0;
  38.         DAC_CS=0;
  39.         DAC_PORT=0;
  40.         mode=0;//默认输出三角波,mode=1;输出锯齿波
  41.         freq=100;//默认频率100Hz
  42.         AM=255;//最大幅度
  43. }

  44. void tri_wave(u8 location)//三……
  45. {
  46.         //为了简化,在单周期输出V字形
  47.         u8 y;
  48.         if(location<50)
  49.                 y=(50-location)*AM/50;
  50.         else
  51.                 y=(location-50)*AM/50;
  52.         DAC_PORT=y;
  53.         
  54. }
  55. void saw_wave(u8 location)//锯……
  56. {
  57.         DAC_PORT=location*AM/100;
  58.         //用(100-location)也以变成反向锯齿
  59. }

  60. void Timer0Work() interrupt 1 //中断服务函数
  61. {
  62.         switch(mode)
  63.         {
  64.         
  65.                 case W_TRI:tri_wave((u8)((time*freq/100)%100));break;
  66.                 case W_SAW:saw_wave((u8)((time*freq/100)%100));break;
  67.         }
  68.         time++;
  69.         if(time>=100)//计数100次
  70.                 time=0;
  71. }

  72. int main(void)
  73. {
  74.         sys_init();
  75.         Timer0Init();
  76.         while(1)
  77.         {
  78.                 ;
  79.         }
  80. }
复制代码
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
所有资料51hei提供下载:
DAC0832.rar (52.33 KB, 下载次数: 19)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表