|
單片機(jī)控制一個(gè)分辨率很高但是精度不用很好的16位DAC輸出電壓
1.jpg (258.89 KB, 下載次數(shù): 18)
下載附件
2023-3-13 23:52 上傳
2.jpg (258.13 KB, 下載次數(shù): 19)
下載附件
2023-3-13 23:52 上傳
單片機(jī)源程序如下:
- #include <reg51.h> //包含此頭文件后,里面聲明的寄存器不需要再手動(dòng)輸入,避免重復(fù)定義
- #include <stdio.h>
- #define uchar unsigned char //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- #define uint unsigned int
- #define LCD1602_DB P0
- sbit LCD1602_RS = P1^0; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit LCD1602_RW = P1^1; //寄存器選擇信號(hào) H:讀取寄存器 L:寫(xiě)入寄存器
- sbit LCD1602_E = P1^2; //片選信號(hào) 下降沿觸發(fā)
- sbit LTC1655_DIN = P3^5; //數(shù)據(jù)
- sbit LTC1655_CLK = P3^6; //時(shí)鐘
- sbit LTC1655_CS = P3^7; //使能片選信號(hào)
- sbit KEY1 = P1^6; //按鍵用于加
- sbit KEY2 = P1^7; //按鍵用于減
- uint OutPutValue =1000; //定義毫伏輸出變量
- static void delay(unsigned char ms) //延時(shí)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i< 115; i++);
- }
- }
- /* 向 LCD1602 液晶寫(xiě)入一字節(jié)命令,cmd-待寫(xiě)入命令值 */
- void LcdWriteCmd(unsigned char cmd)
- {
- LCD1602_RS = 0;
- LCD1602_RW = 0;
- LCD1602_DB = cmd;
- LCD1602_E = 1;
- delay(5);
- LCD1602_E = 0; //下降沿將數(shù)據(jù)寫(xiě)入LCD1602
- }
- /* 向 LCD1602 液晶寫(xiě)入一字節(jié)數(shù)據(jù),dat-待寫(xiě)入數(shù)據(jù)值 */
- void LcdWriteDat(unsigned char dat)
- {
- LCD1602_RS = 1;
- LCD1602_RW = 0;
- LCD1602_DB = dat;
- LCD1602_E = 1;
- delay(5);
- LCD1602_E = 0; //下降沿將數(shù)據(jù)寫(xiě)入LCD1602
- }
- /* 設(shè)置顯示 RAM 起始地址,亦即光標(biāo)位置,(x,y)-對(duì)應(yīng)屏幕上的字符坐標(biāo) */
- void LcdSetCursor(unsigned char x, unsigned char y)
- {
- unsigned char addr;
- if (y == 0) //由輸入的屏幕坐標(biāo)計(jì)算顯示 RAM 的地址
- addr = 0x00 + x; //第一行字符地址從 0x00 起始
- else
- addr = 0x40 + x; //第二行字符地址從 0x40 起始
- LcdWriteCmd(addr | 0x80); //設(shè)置 RAM 地址
- }
- /* 在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),
- str-字符串指針,len-需顯示的字符長(zhǎng)度 */
- void LcdShowStr(unsigned char x, unsigned char y,
- unsigned char *str, unsigned char len)
- {
- LcdSetCursor(x, y); //設(shè)置起始地址
- while (len--) //連續(xù)寫(xiě)入 len 個(gè)字符數(shù)據(jù)
- {
- LcdWriteDat(*str++); //先取 str 指向的數(shù)據(jù),然后 str 自加 1
- }
- }
- /* 初始化 1602 液晶 */
- void InitLcd1602()
- {
- LcdWriteCmd(0x38); //16*2 顯示,5*7 點(diǎn)陣,8 位數(shù)據(jù)接口
- LcdWriteCmd(0x0C); //顯示器開(kāi),光標(biāo)關(guān)閉
- LcdWriteCmd(0x06); //文字不動(dòng),地址自動(dòng)+1
- LcdWriteCmd(0x01); //清屏
- }
- //LTC1655的驅(qū)動(dòng)代碼程序
- void LTC1655_Write(unsigned int LTC1655_out) {
- unsigned char bitctr = 16; //輸出16位數(shù)據(jù)
- LTC1655_CS = 0; //使能拉低將數(shù)據(jù)寫(xiě)入LTC1655
- do
- { if(!(LTC1655_out & 0x8000)) // if b15 is a '0' bit
- LTC1655_DIN = 0; //輸出數(shù)據(jù)0
- else
- LTC1655_DIN = 1; //輸出數(shù)據(jù)1
- LTC1655_CLK = 0; //拉低為下個(gè)時(shí)鐘數(shù)據(jù)作準(zhǔn)備
- delay(5);
- LTC1655_CLK = 1; //輸出時(shí)鐘
- LTC1655_out <<= 1; //準(zhǔn)備下一位數(shù)據(jù)
- } while(--bitctr);
- LTC1655_CS = 1;
- }
- void main(void)
- {
- InitLcd1602(); //初始化液晶
- LcdShowStr(0, 0, "Millivolt SigGen", 16); //毫伏信號(hào)發(fā)生器
- while (1)
- {
- if(KEY1==0) //按鍵加
- {
- delay(25);
- if(KEY1==0)
- {
- OutPutValue++;
- }
- }
- if(KEY2==0) //按鍵減
- {
- delay(25);
- if(KEY2==0)
- {
- OutPutValue--;
- }
- }
- LcdSetCursor(1, 1); //設(shè)置光標(biāo)位置
- LcdWriteDat('0' + (OutPutValue / 10000)); //顯示百位; //顯示內(nèi)容
- LcdWriteDat('0' + (OutPutValue / 1000% 10));
- LcdWriteDat('0' + (OutPutValue / 100 % 10));
- LcdWriteDat('.' );
- LcdWriteDat('0' + (OutPutValue / 10 % 10));
- LcdWriteDat('0' + (OutPutValue % 10));
- LTC1655_Write(OutPutValue); //輸出16位數(shù)據(jù)
-
- }
- }
-
-
復(fù)制代碼
|
|