1. 單片機程序詳細講解
如此詳細的注釋,你還要怎麼「詳解」,個人覺得你還是應該多看看單片機原理書籍。
2. 求助:關於89C52單片機定時器中斷產生PWM的問題。
TH1,TL1開始沒有賦初值,所以第一次就需要65毫秒才能進入中斷,而且你的中斷服務程序特別是定時器的中斷服務程序處理東東太多,看開始還加上了延時,你想想定時器最大溢出時間才六十多毫秒,顯然是無法完成這個艱巨任務的。
3. avr單片機之延時問題
/*******************************************
文件:MEGA16_AD.C
環境:編譯為ICC AVR6.25A,模擬為AVR Studio4.10
硬體:ATMEGA16晶元
日期:2006年12月10日
功能:驅動MEGA16片上自帶的AD轉換器
備註:參考《AVR系列單片機C語言編程與應用實例》(清華大學出版社)
/******************************************/
#include <iom16v.h> //包含型號頭文件
#include <macros.h> //包含"位"操作頭文件
#include <stdio.h> //標准輸入輸出頭文件
#include <AVR_PQ1A.h> //包含自定義常量頭文件
#include "SMG.C" //包含數碼管顯示函數
/*******************************************
函數名稱: Mega16_ad
功 能: 對指定的通道進行模數轉換
參 數: chl--指定的通道(本開發板只用了通道0)
返回值 : addata--10位數據輸出
/********************************************/
uint Mega16_ad(uchar chl)
{
uint addata;
DDRA&=~(BIT(PA0)|BIT(PA1)); //轉換口設置為輸入、無上拉
PORTA&=~(BIT(PA0)|BIT(PA1));
ADMUX=0; //採用外部參考電壓,輸出數據右對齊
ADMUX|=chl; //設置指定的通道
ADCSR=0x80; //採用單次轉換,查詢模式,2分頻
ADCSR|=BIT(ADSC); //啟動轉換
while(!(ADCSR&(BIT(ADIF)))); //等待轉換結束
addata=ADCL; //讀取低8位數據
addata+=ADCH*256; //讀取高8位數據
return addata;
}
/*******************************************
函數名稱: Num_BCD
功 能: 將一個位元組的整數轉換成三位BCD碼
參 數: num--需要轉換的整數
返回值 : chr--三位BCD碼數組指針
/********************************************/
uchar* Num_BCD(uchar num)
{
uchar i,chr[3];
uchar *rept;
rept=&(chr[0]); //返回指針指向BCD碼數組
for(i=0;i<3;i++)
{
chr[2-i]=num%10; //對10取余數(其實是求模,但是對於正數,取余與求模是相等的)
num/=10; //除以10,為取出下一位做准備
}
return rept; //返回指針
}
/*******************************************
函數名稱: main
功 能: 驅動MEGA16的AD,並在數碼管上顯示採集值
參 數: 無
返回值 : 無
/********************************************/
void main(void)
{
uchar *adpt; //定義一個接受返回指針的指針變數
uchar i,ad0[3];
Board_init( ); //初始化開發板
while(1)
{
adpt=Num_BCD(Mega16_ad(0)/4); //啟動AD轉換通道0,同時將數值轉換成BCD碼
for(i=0;i<3;i++) //將轉換後的BCD碼存入顯示數組
{
ad0[i]=*(adpt+i);
}
for(i=0;i<3;i++) //顯示轉換的數值
{
One_smg_display(ad0[i],i+1);
Delayms(2);
}
}
}
4. 單片機簡單的AD轉換程序問題
玩了8年的程序,竟然看不懂這一小段,俺也是丟人丟大了。
不過話說,能把 C語言的 可讀性 侮辱成這樣,也算是 程序猿中的 奇葩了!
5. 單片機pcf8591 ad轉換輸出四個通道,可是,我寫的時候他並不是按1,2,3,4顯示的,而是4,1,2,3顯示,為什麼
也可能是你啟動通道一時,它剛剛結束了通道四的轉換。
把啟動順序改為:2341,即可。
6. 利用STC89C52單片機以及PCF8591的AD轉換設計一個數字電壓表,求大神給個程序例子,在線等!!!急!!!
這是吳鑒鷹單片機開發板配套的常式。
/*-----------------------------------------------
名稱:IIC協議PCF8591AD/DA轉換
內容:使用4路AD中的4路檢測外部模擬量輸入使用液晶顯示
------------------------------------------------*/
#include<reg52.h>
#include"i2c.h"
#include"delay.h"
#include"1602.h"
#include<stdio.h>
#defineAddWr0x90//寫數據地址
#defineAddRd0x91//讀數據地址
externbitack;
unsignedcharReadADC(unsignedcharChl);
bitWriteDAC(unsignedchardat);
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
unsignedcharnum=0,i;
unsignedchartemp[7];//定義顯示區域臨時存儲數組
floatVoltage;//定義浮點變數
LCD_Init();//初始化液晶
DelayMs(20);//延時有助於穩定
LCD_Clear();//清屏
while(1)//主循環
{
for(i=0;i<5;i++)//連續讀5次,取最後一次,以便讀取穩定值
num=ReadADC(0);//讀取第1路電壓值,范圍是0-255
Voltage=(float)num*5/256;//根據參考電源VREF算出時間電壓,float是強制轉換符號,用於將結果轉換成浮點型
sprintf(temp,"V0%3.2f",Voltage);//格式輸出電壓值,%3.2f表示浮點輸出,共3位數,小數點後2位
LCD_Write_String(0,0,temp);
for(i=0;i<5;i++)
num=ReadADC(1);
Voltage=(float)num*5/256;
sprintf(temp,"V1%3.2f",Voltage);
LCD_Write_String(8,0,temp);
for(i=0;i<5;i++)
num=ReadADC(2);
Voltage=(float)num*5/256;
sprintf(temp,"V2%3.2f",Voltage);
LCD_Write_String(0,1,temp);
for(i=0;i<5;i++)
num=ReadADC(3);
Voltage=(float)num*5/256;
sprintf(temp,"V3%3.2f",Voltage);
LCD_Write_String(8,1,temp);
//主循環中添加其他需要一直工作的程序
DelayMs(200);
}
}
/*------------------------------------------------
讀AD轉值程序
輸入參數Chl表示需要轉換的通道,范圍從0-3
返回值范圍0-255
操作分四步:
(1)、發送地址位元組,選擇該器件。
(2)、發送控制位元組,選擇相應通道。
(3)、重新發送地址位元組,選擇該器件的讀寫。
(4)、接收目標通道的數據。
------------------------------------------------*/
unsignedcharReadADC(unsignedcharChl)
{
unsignedcharVal;
Start_I2c();//啟動匯流排
SendByte(AddWr);//發送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl);//發送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);//10010001是讀命令
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c();//發送非應位
Stop_I2c();//結束匯流排
return(Val);
}