51单片机驱动模数转换芯片DAC0832产生锯齿波 三角波的proteus仿真原理图:
单片机源程序:
- /********************************************************************
- 51黑电子论坛
- *********************************************************************/
- #include<reg52.h> //库文件
- #define uchar unsigned char//宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
- /********************************************************************
- 初始定义
- *********************************************************************/
- sbit P3_2=P3^2;
- sbit P3_3=P3^3;
- unsigned char keycnt=0;
- unsigned char tcnt=0; //键值判断
- bit sjz=0; //产生三角波时用到的标志
- void delayl() //延时子程序
- {
- unsigned char i,j;
- for(i=20;i>0;i--)
- for(j=248;j>0;j--);
- }
- void KEY() //按键扫描程序
- {
- if(P3_2==0)
- {
- delayl(); //延时跳过按下时的抖动
- if(P3_2==0)
- {
- keycnt=0; //定时器产生锯齿波标志
- TR0=0; //暂时停止波形输出
- TH0=0x256-40; //对TH0 TL0 赋值
- TL0=0x256-40;
- TR0=1; //开始定时,产生锯齿波
- while(P3_2==0); //如果一直按着键,则等待松键开
- delayl(); //延时跳过松开后的抖动
- }
- }
- if(P3_3==0)
- {
- delayl(); //延时跳过按下时的抖动
- if(P3_3==0)
- {
- keycnt=1; //定时器产生三角波标志
- TR0=0; //暂时停止波形输出
- TH0=0x256-40; //对TH0 TL0 赋值
- TL0=0x256-40;
- TR0=1; //开始定时 产生三角波
- }
- while(P3_2==0); //如果一直按着键,则等待松键开
- delayl(); //延时跳过松开后的抖动
- }
- }
- void t0(void) interrupt 1 using 0 //定时中断服务函数
- {
- if(keycnt==0) //产生锯齿波
- {
- P0=tcnt;
- tcnt=+0x0a; //步进0.2V/一次中断
- if(tcnt==0xfb)
- tcnt=0;
- }
- if(keycnt==1) //产生三角波
- {
- if(sjz==0)
- {
- P0=tcnt;
- tcnt=+0x0a;//步进0.2V/一次中断
- if(tcnt==0xfa)
- sjz=1;
- }
- if(sjz==1)
- {
- P0=tcnt;
- tcnt=-0x0a;
- if(tcnt==0)
- sjz=0;
- }
- }
- }
- void main(void)
- {
- TMOD=0x02; //定时器工作在方式2
- ET0=1;
- EA=1;
- while(1)
- KEY();
- }
复制代码
仿真工程文件及所有完整程序等资料下载地址(压缩包一共有45个单片机仿真,全部下载后找到第013个项目即可):
http://www.51hei.com/bbs/dpj-56298-1.html
|