单片机控制一个分辨率很高但是精度不用很好的16位DAC输出电压
单片机源程序如下:
- #include <reg51.h> //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
- #include <stdio.h>
- #define uchar unsigned char //对数据类型进行声明定义
- #define uint unsigned int
- #define LCD1602_DB P0
- sbit LCD1602_RS = P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit LCD1602_RW = P1^1; //寄存器选择信号 H:读取寄存器 L:写入寄存器
- sbit LCD1602_E = P1^2; //片选信号 下降沿触发
- sbit LTC1655_DIN = P3^5; //数据
- sbit LTC1655_CLK = P3^6; //时钟
- sbit LTC1655_CS = P3^7; //使能片选信号
- sbit KEY1 = P1^6; //按键用于加
- sbit KEY2 = P1^7; //按键用于减
- uint OutPutValue =1000; //定义毫伏输出变量
- static void delay(unsigned char ms) //延时
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i< 115; i++);
- }
- }
- /* 向 LCD1602 液晶写入一字节命令,cmd-待写入命令值 */
- void LcdWriteCmd(unsigned char cmd)
- {
- LCD1602_RS = 0;
- LCD1602_RW = 0;
- LCD1602_DB = cmd;
- LCD1602_E = 1;
- delay(5);
- LCD1602_E = 0; //下降沿将数据写入LCD1602
- }
- /* 向 LCD1602 液晶写入一字节数据,dat-待写入数据值 */
- void LcdWriteDat(unsigned char dat)
- {
- LCD1602_RS = 1;
- LCD1602_RW = 0;
- LCD1602_DB = dat;
- LCD1602_E = 1;
- delay(5);
- LCD1602_E = 0; //下降沿将数据写入LCD1602
- }
- /* 设置显示 RAM 起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
- void LcdSetCursor(unsigned char x, unsigned char y)
- {
- unsigned char addr;
- if (y == 0) //由输入的屏幕坐标计算显示 RAM 的地址
- addr = 0x00 + x; //第一行字符地址从 0x00 起始
- else
- addr = 0x40 + x; //第二行字符地址从 0x40 起始
- LcdWriteCmd(addr | 0x80); //设置 RAM 地址
- }
- /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,
- str-字符串指针,len-需显示的字符长度 */
- void LcdShowStr(unsigned char x, unsigned char y,
- unsigned char *str, unsigned char len)
- {
- LcdSetCursor(x, y); //设置起始地址
- while (len--) //连续写入 len 个字符数据
- {
- LcdWriteDat(*str++); //先取 str 指向的数据,然后 str 自加 1
- }
- }
- /* 初始化 1602 液晶 */
- void InitLcd1602()
- {
- LcdWriteCmd(0x38); //16*2 显示,5*7 点阵,8 位数据接口
- LcdWriteCmd(0x0C); //显示器开,光标关闭
- LcdWriteCmd(0x06); //文字不动,地址自动+1
- LcdWriteCmd(0x01); //清屏
- }
- //LTC1655的驱动代码程序
- void LTC1655_Write(unsigned int LTC1655_out) {
- unsigned char bitctr = 16; //输出16位数据
- LTC1655_CS = 0; //使能拉低将数据写入LTC1655
- do
- { if(!(LTC1655_out & 0x8000)) // if b15 is a '0' bit
- LTC1655_DIN = 0; //输出数据0
- else
- LTC1655_DIN = 1; //输出数据1
- LTC1655_CLK = 0; //拉低为下个时钟数据作准备
- delay(5);
- LTC1655_CLK = 1; //输出时钟
- LTC1655_out <<= 1; //准备下一位数据
- } while(--bitctr);
- LTC1655_CS = 1;
- }
- void main(void)
- {
- InitLcd1602(); //初始化液晶
- LcdShowStr(0, 0, "Millivolt SigGen", 16); //毫伏信号发生器
- while (1)
- {
- if(KEY1==0) //按键加
- {
- delay(25);
- if(KEY1==0)
- {
- OutPutValue++;
- }
- }
- if(KEY2==0) //按键减
- {
- delay(25);
- if(KEY2==0)
- {
- OutPutValue--;
- }
- }
- LcdSetCursor(1, 1); //设置光标位置
- LcdWriteDat('0' + (OutPutValue / 10000)); //显示百位; //显示内容
- LcdWriteDat('0' + (OutPutValue / 1000% 10));
- LcdWriteDat('0' + (OutPutValue / 100 % 10));
- LcdWriteDat('.' );
- LcdWriteDat('0' + (OutPutValue / 10 % 10));
- LcdWriteDat('0' + (OutPutValue % 10));
- LTC1655_Write(OutPutValue); //输出16位数据
-
- }
- }
-
-
复制代码
|