導航:首頁 > 操作系統 > 求單片機常式

求單片機常式

發布時間:2022-08-31 06:51:37

① 求一個簡單的單片機時鍾程序

#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
unsignedcharsec=0,min=0,hour=0,scanled;
unsignedcharkey,time;
unsignedchardisdat[6];
sbitK=P1^0;
voiddischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
voidt0isr()interrupt1 //秒計時
{
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
time++;
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
dischg();
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]]&0x7f;
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]]&0x7f;
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
EA=1;
TR1=1;
ET0=1;
ET1=1;
sec=0;
min=0;
hour=0;
scanled=0;
time=0;
key=0;
dischg();
while(1)
{
if(K==0)
{
while(K==0);
key++;
key%=2;
}
switch(key)
{
case0:
TR0=1;
break;
case1:
TR0=0;
break;
}
}
}

② 求51單片機控制無刷直流電機的常式,新人求助

#include <reg52.h> // 引用標准庫的頭文件
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
//=================電機驅動=====================
sbit dianji_r = P1^0; //右邊電機控制口,低電平轉?
sbit dianji_l = P1^3; //左邊電機控制口,低電平轉
//=============循跡感應介面======================
sbit xjmk_r = P3^2;// 右邊hall模塊檢測口 INT0
sbit xjmk_l = P3^3;// 左邊hall模塊檢測口 INT1

void check_righet();//右邊時候檢測到stop測試程序
void check_left();//左邊時候檢測到stop測試程序

void delay_50us(uint t);
void delayms(uint Ms);

uchar r_count;//右邊感測器檢測到的次數計數單元
uchar l_count;
uint time;
//***********************主程序******************************
main()
{
time=50; dianji_r=0;//上電時右側電機運行
dianji_l=0;//上電時左側電機運行 EA=1;
EX1=1;
EX0=1;
IT1=0;
IT0=0;

xjmk_r=1;//置IO為1,准備讀取數據
xjmk_l=1;
_nop_();
r_count=0;
l_count=0;
while(1)
{
_nop_();
// check_righet();//調用右邊hall檢測感測器
// check_left();//
if(r_count>=1)
{

delayms(time);
dianji_r=0;
dianji_l=0;
r_count=0;
_nop_();
}
if(l_count>=1)
{

delayms(time);
dianji_r=0;
dianji_l=0;
l_count=0;
_nop_();
}

}

}
void init0int() interrupt 2
{
l_count=5;
dianji_l=1;
dianji_r=0;
if(r_count>0)
{ EX0=0;
delayms(20);
if(time>=20)time-=19;
EX0=0;
}
return;

}

void init1int() interrupt 0
{
r_count=5;
dianji_r=1; dianji_l=0;
if(l_count>0)
{ EX1=0;
delayms(20);
if(time>=20)time-=19;
EX1=1;}
return; } //*******************************************************************************
//函數名稱:
//功能:左邊邊時候檢測到stop測試程序
void check_left()
{
if(xjmk_l==0)//檢測右邊的感測器是否感應到stop
{ delay_50us(1);//延時,去除機械振動
_nop_(); if(xjmk_l==0)//再次檢測
{ delay_50us(1);//延時,去除機械振動
if(xjmk_l==0) {
l_count++;
xjmk_l=1; }
}
}
} //******************************************************************************* //函數名稱:
//功能:右邊時候檢測到stop測試程序
void check_righet()
{
if(xjmk_r==0)//檢測右邊的感測器是否感應到stop {
delay_50us(1);//延時,去除機械振動
if(xjmk_r==0)//再次檢測
{
delay_50us(1);//延時,去除機械振動 if(xjmk_r==0)
{
r_count++;
xjmk_r=1;
}
}
}
//*******************************************************************************
//函數名稱:void delay_50US(unsigned int t)
//功能:延時50*t(us)
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
{
for(j=19;j>0;j--);
}
}
/*====================================================================
設定延時時間:x*1ms ====================================================================*/
void delayms(uint Ms)
{
uint i,TempCyc;
for(i=0;i<Ms;i++)
{
TempCyc =70;
while(TempCyc--);
}
}

③ 求52單片機程序代碼

程序代碼如下:
#include<reg51.h>
sbitK1=P1^0;
sbitK2=P1^1;
voiddelay(inta)
{
inti;
while(a--)for(i=0;i<120;i++);
}
main()
{
unsignedcharkeyval=0,led=0xfe;
while(1)
{
if(K1==0)
{
delay(10);
if(K1==0)
{
keyval==1;
while(K1==0);
}
}
if(K2==0)
{
delay(10);
if(K2==0)
{
keyval==2;
while(K2==0);
}
}
if(keyval==1)P0=0xfe;
if(keyval==2)
{
P0=led;
led=_crol_(led,1);
delay(200);
}
}
}

④ 求單片機程序

#include <reg51.h>
unsigned char count;
sbit key=P3^0;
void main(void)

{
while(1)
{
if(key==0)
{
while(key==0);

count++;
if(count==5)
{
count=0;
}
}
if(count==1) P1=0xfe;
if(count==2) P1=0xfd;
if(count==3) P1=0xfb;
if(count==4) P1=0xf7;
}
}
}

⑤ 求51單片機程序

這是51單片機頻率計程序,弄明白了寫你的程序就 很簡單了
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
//定義以I/O口的功能
sbit beiguang=P3^2;//液晶屏背光
sbit rs=P1^3;//液晶屏寫選擇,0命令 1數據
sbit rw=P1^4;//液晶屏讀寫選擇
sbit lcden=P1^5;//液晶屏使能
#define db P2 //定義P2為數據輸出口,寫數據時用db代替P2,增加液晶屏程序的通用性

//更改硬體接線時,只更改此處,而不必去更改液晶屏讀寫子程序
uchar aa,bb,cc;
uint dd,ee;
void Delay1ms(unsigned int i) //1ms延時程序
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化設置
{
TMOD=0x15;//定時器0作為計數器,定時器1作為定時器用
TH0=0;//計數器清0
TL0=0;
EA=1;//開總中斷
ET1=1;//允許定時器1中斷
TH1=0x4c;
TL1=0x5c;
TR0=1;//啟動計數器
TR1=1;//啟動定時器
aa=0;
}
void write_com(uchar com)//向液晶屏寫命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void write_date(uchar date)//向液晶屏寫數據
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void init2()//液晶屏初始化
{
beiguang=0;
rw=0;
write_com(0x38);//顯示模式16字*2行,5*7點陣,數據口8位
Delay1ms(10*12);
write_com(0x0f);//開顯示,顯示游標,游標閃爍
Delay1ms(10*12);
write_com(0x06);//寫完數據後數據指針和游標位置自動加1
Delay1ms(10*12);
write_com(0x01);//屏幕清除
Delay1ms(10*12);
}
void display4(unsigned int number) //單行多位顯示程序
{
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分離出十萬,萬,千,百,十,個
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;

write_com(0x80);//第1個數據的位置設定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//寫數據
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);

write_com(0x87);//第6個數據'H'的位置,中間空85和86 二格
write_date('H');
Delay1ms(10);
write_date('z');
Delay1ms(10);
}
void main()//主程序很簡單
{
init();//初始化
while(1)//循環程序
{
dd=bb*256+cc;//0.5S的計數值
ee=2*dd;//換算為1秒鍾的計數值
if(aa==1)
{
if(TH0>12)//預判斷,50ms內TH0>12,1s內計數值將超過可計數的最大值65535
fm=1;//報警
}
display4(ee);//顯示
fm=0;//報警停止
}
}
void timer1()interrupt 3//注意:定時器1的中斷序號為3
{
aa++;
TH1=0x4c;//11.0592Mhz
//TL1=0;//11.0592Mhz
TL1=0x5c;//實際電路振盪頻率11.03705Mhz,對TL1修正
if(aa==10)//中斷10次,共0.5S
{
TR0=0;//暫停計數
aa=0;
bb=TH0;//讀出計數器數據
cc=TL0;
TL0=0;//計數器清0
TH0=0;
TR0=1;//重新啟動計數器
}
}

⑥ 求一單片機程序(用光敏電阻,PWM輸出控制LED亮度)

ORG 0000H
L0000: LJMP MIN00 ; 主程序
; / *** *** *** *** / 初始化 PWM
PCA00: MOV CMOD, #82H ; (fSYS/2)
MOV CCON, #00H
MOV CL, #00H
MOV CH, #00H
MOV CCAPM0, #00H ; PWM0 輸出
MOV PCA_PWM0, #00H
SETB CR ; 開 PWM
RET
; / *** *** *** *** / 主程序
P1M0 EQU 91H
P1M1 EQU 92H
P3M0 EQU 0B1H
P3M1 EQU 0B2H
ADC_CONTR EQU 0C5H ; A/D 轉換寄存器
ADC_DATA EQU 0C6H ; A/D 結果寄存器
MIN00: MOV P1M0, #08H ; 設置 P1.3 為高阻狀態
MOV P1M1, #08H
MOV ADC_CONTR, #0E3H ; 開A/D 轉換電源 P1.3
LCALL PCA00 ; 初始化 PWM
MIN10: NOP ; 主程序 入口
LCALL ADC00 ; 測光敏電阻電壓
MOV CCAP0H, A ; 寫入PWM 控制 發光亮度
LJMP MIN10
RET
; / *** *** *** *** / A/D 轉換通道 測電壓
ADC00: MOV ADC_DATA, #00H
ORL ADC_CONTR, #08H ; 啟動 AD 轉換
MOV A, #10H ; 判斷 AD 轉換是否完成
ANL A, ADC_CONTR
JZ ADC32 ; AD 轉換尚未完成, 繼續等待
ANL ADC_CONTR, #0E7H ; 清0 ADC_FLAG, ADC_START 位, 停止A/D 轉換
MOV A, ADC_DATA ; A = AD 轉換結果
RET
END

⑦ 求51單片機的c語言程序

#include<stc89.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x00};
uchar led[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x00,0xFF};
sbit adrd=P3^7;
sbit adwr=P3^6;
sbit la=P2^6;
sbit wela=P2^7;

uchar date1=0;
uchar date2=50;
uchar date3=100;
uchar date4=150;
uchar date5=200;
uchar date6=255;

uchar a,sz;

void init();
void delay(uint z);
uchar adchushihua();
void shumaguan(uint shu);
void processing();
void main()
{
init();

while(1)
{

sz=adchushihua();
for(a=10;a>0;a--)
{
shumaguan(sz);
processing();
}
}
}

void init()
{

P0=0x7f;

}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

uchar adchushihua()
{
uchar shu;
adwr=1;
_nop_();
adwr=0;
_nop_();
adwr=1;

P1=0xff;

adrd=1;
_nop_();
adrd=0;
_nop_();
shu=P1;
adrd=1;

return shu;
}
void shumaguan(uint shu)
{
uchar ,shi,ge;
=shu/100;
shi=shu%100/10;
ge=shu%10;

la=1;
P0=table[];
la=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(5);

la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
delay(5);

la=1;
P0=table[ge];
la=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
delay(5);

}

void processing()
{
if((sz>=date1)&&(sz<=date2))
{
P1=0xfe;
}
else if((sz>=date2)&&(sz<=date3))
{
P1=0xfd;
}
else if((sz>=date3)&&(sz<=date4))
{
P1=0xfb;
}
else if((sz>=date4)&&(sz<=date5))
{
P1=0xf7;
}
else if((sz>=date5)&&(sz<date6))
{
P1=0xef;
}
else if(sz==date6)
{
P1=~P1;
delay(20);

}

}

這個是我剛剛寫的 根據你的需要 反正閑來無事 我寫的比較籠統 需要你自己根據 自己的實際情況來判斷確定 我只是利用AD簡單的處理 成數碼管顯示的數字 你要是 轉換成電壓 那就把裡面的變數 修改一下 我寫的那個控制LED燈亮就不要動了 只是修改一下他前面定義的數字就可以 最後那個是我自己加上去的有點趣味性 希望對你有幫助

⑧ 求pic單片機A/D常式

/*****************************/

#include <pic.h>
__CONFIG(0x2F45H); //晶元配置字.

volatile unsigned int timer0=0; //定義一個時間計數變數.
volatile unsigned char count=0; //計數器.
volatile bit con=0; //動態顯示位碼選擇控制位.(0:第1位,1:第2位)

void Init(void); //埠初始化函數.
void tmr0int(void); //定時器0初始化.

void main(void)
{
Init(); //埠初始化.
tmr0int(); //定時器0初佁化.

TMR0=0xD9; //定時器0初賦值.(經1:256後,10ms中斷一次)
GIE=1; //總中斷允許.

CLRWDT(); //定時喂狗.(WDT的溢出時間為18ms,在這個時間內必須定時清0).
while(1); //等待.
}

void Init(void) //埠初始化函數.
{
TRISC=0x00; //將埠C全部定義為輸出口.
PORTC=0x00; //將埠C置0.
}

void tmr0int(void) //定時器0初始化.
{
T0CS=0; //TMR0工作在定時方式.
PSA=0; //將分頻器分配給TMR0(為1則分配給看門狗).
PS2=1;PS1=1;PS0=1; //設置分頻比1:256.4M晶振,10ms中斷一次.
T0IF=0; //清除TMR0的中斷標志.
T0IE=1; //TMR0中斷允許.
}

void interrupt tmr0_int(void) //4M晶振,10ms中斷一次.
{
CLRWDT(); //定時喂狗.(WDT的溢出時間為18ms,在這個時間內必須定時清0).
if(T0IF==1) //檢查是否是TMR0中斷.
{
T0IF=0; //清除TMR0中斷溢出標志.
TMR0=0xD9; //重新裝入定時器0初值.
if((timer0++)==99) //當1S鍾到達.(990ms,減去了誤差部份)
{
if((count++)==99) //控制計數范圍.
{count=0;} //計數器清0.
timer0=0; //時間計數器清0.
}

//驅動4511顯示部份.
if(!con)
{ //選擇第1位.
PORTC=(count%10)|0xe0; //顯示第1位數字.
con=1; //取反,准備顯示第2位.
}
else
{ //選擇第2位.
PORTC=(count/10)|0xd0; //顯示第2位數字.
con=0; //取反,准備顯示第1位.
}
}
}

⑨ c51單片機程序實例

#include<reg51.h>
#defineucharunsignedchar
uchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0到9
ucharnum,cnt,disn;
ucharkeyval,disk;
ucharled[]={1,2,3,4};
voiddealdat(uchara)
{
led[0]=0;
led[1]=0;
led[2]=0;
led[3]=0;
led[a]=disk;
}
voiddelay(unsignedinta)
{
unsignedinti,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
switch(num)
{
case0:P2=0x01;break;
case1:P2=0x02;break;
case2:P2=0x04;break;
case3:P2=0x08;break;
default:break;
}
P0=~tab[led[num]];
num++;
num&=0x03;
cnt++;
if(cnt>100)
{
cnt=0;
disn++;
disn%=4;
dealdat(disn);
}
}

ucharkbscan(void)
{
unsignedcharsccode,recode;
P3=0x0f;//發0掃描,列線輸入
if((P3&0x0f)!=0x0f)//有鍵按下
{
// delay(20);//延時去抖動
if((P3&0x0f)!=0x0f)
{
sccode=0xef;//逐行掃描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//無鍵按下,返回0
}

voidgetkey(void)
{
unsignedcharkey;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case0x11:keyval=7;break;
case0x12:keyval=4;break;
case0x14:keyval=1;break;
case0x18:keyval=10;break;
case0x21:keyval=8;break;
case0x22:keyval=5;break;
case0x24:keyval=2;break;
case0x28:keyval=0;break;
case0x41:keyval=9;break;
case0x42:keyval=6;break;
case0x44:keyval=3;break;
case0x48:keyval=11;break;
case0x81:keyval=12;break;
case0x82:keyval=13;break;
case0x84:keyval=14;break;
case0x88:keyval=15;break;
default:keyval=0xff;break;
}
}

main()
{
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
if(keyval!=0xff)disk=keyval;
delay(10);
}

}

⑩ 求飛思卡爾單片機mc9s12xs128 超頻CW5.0常式

void MCUInit()
{
DisableInterrupts; //禁止總中斷
CLKSEL &= 0x7f; //CLKSEL的第7位置0,選擇系統時鍾源為OSCCLK

PLLCTL &= 0xbf; //禁止PLL , PLLCTL.6(pllon)設為0;先關閉PLL
SYNR = 0x01; //根據需要的時鍾頻率設置SYNR和REFDV寄存器
REFDV = 0x00;
//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)

PLLCTL |= (1<<6); //打開PLL , PLLCTL.6(pllon)設為1;開PLL
while (( CRGFLG&0x08) == 0x00);//通過判斷LOCK位,
//確定PLL是否穩定
CLKSEL |= (1<<7); //時鍾頻率穩定後,允許鎖相環時鍾源作為系統時鍾源;

//本句 執行後:BusClock=PLLCLK/2 BusClock = 32MHz
}
自己寫的,調試過沒問題,具體主線你想用多少根據注釋自己改

閱讀全文

與求單片機常式相關的資料

熱點內容
程序員可以干什麼 瀏覽:70
績效考核權重分配演算法 瀏覽:524
android應用logo 瀏覽:898
光遇安卓服墓土商店什麼時候開 瀏覽:566
月收益翻倍的源碼 瀏覽:636
asop源碼放在哪裡 瀏覽:988
電腦伺服器密碼怎麼找 瀏覽:574
jdp轉換pdf 瀏覽:749
把pdf導入iphone 瀏覽:508
米哈游租賃的雲伺服器是哪個 瀏覽:524
android直接打電話 瀏覽:1016
ubuntu停止命令 瀏覽:283
cnc攻絲編程 瀏覽:869
換個手機號碼app怎麼注冊 瀏覽:320
怎麼下載小猴口算app 瀏覽:115
輕鏈app的貨怎麼樣 瀏覽:625
電腦里的u盤如何加密 瀏覽:370
我的世界全部版本伺服器下載地址 瀏覽:50
交換原理pdf 瀏覽:229
菜鳥驛站app怎麼邀請新人 瀏覽:448