pcf8591是8位的ad转换器芯片,带da输出功能
用单片机定时器 定时输出数字量 转化成模拟电压 形成正弦波
运行后 在debug里面选择 digital oscillscope 调出示波器
通道a 幅值2mv 扫面速度2us
波形如下
单片机源程序如下:
- #include "reg51.h"
- #include "intrins.h"
- #include<math.h>
- #define time_step 15000 // 定时器时常
- unsigned char DSY_BUFF_CODE[16] = {0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- sbit seg1 = P2^4;
- sbit seg2 = P2^5;
- sbit seg3 = P2^6;
- sbit seg4 = P2^7;
- void timer_init();
- void sentad_data(unsigned char);
- double rad;
- void main()
- {
- timer_init();
- // sentad_data(0xff);
- while(1);
- }
- void timer_init()
- {
- TMOD=0x01;
- TH0=(65536-time_step)/256;
- TL0=(65536-time_step)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void timer0_int() interrupt 1
- { static unsigned char wei=0;
- static char d;
- static unsigned int num = 0; //num 代表360个点中的第几个点 每次递增5个点
-
- TH0=(65536-time_step)/256;
- TL0=(65536-time_step)%256;
- d =(char)( (sin(0.01744*num))*127); // 3.14115/180 表示每度的弧度值 乘以度数num
- // 再把度数的sin值乘以127 输出成模拟电压量注意不能乘以255 因为这里是有符号类型 最高位是符号为 所以8位的数值最大位127
-
- if((d&0x80)!=0x80) d = d|0x80; //这里要再把最高位取反 与上0x80不等于0x80说明最高位为0 那么或上0x80将最高位置1
- else d &= 0x7f; // 如果不将最高位取反的话 波形会有问题 见文件夹中的截图
-
- sentad_data(d); //将d输出成模拟电压
- if(num==360) num =0;
- num = num + 5; //每次递增5度
- switch(wei) // 将d值送至数码管显示 可以通过调高time_step 观察d值 用于调试
- {
- case 1:
- P2 &= 0x0f;
- P0 = DSY_BUFF_CODE[d/1000];
- seg1 = 1;
- break;
- case 2:
- P2 &= 0x0f;
- P0 = DSY_BUFF_CODE[d%1000/100];
- seg2 = 1;
- break;
- case 3:
- P2 &= 0x0f;
- P0 = DSY_BUFF_CODE[d%100/10];
- seg3 = 1;
- break;
- case 4:
- P2 &= 0x0f;
- P0 = DSY_BUFF_CODE[d%10];
- seg4 = 1;
- break;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1.zip
(227.92 KB, 下载次数: 100)
|