DA输出模拟
来源:互联网 发布:腾讯网络手机游戏 编辑:程序博客网 时间:2024/05/16 15:43
/*----------------------------------------------- 名称:IIC协议 PCF8591 AD/DA转换 论坛:www.doflye.net 编写:shifang 修改:无 内容:使用DA输入,数码管显示输出数字量,LED显示模拟电压大小------------------------------------------------*/ #include <reg52.h> #include "i2c.h"#include "delay.h"#include "display.h"#define AddWr 0x90 //写数据地址 #define AddRd 0x91 //读数据地址sbit RS = P2^6; //定义端口 sbit RW = P2^5;sbit EN = P2^7;sbit spk = P1^5;sbit P1_1 = P1^1;sbit P1_2 = P1^2;sbit P1_3 = P1^3;sbit P1_4 = P1^4;sbit P1_6 = P1^6;sbit P1_7 = P1^7;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0unsigned char second;unsigned char minute;unsigned char hour;unsigned char flag;unsigned char sflag;unsigned char mflag,j = 5;unsigned char num;extern bit ack;bit WriteDAC(unsigned char dat);/*------------------------------------------------ 主程序------------------------------------------------*//*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/void DelayUs2x(unsigned char t){ while(--t);}/*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){ while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); }}/*------------------------------------------------ 判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); }/*------------------------------------------------ 写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { // while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; }/*------------------------------------------------ 写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { //while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; }/*------------------------------------------------ 清屏函数------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); }/*------------------------------------------------ 写入字符串函数------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else { LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } }/*------------------------------------------------ 写入字符函数------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); }/*------------------------------------------------ 初始化函数------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ }void ISR_time() interrupt 1{ unsigned char i; EA = 0; TMOD = 0x01; TH0 = 0x3c; TL0 = 0xb0; i++; if(i == 20) { i = 0; second++; //flag++; } EA = 1;}void time_add(){ if(second == 60) { second = 0; minute++; sflag = 1; } if(minute == 60) { minute = 0; hour++; mflag = 1; } if(hour == 24) { hour = 0; } if(sflag == 1 && mflag == 1) { while(1) { while(j--) { spk = !spk; DelayMs(1); } flag = 1; if(flag == 1) { sflag = 0; mflag = 0; flag = 0; break; } WriteDAC(num); num++;//连续累加,值从0-255反复循环,并显示在数码管上, TempData[0]=dofly_DuanMa[num/100]; TempData[1]=dofly_DuanMa[(num%100)/10]; TempData[2]=dofly_DuanMa[(num%100)%10]; DelayMs(100); } }}void keyscanf(void){ if(!P1_1) { DelayMs(2); if(!P1_1) { while(!P1_1); second++; if(second == 60) { second = 0; } } } if(!P1_2) { DelayMs(2); if(!P1_2) { while(!P1_2); minute++; if(minute == 60) { minute = 0; } } } if(!P1_3) { DelayMs(2); if(!P1_3) { while(!P1_3); hour++; if(hour == 24) { hour = 0; } } } if(!P1_4) { DelayMs(2); if(!P1_4) { while(!P1_4); EA = 0; ET0 = 0; } } if(!P1_6) { DelayMs(2); if(!P1_6) { while(!P1_6); EA = 1; ET0 = 1; TR0 = 1; } } if(!P1_7) { DelayMs(2); if(!P1_7) { while(!P1_7); P0 = 0x00; second = 0; } }}main(){// unsigned char num=0; Init_Timer0(); TMOD = 0x01;TR0 = 1;EA = 1;TH0 = 0x3c;TL0 = 0xb0;ET0 = 1;LCD_Init(); LCD_Clear();//清屏DelayMs(5); while (1) //主循环 { time_add(); keyscanf(); LCD_Write_Char(7,0,0x30 + second%10); LCD_Write_Char(6,0,0x30 + second/10); LCD_Write_Char(5,0,0x3a); LCD_Write_Char(4,0,'0' + minute%10); LCD_Write_Char(3,0,'0' + minute/10); LCD_Write_Char(2,0,0x3a); LCD_Write_Char(1,0,'0' + hour%10); LCD_Write_Char(0,0,'0' + hour/10); //WriteDAC(num);// num++;//连续累加,值从0-255反复循环,并显示在数码管上,// TempData[0]=dofly_DuanMa[num/100]; //TempData[1]=dofly_DuanMa[(num%100)/10]; //TempData[2]=dofly_DuanMa[(num%100)%10];// DelayMs(100); }}/*------------------------------------------------ 写入DA转换数值输入参数:dat 表示需要转换的DA数值,范围是0-255------------------------------------------------*/bit WriteDAC(unsigned char dat){ Start_I2c(); //启动总线 SendByte(AddWr); //发送器件地址 if(ack==0)return(0); SendByte(0x40); //发送器件子地址 if(ack==0)return(0); SendByte(dat); //发送数据 if(ack==0)return(0); Stop_I2c(); }
0 0
- DA输出模拟
- PCF8591 DA输出模拟
- DA输出模拟
- UVa 1589 da模拟!!
- AT89C52实现的DA输出
- AT89C52实现的DA输出
- da
- da
- DA
- da
- da
- da
- da
- da
- da
- Da
- DIY电流输出型DA转换器THS5651A功能板
- PWM作为DA输出,测试角度等变量
- 打印九九乘法表
- matlab读取grb、grb2数据并导出、绘图
- 安卓开发-动画
- 欢迎使用CSDN-markdown编辑器
- 王小川:工程师在人工智能时代会处于越来越重要的位置
- DA输出模拟
- 基于Linux安全验证添加自定义PAM模块
- 数据结构实验之二叉树六:哈夫曼编码
- JDBC高级操作
- ROS 使用自带和usb摄像头获取图像
- xml解析之SAX解析基本用法
- MySQL必知必会-7用通配符进行过滤
- 前端培训班出身——吐槽下16年的艰辛
- POJ 3511 Fermat's Christmas Theorem 可能会