//第一個實驗:
//假設8個LED陰極指向單片機,D11連接P0.1,D12連接P0.2 。 D18連接P0.7
//假設K1按鍵在P2.3引腳
#include<reg51.h>
#include<intrins.h>
sbit k1=P2^3;//假設K1按鍵在P2.3引腳
void main()
{
P0=0xfe;
while(1)
{
if(k1==0)
{
while(k1==0);
P0=_crol_(P0,1);
}
}
}
//第二個實驗:
//假設8個LED陰極指向單片機,D11連接P0.1,D12連接P0.2 。 D18連接P0.7
#include<reg51.h>
char led[]={0xfe,0xff,0xfd,0xff,0xfb,0xff,0xf7,0xff,0xef,0xff,0xdf,0xff,0xbf,0xff,0x7f,0xff};
void main()
{
char i=0;
char counter=0;
TMOD=0x01;//T0 工作方式1
TH0=(655356-50000)/256;//延時50ms
TL0=(655356-50000)%256;//延時50ms
TR0=1;//啓動T0
while(1)
{
if(TF0==1)//查詢
{
TH0=(655356-50000)/256;//重新延時50ms
TL0=(655356-50000)%256;//重新延時50ms
counter++;
if(counter==10)//延時0.5秒
{
counter=0;//重新開始新一輪0.5秒延時
i++;
if(i==16)
{
i=0;
}
P0=led[i];//點燈
}
}
}
}
2.51單片機用C語言編寫#include<reg51.h>
sbit a = P1^2; //定義單片機對蜂鳴器的輸出端口
sbit key = P3^2; //定義單片機對按鍵的端口 S19
void delay_short() //短延時函數 大約100us 用於設定蜂鳴器的頻率
{
unsigned int i;
for(i=0;i<100;i++);
}
void delay_long() //長延時函數 大約20ms 用於按鍵的軟件消抖和2次聲響之間的間隔
{
unsigned int j;
for(j=0;j<20000;j++);
}
void work(unsigned time) //蜂鳴器使能函數,參數爲需要發聲的時間 參數越大響的時間越長 不能超過65535
{
unsigned int m = time;
unsigned int n = 0;
while(m)
{
a = ~a;
delay_short();
m--;
}
for(n=0;n<30;n++) //大約延時 1S左右
{
delay_long();
}
}
void main()
{
while(1)
{
if(key == 0) //軟件消抖
{
delay_long();
if(key == 0)
{
work(2000);
work(2000);
work(2000);
work(500);
work(500);
work(500);
work(500);
work(500);
}
}
}
}
上面是實現要求的所有源程序,另外糾延時控制的是發聲的頻率,並不是發聲的時間長短,發聲的時間長短可以透過循環來實現,具體見源程序。另外單片機的I/O口的負載能力是不足以驅動蜂鳴器的,需要藉助放大芯片,我用的是ULN20003 下面附上我的硬件連接圖
圖片不是很清楚 估計是SOSO的問題 然後就是把IN和單片機的P1^2口連起來就可以
有上面問題可以聯繫我 363396124 加的時候請說明來意
3.51單片機的優先級怎麼用C語言怎麼寫正常情況下,優先順序爲:
外部中斷0
定時器0
外部中斷1
定時器1
串口
定時器2
IP中的位控制中斷優先級,分別爲:
PX0:外部中斷0
PT0:定時器0
PX1:外部中斷1
PT1:定時器1
PS:串口
PT2:定時器2
當其爲1時,該位對應的中斷將設爲高優先級。
中斷響應是:同級中斷比如IP各位都爲0 或都爲1時,同時到達時優先按如上順序響應中斷,當一箇中斷在執行時,其他中斷只能排隊等候。
當其中一位爲1比如PS=1時,那麼無論爲0的任何中斷在執行中都將被打斷,優先響應進階中斷。
因此,要保證需要的中斷享有至高權限,將相應的控制位設爲1就可以了,比如串口優先保證那麼初始化時加入:
PS=1;就OK。
4.求寫一個單片機(AT89C51)C語言程序用C啊,我想想:
1、和硬件有點兒關係,這個你清楚麼?
2、假設LED連接到P1口吧。第一個燈接到P1.0。陰極接IO,陽極接5V。
#include <reg51.h>
bit SecFlag;
unsigned char mS;
void Display(unsigned char num,unsigned char sec)
{
num%=8;
P1=~(1<<num);
while(sec--!=0)
{
TR0=1;
while(SecFlag==0);SecFlag=0;
TR0=0;
}
}
main()
{
unsigned char i;
TMOD=1;IE=0x82;
while(1)
{
Display( (i++)%8,1);
}
}
void ISRT0(void) interrupt 1
{
TH0=(-50000)>>8;TL0=-50000;
mS++;
if(mS>20){mS=0;SecFlag=1;}//12MHz, 50mS定時中斷,1秒計時。
}
你很容易擴展出任意要求的閃爍流水燈啦。
Display(2,1);
Display(1,1);
Display(3,2);
Display(1,2);
……放到while裏面就好了。祝你玩得開心。
5.單片機c語言//下面三行分別將uchar、uint、ulong定義爲 unsigned char、unsigned int和unsigned long 方便使用
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include //包括一個52標準內核的頭檔案
sbit P10 = P1^0; //將P10定義單片機的P1.0口,控制的LED燈,
sbit K1= P3^2; //將K1定義爲按鍵K1
uchar scale;//用於儲存佔空比的輸出0的時間份額,總共10份
char code dx516[3] _at_ 0x003b;//這是爲了仿真設定的
//模擬PWM輸出控制燈的10個亮度級別
void main(void) // 主程序
{
uint n;
//下面幾行是定時器的初始化,初始化的數據OxF3和0x98,數據是透過計算得到的,公式我忘了
RCAP2H =0xF3; //賦T2的預置值的高位,溢出1次是1/1200秒鐘
RCAP2L =0x98;//賦T2的預置值的低位
TR2=1; //啓動定時器
ET2=1; //開啟定時器2中斷
EA=1; //開啟總中斷
while(1) //程序循環
{ ;//主程序在這裏就不斷自循環,實際應用中,這裏是做主要工作
//for循環只是起個延時的作用
for(n=0;n
scale++;//就是說每次for循環延時結束後scale佔空比增加一次,直到scale==10
if(scale==10)scale=0;
}
}
//1/1200秒定時器2中斷 中斷程序獨立的,不管何時只要中斷的條件到了就調用它,本程序的條件是 定時器T2的定時到了
timer2() interrupt 5
{
static uchar tt; //tt用來儲存當前時間在一秒中的比例位置
TF2=0;
tt++;
if(tt==10) //每1/120秒整開始輸出低電平
{
tt=0;
if(scale!=0) //這裏加這一句是爲了消除滅燈狀態產生的鬼影
P10=0;
}
if(scale==tt) //按照當前佔空比切換輸出高電平
P10=1;
}
6.單片機C語言入門1,首先要學習C語言基礎,就相當於80%會單片機了,因爲現在所有8/16/32位(51系列,MSP430系列,ARM系列)都是使用C語言。
2,聽起來單片機比較陌生,不是因爲不懂,而是不知道方法和流程。現簡單說說,僅供參考;
3,看一下單片機功能:包換內部FLASH、RAM、TIMER、INT、ADC、USB、ISP/IAR等。
4,編譯環境、編程軟件KEIL。
5,開啟開發板的例子程序,在KEIL編譯,下載到板,看結果和說明是不是相符,達到這樣效果時,心裏肯定很激動,這時真正學會了單片機,成功了。
6,然後再學會看電路圖,電路圖其實很簡單,就是一根線從一個地方連接到另一個地方,寫代碼時,只記住單片機是哪一個管腳,然後對它寫代碼即可。
總結:實驗很重要,要多參與這樣的項目開發,方能進步。
7.51單片機 c語言看門狗程序怎麼寫看門狗在51單片機電路里的作用是防止程序 “跑飛”、“死機”後,系統不動作,而採取復位的辦法“喚醒”系統。
89S51、89S52系列單片機自帶有看門狗功能,片內數據區A6H寄存器具有看門狗功能,使用很簡單:#include
void main() { WDTRST=0x1E;;//初始化看門狗 WDTRST=0xE1;//初始化看門狗 for(;;) { WDTRST=0x1E;;//喂狗指令 WDTRST=0xE1;//喂狗指令 } } 可見,你只要在程序的大循環體內加一條喂狗指令就行。但這種看門狗功能有限,不是很可靠的,它依靠晶振工作,一旦晶振不起振,就無效了。
實踐中多采用外部看門狗的方法,可以選用的芯片很多:MAX708、MAX813 、X25045。..具體編程就要看芯片的參考資料了。
例如:X25045是SPI總線的看門狗芯片,復位端和單片機復位端連接,SPI數據輸入你可以選擇合適的IO接口。WREN 0x06 設定寫允許位 WRDI 0x04 復位寫允許位 RDSR 0x05 讀狀態寄存器 WRSR 0x01 寫狀態寄存器 READ 0x03/0x0b 讀操作時內部EEPROM頁地址 WRITE 0x02/0x0a 寫操作時內部EEPROM頁地址 #include
所以89S51 89S52都帶狗,80C51、80C52都不帶狗。
8.51單片機C語言編程代碼如下:
typedef union {
unsigned int myvalue;
struct{
unsigned myvalueL:8;
unsigned myvalueH:8;
}child;
}_mytype;
_mytype mytype;
void main()
{
mytype.myvalue = 0x1234;
}
仿真如下:
是你要的結果吧