本文目錄一覽:
- 1、C語言程序設計, char s[]=「adc\0def」 strlen(s)=? sizeo
- 2、51單片機 C語言ADC程序怎麼寫
- 3、51單片機c語言,ADC模數轉換的問題
- 4、AVR單片機ADC控制LED程序(C語言)
- 5、C語言實現ADC採樣問題
C語言程序設計, char s[]=「adc\0def」 strlen(s)=? sizeo
s[]=”abc\0def”,因為是字元串,所以實際存儲為’a’,’b’,’c’,’\0′,’d’,’e’,’f’,’\0′
一共是8個字元,sizeof(s)是統計s的位元組數,而一個字元佔一個位元組,所以sizeof(s)的結果是8,strlen(s)是統計s的長度,以’\0’字元為結束,所以是3
51單片機 C語言ADC程序怎麼寫
typedef unsigned char BYTE;
typedef unsigned int WORD;
#include “reg51.h”
#include “intrins.h”
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_LOW2 = 0xBE;
sfr P1ASF = 0x9D;
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
//延時
void Delay(WORD n)
{
WORD x;
while (n–)
{
x = 5000;
while (x–);
}
}
//初始AD寄存器
void InitADC()
{
P1ASF = 0xff;
ADC_RES = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2);
}
//AD轉換
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR ADC_FLAG));
ADC_CONTR = ~ADC_FLAG;
return ADC_RES;
}
void main()
{ BYTE temp;
P2M1=0; P2M0=0x03; //P2.0和P2.1強推挽
InitADC();
while (1)
{
temp=GetADCResult(0);//轉換P1.0
if(temp1)
P2|=0x03; //P1.0有電壓 P2.0和P2.1輸出高
else
P2=0xFC; //P1.0無電壓 P2.0和P2.1輸出低
}
}
51單片機c語言,ADC模數轉換的問題
對於這個,要這麼看:
假設中斷A是優先順序高的中斷,中斷B是優先順序低的中斷
如果在正常執行的過程中,發生中斷A,那麼,中斷A執行完成後,會返回正常程序;
如果在正常執行過程中,發生中斷B,又在中斷B處理過程中發生中斷A,那麼,中斷A執行完成後,一定要返回的是中斷B,這是由硬體決定的,不是軟體決定的,所以,軟體沒有任何指令可以讓中斷A執行完成後直接跳過還沒有執行完的中斷B而直接回到主程序,因為這是硬體決定的,軟體做不到,即便你在高級中斷A中關閉了中斷B,但是因為你原來的中斷B還沒有執行完,所以,仍然要把沒執行完的部分執行下去,才能返回到正常程序.
對於ARM系列的可以,對於51來說,是不行的,因為51軟體指令不允許修改PC寄存器的值
AVR單片機ADC控制LED程序(C語言)
給你寫一個吧,反正很簡單一個程序,用mega8實現,單片機型號你可以改,只要改掉中斷向量號就行:
#include iom8v.h
#include macros.h
#define LED1_ON PORTB|= BIT(1)
#define LED1_OFF PORTB=~BIT(1)
//一下你可以再寫七個燈或者更多
#define uchar unsigned char
#define uint unsigned int
uint adc_count = 0 ; //控制AD轉換速度計數
uint a_time = 0 ; //用於AD數字濾波計數
uchar mode = 0 ; //用於AD處理結果賦值
void port_init(void)
{
DDRB = 0xff;
PORTB = 0x00;
DDRC = 0x00;
PORTC = 0xff;
DDRD = 0xf0;
PORTD = 0x00;
}
// 定時器分頻: 64
// 設定定時值: 1ms
// 真實定時值: 1ms (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x83; //set count
TIMSK |= 0x01;
TCCR0 = 0x03; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0x83; //reload counter value
adc_count++;
if(adc_count==50) //用於控制AD轉換速度
{
adc_count=0;
ADCSRA = 0xCF;
}
else
{
ADCSRA = 0x00;
}
}
void adc_init(void)
{
ADCSRA = 0x00; //禁止AD轉換
ADMUX = 0x07;
SFIOR |= 0x00;
ACSR = 0x80; //禁止模擬比較器
ADCSRA = 0xCF;
//ADCSRA = 0xED;
}
unsigned int adc_calc(void)
{
//計算實際電壓
unsigned long value=0;
unsigned int voltage=0; //電壓單位為(mV)
value=ADCL; //首先讀低位
value|=(int)ADCH 8; //然後讀高位
voltage=(value*5000)/1023;
ad_flag=1;
return voltage;
}
//採用AD取平均值的方式
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
//轉換完成後中斷處理
unsigned int voltage1;
a_time++;
if(a_time8)
{voltage1=adc_calc();voltage2=voltage2+voltage1;}//數字濾波
while(a_time==8)
{
a_time=0;voltage=voltage2/8;voltage2=0;
if((voltage)1130){dianliang=0;}
if((voltage=1130)(voltage1300)){mode=1;}
if((voltage=1300)(voltage1560)){mode=2;}
if((voltage=1560)(voltage1750)){mode=3;}
if((voltage=1750)(voltage1950)){mode=4;}
if((voltage=1950)(voltage2150)){mode=5;}
if((voltage=2150)(voltage2341)){mode=6;}
if((voltage=2341)(voltage2560)){mode=7;}
if((voltage=2560)(voltage2710)){mode=8;}
if((voltage=2710)(voltage2870)){mode=9;}
}
else{mode=0;}
}
void LED_DISP(void) //用於控制LED顯示
{
switch(mode)
{
case 0: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 1: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 2: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 3: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 4: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 5: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 6: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 7: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 8: /*此處寫上你要控制的燈的亮或滅*/ ;break;
case 9: /*此處寫上你要控制的燈的亮或滅*/ ;break;
default: break;
}
}void init_devices(void)
{
CLI(); //禁止所有中斷
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
timer0_init();
port_init();
adc_init();
//SEI();//開全局中斷
}
void main(void)
{
init_devices();
while(1)
{
LED_DISP();
}
}
C語言實現ADC採樣問題
我的理解是這樣的:
我不知道ADC_TEMP 是否已經被初始化為零了。如果是,思路就是這樣 0000 0000 0000 0000 0000 0000 這是ADC_temp,AD_DATA 應該就是採樣的 每一位 的數 比如採樣你說的 101101,其實應該把前面的0補齊,也就是0000 0000 0000 0000 0010 1101 。然後經過for循環,從第一位開始取,當遇到1的時候,執行ADC_temp|= 1; 我們知道或運算的規則,1和什麼都是1。所以就從第一位0開始取,直到取完最後一位,每取一位左移一位,再和輸出的AD_DATA 或運算。前提是,這個AD_DATA是高位輸出。
原創文章,作者:OJCL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/137645.html