久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
正弦波逆變器 51單片機實例之38用PCF8591T實現DA功能(正弦波)驅動場館
[打印本頁]
作者:
721231
時間:
2017-7-20 10:27
標題:
正弦波逆變器 51單片機實例之38用PCF8591T實現DA功能(正弦波)驅動場館
/********************************************************************
* 文件名 : PCF8591T做DA實驗.c
* 描述 : 我們單片機去控制PCF8591T去實現DA功能。
這個代碼也要在示波器上才能觀測到,DA輸出一個正弦波。
* 可以用示波器測到正弦波
***********************************************************************/
#include<reg52.h>
#include <I2C.H>
#define PCF8591 0x90 //PCF8591 地址
// 此表為 LED 的字模 // 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)
unsigned
char
Disp_Tab[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 };
unsigned
char
AD_CHANNEL;
unsigned
long
xdata LedOut[8];
unsigned
int
idata D[32];
// 128點正弦波樣本表
unsigned
char
code auc_SinParam[128] = {
64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,
123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,
117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,
45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,
7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60};
/*******************************************************************
DAC 變換, 轉化函數
*******************************************************************/
bit DACconversion(unsigned
char
sla,unsigned
char
c, unsigned
char
Val)
{
Start_I2c(); //啟動總線
SendByte(sla); //發送器件地址
if(ack==0)return(0);
SendByte(c); //發送控制字節
if(ack==0)return(0);
SendByte(Val); //發送DAC的數值
if(ack==0)return(0);
Stop_I2c(); //結束總線
return(1);
}
/*******************************************************************
ADC發送字節[命令]數據函數
*******************************************************************/
bit ISendByte(unsigned
char
sla,unsigned
char
c)
{
Start_I2c(); //啟動總線
SendByte(sla); //發送器件地址
if(ack==0)return(0);
SendByte(c); //發送數據
if(ack==0)return(0);
Stop_I2c(); //結束總線
return(1);
}
/*******************************************************************
ADC讀字節數據函數
*******************************************************************/
unsigned
char
IRcvByte(unsigned
char
sla)
{ unsigned
char
c;
Start_I2c(); //啟動總線
SendByte(sla+1); //發送器件地址
if(ack==0)return(0);
c=RcvByte(); //讀取數據0
Ack_I2c(1); //發送非就答位
Stop_I2c(); //結束總線
return(c);
}
/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數)
* 輸出 : 無
***********************************************************************/
void Delay_1ms(unsigned
char
i)//1ms延時
{
unsigned
char
x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
//******************************************************************/
main()
{
unsigned
char
i=0;
while(1)
{/********以下AD-DA處理*************/
switch(AD_CHANNEL)
{
case 0: ISendByte(PCF8591,0x41);
D[0]=IRcvByte(PCF8591)*2; //ADC0 模數轉換1
break;
case 1: ISendByte(PCF8591,0x42);
D[1]=IRcvByte(PCF8591)*2; //ADC1 模數轉換2
break;
case 2: ISendByte(PCF8591,0x43);
D[2]=IRcvByte(PCF8591)*2; //ADC2 模數轉換3
break;
case 3: ISendByte(PCF8591,0x40);
D[3]=IRcvByte(PCF8591)*2; //ADC3 模數轉換4
break;
case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC 數模轉換
break;
}
if(++AD_CHANNEL>4) AD_CHANNEL=0;
/********以下將AD的值送到LED數碼管顯示*************/
D[4] = auc_SinParam[i++]*2;
Delay_1ms(5);
if(i==128) i=0;
}
}
view plain
copy to clipboard
print
?
/*************************此部分為I2C總線的驅動程序*************************************/
#include<reg52.h>
#include <intrins.h>
#include <I2C.H>
#define NOP() _nop_() /* 定義空指令 */
#define _Nop() _nop_() /*定義空指令*/
sbit SCL=P1^5; //I2C 時鐘
sbit SDA=P3^6; //I2C 數據
bit ack; /*應答標志位*/
/*******************************************************************
起動總線函數
函數原型: void Start_I2c();
功能: 啟動I2C總線,即發送I2C起始條件.
********************************************************************/
void Start_I2c()
{
SDA=1; /*發送起始條件的數據信號*/
_Nop();
SCL=1;
_Nop(); /*起始條件建立時間大于4.7us,延時*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*發送起始信號*/
_Nop(); /* 起始條件鎖定時間大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*鉗住I2C總線,準備發送或接收數據 */
_Nop();
_Nop();
}
/*******************************************************************
結束總線函數
函數原型: void Stop_I2c();
功能: 結束I2C總線,即發送I2C結束條件.
********************************************************************/
void Stop_I2c()
{
SDA=0; /*發送結束條件的數據信號*/
_Nop(); /*發送結束條件的時鐘信號*/
SCL=1; /*結束條件建立時間大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*發送I2C總線結束信號*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字節數據發送函數
函數原型: void SendByte(UCHAR c);
功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
此狀態位進行操作.(不應答或非應答都使ack=0)
發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
********************************************************************/
void SendByte(unsigned
char
c)
{
unsigned
char
BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
{
if((c<<BitCnt)&0x80)SDA=1; /*判斷發送位*/
else SDA=0;
_Nop();
SCL=1; /*置時鐘線為高,通知被控器開始接收數據位*/
_Nop();
_Nop(); /*保證時鐘高電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; /*8位發送完后釋放數據線,準備接收應答位*/
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; /*判斷是否接收到應答信號*/
SCL=0;
_Nop();
_Nop();
}
/*******************************************************************
字節數據接收函數
函數原型: UCHAR RcvByte();
功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
發完后請用應答函數應答從機。
********************************************************************/
unsigned
char
RcvByte()
{
unsigned
char
retc;
unsigned
char
BitCnt;
retc=0;
SDA=1; /*置數據線為輸入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; /*置時鐘線為低,準備接收數據位*/
_Nop();
_Nop(); /*時鐘低電平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
SCL=1; /*置時鐘線為高使數據線上數據有效*/
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*讀數據位,接收的數據位放入retc中 */
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
/********************************************************************
應答子函數
函數原型: void Ack_I2c(bit a);
功能: 主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
********************************************************************/
void Ack_I2c(bit a)
{
if(a==0)SDA=0; /*在此發出應答或非應答信號 */
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); /*時鐘低電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0; /*清時鐘線,鉗住I2C總線以便繼續接收*/
_Nop();
_Nop();
}
view plain
copy to clipboard
print
?
extern bit ack;
//起動總線函數
extern void Start_I2c();
//結束總線函數
extern void Stop_I2c();
//應答子函數
extern void Ack_I2c(bit a);
//字節數據發送函數
extern void SendByte(unsigned
char
c);
//有子地址發送多字節數據函數
extern bit ISendStr(unsigned
char
sla,unsigned
char
suba,unsigned
char
*s,unsigned
char
no) ;
//無子地址發送多字節數據函數
extern bit ISendStrExt(unsigned
char
sla,unsigned
char
*s,unsigned
char
no);
//無子地址讀字節數據函數
extern unsigned
char
RcvByte();
extern void HC595SendData(unsigned
int
SendVal);
view plain
copy to clipboard
print
?
/*************************此部分為74HC595的驅動程序使用SPI總線連接*************************************/
#include<reg52.h>
#include <intrins.h>
#define NOP() _nop_() /* 定義空指令 */
#define _Nop() _nop_() /*定義空指令*/
//SPI IO
sbit MOSIO =P1^5;
sbit R_CLK =P1^6;
sbit S_CLK =P1^7;
sbit OE =P3^6;
void HC595SendData(unsigned
int
SendVal);
/*********************************************************************************************************
** 函數名稱: HC595SendData
** 功能描述: 向SPI總線發送數據
** 管腳描述:請參考相關的芯片資料(學習光盤中以配)
*********************************************************************************************************/
void HC595SendData(unsigned
int
SendVal)
{
unsigned
char
i;
for(i=0;i<16;i++)
{
if((SendVal<<i)&0x8000) MOSIO=1; // set dataline high
else MOSIO=0;
S_CLK=0;
NOP();
NOP();
S_CLK=1;
}
R_CLK=0; //set dataline low
NOP();
NOP();
R_CLK=1; //片選
OE=0;
}
作者:
lanxichang
時間:
2018-6-17 22:24
可以分享一下原理圖嗎?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
色妹子综合网
|
亚洲国产精久久久久久久
|
日韩三级在线观看
|
欧美日韩精品中文字幕
|
亚洲精品一区二区三区蜜桃久
|
国产欧美一区二区三区日本久久久
|
国产欧美一区二区久久性色99
|
在线观看日韩精品视频
|
91精品观看
|
国产日韩欧美一区二区
|
欧美成人免费在线视频
|
中文字幕乱码一区二区三区
|
aaa在线
|
一级片在线观看
|
日本在线免费看最新的电影
|
最新国产精品精品视频
|
三级免费
|
天堂成人av
|
国产精品久久久久av
|
一区二区福利视频
|
91精品国产一区二区三区
|
www日本在线播放
|
成人亚洲精品
|
欧美日韩一区二区在线观看
|
亚洲精品99999
|
国产99久久精品一区二区永久免费
|
国产精彩视频一区
|
四虎影院欧美
|
精品国产第一区二区三区
|
在线欧美一区二区
|
黄色a视频
|
免费一级黄色
|
网站国产
|
国产黄色精品在线观看
|
超碰在线97国产
|
综合成人在线
|
欧美一级在线观看
|
99精品国产一区二区三区
|
99久久免费精品国产男女高不卡
|
欧美日韩黄色一级片
|
欧美日韩一本
|