⑴ 51單片機,幫忙寫個c語言程序
//好像是這個頭文件 好久沒玩51了
#include <reg51.h>
//------------宏定義---------------//
#define uchar unsigned char
#define uint unsigned int
#define BUTTON1 1 //按鍵1
#define BUTTON2 2 //按鍵2
//-----------變數-----------//
uchar Counter = 0; //統計按鍵次數
/*-------管腳定義 --------//
記得是sbit P13 = P1^3;
忘了,你自己定義吧,我直接寫程序
*/
//-------------延時---------------//
void Delay(uchar x)
{
uchar i,j;
for(i = 0; i++; i < x)
for(j = 0; j++; j < 200)
}
//------------按鍵掃描------------//
uchar ButtonScan (void)
{
uchar ButtonNum = 0;
if(P13 == 0)
{
/*延時防止按鍵抖動,如果你的晶振是12M的話,
如果是其他的你只要讓延時在30ms就可以了*/
Delay(150);
if(P13 == 0)
while(!P13); /*等待按鍵松開*/
ButtonNum = BUTTON1;
}
if(P14 == 0)
{
Delay(150);
if(P14 == 0)
while(!P14); /*等待按鍵松開*/
ButtonNum = BUTTON2;
}
return ButtonNum;
}
//----------按鍵判斷-------------//
void ButtonJugde (void)
{
switch(ButtonScan())
{
case 1: //增加
if (Counter != 40)
Counter++;
break;
case 2: //減小
if (Counter != 0)
Counter--;
break;
default: break;
}
}
//---------LED點亮處理--------//
uchar LED (void)
{
/*我這里把你所說的「一號燈」理解為P2.0所對應的二極體,
「二號燈」理解為P2.1所對應的二極體。。。一次類推
根據你的實際電路情況調整*/
uchar LedEnable;
if((Counter > 0) && (Counter <= 5))
{
/*我理解你的二極體是接地的,然後高電平點亮
根據你的實際電路情況調整*/
LedEnable = 0x01;
}
if((Counter > 5) && (Counter <= 10))
{
LedEnable = 0x03;
}
if((Counter > 10) && (Counter <= 15))
{
LedEnable = 0x07;
}
if((Counter > 15) && (Counter <= 20))
{
LedEnable = 0x0f;
}
if((Counter > 20) && (Counter <= 25))
{
LedEnable = 0x01f;
}
if((Counter > 25) && (Counter <= 30))
{
LedEnable = 0x3f;
}
if((Counter > 30) && (Counter <= 35))
{
LedEnable = 0x7f;
}
if((Counter > 35) && (Counter <= 40))
{
LedEnable = 0xff;
}
return LedEnable;
}
//--------------主函數------------------//
void main(void)
{
while(1)
{
ButtonJugde (); //按鍵掃描
P2 = LED(); //點亮二極體
}
}
免責聲明:
以上程序為本人(chen bolin)所寫,但是未通過本人驗證。
任何人可以使用或修改本代碼,包括商業用途。本人不承擔任何責任。
具體請遵守GPL協議。
我沒有編譯,你自己編譯看看吧,別忘了把管腳定義補全了。應該可以實現的。如果有什麼不明白的可以到我的主頁留言。
⑵ 求51單片機C語言編程
不能直接定時400ms,可定時50ms,採用中斷方式,中斷8次就是400ms。先計算出定時初始值,X=65536-50000=3CB0H。程序如下
#include<reg51.h>
sbit led=P2^0; //LED燈在P2.0上,0點亮
unsigned char t1n;//對定時50ms中斷計數8次為400ms
void main()
{
TMOD=0x10;
TH1 =0x3C;//晶振頻率=12M,定時50ms
TL1 =0xB0;
EA =1;//開中斷
ET1 =1;
TR1 =1;
led =0;
while(1);
}
void T1_time() interrupt 3
{
TH1 =0x3C;
TL1 =0xB0;
t1n++;
if(t1n>=8)
{
t1n=0;
led=!led;//狀態翻轉
}
}
⑶ 51單片機C語言編程,簡易計算器,復位鍵如何編程會簡單些要求能隨時返回主程序開頭。。
提供個思路
void (*RecallBp)(void);
main()
{
保存堆棧指針
clear:
RecallBp=(void*) &clear;
恢復堆棧指針
初始化
........
}
需要返回時
調用 RecallBp();
⑷ 51單片機C語言編程
#include<AT89X51.H>
//設CPU是時鍾12MHz的8051系列
dataunsignedintms;
sbitKEY=P2^3;
voidSetupTimer0()
{
TMOD&=0XF0;//僅保留T1信息
TMOD|=0X02;//設置T0:定時功能,方式2,自動重載8位定時器/計數器
TH0=256-250;//定時每0.25ms中斷一次
TL0=256-250;
TR0=1;//開啟定時器
ET0=1;//定時器0中斷打開
}
voidTimer0_ISR()interrupt1//中斷服務程序
{
staticdataunsignedcharus250;
if(++us250>=4){++ms;us250=0;}
}
voidprocess1()
{
unsignedchari,d;
unsignedinttime,dlt;
//第一步8燈整體一直閃(閃10下)。
for(i=0;i<10;++i)
{
P1=0;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
P1=0xFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
}
//第二步整體滅5秒。
P1=0xff;
for(time=ms,dlt=0;dlt<5000;dlt=ms-time);
//第三步從右邊逐個點亮並循環4遍。
for(i=0;i<4;++i)
for(d=1;d;d<<=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);
//第4步循環完畢後全部熄滅;
P1=0xff;
}
voidprocess2()
{
unsignedchari,d;
unsignedinttime,dlt;
//第一步8燈整體閃3次。
for(i=0;i<3;++i)
{
P1=0;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
P1=0xFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
}
//第二步從左邊逐個點亮並循環2遍。
for(i=0;i<2;++i)
for(d=0x80;d;d>>=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);
//第三步循環完畢後8燈一直流水;
for(;KEY;)
for(d=1;d&&KEY;d<<=1)
for(P1=d,time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
}
voidprocess3()
{
unsignedchari,j,d;
unsignedinttime,dlt;
//第一步8燈整體保持全滅,滅的時間為500ms,可以修改
P1=0XFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
//第二步8燈從外到里依次點亮,重復兩遍。
for(i=0;i<2;++i)
for(d=0x1,j=0x80;d<=0x8;d<<=1,j>>=1)
for(P1=~(d|j),time=ms,dlt=0;dlt<500;dlt=ms-time);
//第三步8燈從里到外依次點亮,重復兩遍循環完畢後8燈保持在4亮4滅的狀態
for(i=0;i<2;++i)
for(d=0x8,j=0x10;d;d>>=1,j<<=1)
for(P1=~(d|j),time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
P1=0xc3;
for(;KEY;);
}
voidprocess4()
{
unsignedchari,d;
unsignedinttime,dlt;
//第一步整體保持全滅。滅的時間為1000ms,可以修改
P1=0XFF;
for(time=ms,dlt=0;dlt<1000;dlt=ms-time);
//第二步從左到右流水兩遍。
for(i=0;i<2;++i)
for(d=1;d;d<<=1)
for(P1=d,time=ms,dlt=0;dlt<500;dlt=ms-time);
//第三步從右到左逐個點亮三遍。
for(i=0;i<3;++i)
for(d=0x1;d;d<<=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);
//第4步其中一盞燈保持閃
for(;KEY;)
{
for(d=0x8;KEY;d^=0x8)
for(P1=~d,time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
}
}
voidmain()
{
//dataunsignedcharp0;
ms=0;
SetupTimer0();
EA=1;//全局中斷打開
while(1)
{
process1();
process2();
process3();
process4();
}
}
⑸ 求51單片機C語言程序編程思路
#include<AT89X51.H>
//假定繼電器是安裝在P3.5,按鍵分別安裝在P3.6,P3.7,時鍾頻率12MHz
sbitsw1=P3^6;
sbitsw2=P3^7;
sbitrelay=P3^5;
voidSetupTimer0()
{
TMOD&=0XF0;//僅保留T1信息
TMOD|=0X02;//設置T0:定時功能,方式2,自動重載8位定時器/計數器
TH0=256-250;//定時每0.25ms中斷一次
TL0=256-250;
TR0=1;//開啟定時器
ET0=1;//定時器0中斷打開
}
dataunsignedcharus250;
dataunsignedintrelay_timer;
voidTimer0_ISR()interrupt1//定時中斷服務程序,為按鍵消抖服務
{
//如果一個動作過程剛剛開始,則設定繼電器延時3000ms,並打開繼電器
if(0==relay_timer&&0==sw1){relay_timer=3000;relay=1;}
if(++us250>=4)//250us中斷一次,每四次得到1ms
{
us250=0;
if(relay_timer==0)relay=0;//如繼電器延時為0,則關繼電器
else--relay_timer;//否則繼電器延時遞減
}
//如果當前正處於一個動作過程且有sw2按下,則修改繼電器延時為1000ms
if(relay_timer&&0==sw2)relay_timer=1000;
}
voidmain()
{
us250=0;
relay_timer=0;
relay=0;
SetupTimer0();
EA=1;//全局中斷打開
while(1);//所有的動作均在中斷函數內完成
}
⑹ 51單片機C語言程序
這個很簡單,可以利用單片機的定時器來完成
當有脈沖輸入的時候,啟動定時器,並對定時器的計數值進行清零
每一次脈沖輸入都清零計數值,當脈沖消失後,定時器的計數值達到指定時間則關閉
關閉的同時,調用其它函數,例如你的繼電器控制
需要說明的是,我使用的開發板和你的不見得一樣,所以埠的使用只能你自己修改了
但程序已經經過硬體測試成功,請放心使用,如果滿意記得採納哦
/***************************************************************************/
#include <reg51.h> //51單片機通用頭文件
sbit P24=P1^0; sbit P25=P1^1; sbit P26=P1^2; sbit P27=P1^3;//數碼管位選埠
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
sbit k=P3^7; sbit KK=P1^4;//定義按鍵和繼電器埠
int t,n,s,fe=0;
/***************************************************************************/
void YS(int hs){int hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}//延時函數
/***************************************************************************/
void XS(int xs)//數碼管顯示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P27=0; YS(5); P27=1;
P0=table[d2]; P26=0; YS(5); P26=1;
P0=table[d3]; P25=0; YS(5); P25=1;
P0=table[d4]; P24=0; YS(5); P24=1;
}
/***************************************************************************/
void main(void)//主函數
{
TMOD=0x01; EA=1; ET0=1; KK=0;//定時器初始化
TH0=(65536-921)/256; TL0=(65536-921)%256;//定時器初值
while(1)
{
XS(t);//調用數碼管顯示函數
if(k==0)//如果按鍵被按下
{
YS(10);//延時去抖動
if(k==0)//如果是有效按鍵
{
TR0=1;//啟動定時器,開始計時
n=0;//每次按鍵都清空定時計數
t++;//按鍵值累加一次
KK=1;//繼電器打開
while(!k){XS(t);}//等待按鍵松開,並調用數碼管顯示,避免黑屏
}
}
if(fe==1)//如果沒按鍵輸入
{
fe=0;t=0;//清空按鍵計數值,並設置標識符
KK=0;//繼電器吸合
}
}
}
/***************************************************************************/
void int1() interrupt 1 //定時器中斷
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;//n等於100時,則為1秒
if(n>1000){TR0=0;n=0;fe=1;}//如果達到指定時間,則關閉定時器,並設置標識符
}
/***************************************************************************/
⑺ 用C語言編程51單片機時候讓程序返回到指定位置用什麼語句
還是循環,需要循環幾次用的i++
或者這樣不就回去了嗎?
while(1)
{
P0 = 0xFE;
for(i = 0;i < 60000;i++);
P0 = 0xFB;
for(j = 0;j < 30000;j++);
P0 = 0xFD;
}
⑻ 很簡的51單片機C語言流水燈程序
1、51單片機C語言實現循環8個流水燈左移三次,後右移三次。
常式:
#include<reg51.h> //51單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
sbit beep=P2^3;
void delay(uint z) //延時函數,z的取值為這個函數的延時ms數,如delay(200);大約延時200ms.
{ //delay(500);大約延時500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函數
{
uchar a,i,j;
while(1) //大循環
{
a=0xfe; //賦初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{
P1=a; //點亮小燈
beep=0; //開啟蜂鳴器
delay(50); //延時50毫秒
beep=1; //關閉蜂鳴器
delay(50); //再延時50毫秒
a=_crol_(a,1); //將a變數循環左移一位
}
a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{
P1=a; //點亮小燈
beep=0; //開啟蜂鳴器
delay(50); //延時50毫秒
beep=1; //關閉蜂鳴器
delay(50); //再延時50毫秒
a=_cror_(a,1); //將a變數循環右移一位
}
}
}
2、51單片機是對所有兼容Intel
8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8031單片機,後來隨著Flash
rom技術的發展,8031單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。
⑼ 求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燈亮就不要動了 只是修改一下他前面定義的數字就可以 最後那個是我自己加上去的有點趣味性 希望對你有幫助