① C51 單片機代碼問題

畔畔字模提取軟體 :
http://www.willar.com/forum_view.asp?view_id=10887
下面是LED顯示驅動程序:
**********************************************************************************************/
/************* 頭文件定義*************************/
/**********************************************************************************************/
#include <AT89X51.h>
#include <intrins.h>
/**********************************************************************************************/
/************數組定義***********/
/**********************************************************************************************/
unsigned char code dis_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
unsigned char code dis_code_1[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char data dis_digit;
/**********************************************************************************************/
/************延時子程序**********/
/**********************************************************************************************/
void Delay_Led8(unsigned char ms) {
unsigned char i;
while(ms--) {
for(i = 0; i < 120; i++);
}
}
/**********************************************************************************************/
/************顯示時間***************/
/************入口參數有*************/
/**********************************************************************************************/
void Display_Time(unsigned char dat_hour,unsigned char dat_min,unsigned char dat_sec) {
P2=0x00;
ET0=0;
if ((dat_hour/10)==0)
dis_buf[0] = 0x00; // 時十位消隱
else
dis_buf[0] = dis_code[dat_hour/10]; // 時十位
dis_buf[1] = dis_code[dat_hour%10]; // 時個位
dis_buf[3] = dis_code[dat_min/10]; // 分十位
dis_buf[4] = dis_code[dat_min%10]; // 分個位
dis_buf[6] = dis_code[dat_sec/10]; // 秒十位
dis_buf[7] = dis_code[dat_sec%10]; // 秒個位
dis_buf[2] = 0x40; // 顯示"-"
dis_buf[5] = 0x40; // 顯示"-"
ET0=1;
Delay_Led8(300);
}
/**********************************************************************************************/
/*************初始化*************/
/**********************************************************************************************/
void Int_Port() {
P0 = 0xff;
P2 = 0xff;
TMOD = 0x11; // 定時器0, 1工作模式1, 16位定時方式
TH0 = 0xFC;
TL0 = 0x17;
IE = 0x8a; // 使能timer0,1 中斷
dis_digit = 0xfe;
dis_index = 0;
}
/**********************************************************************************************/
/*定時器0中斷服務程序, 用於數碼管的動態掃描*/
/*dis_index --- 顯示索引, 用於標識當前顯示的數碼管和緩沖區的偏移量*/
/*dis_digit --- 位選通值, 傳送到P2口用於選通當前數碼管的數值, 如等於0xfe時,選通P2.0口數碼管*/
/*顯於緩沖區基地址*/
/**********************************************************************************************/
void timer0() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x17;
P2 = 0xff; // 先關閉所有數碼管
P0 = ~dis_buf[dis_index]; // 顯示代碼傳送到P0口
P2 = ~dis_digit; //
dis_digit = _crol_(dis_digit,1); // 位選通值左移, 下次中斷時選通下一位數碼管
dis_index++; //
dis_index &= 0x07; // 8個數碼管全部掃描完一遍之後,再回到第一個開始下一次掃描
}
/**********************************************************************************************/

注意:要在主程序裡面寫入Int_Port();這個初始程序。
這是寫入數據:Display_Time(12,00,00);12點00分00秒。
我的數碼管是共陽極的,如果你的是共陰極的,你改以下兩個地方: P0 = dis_buf[dis_index]; P2 = dis_digit;

② 編寫c51程序

你可以和程序員面對面探討一下

③ 單片機c51的按鍵0~f的代碼

#include <reg52.h>

#include <intrins.h>


#define uchar unsigned char

#define uint unsigned int



uchar key;


unsigned char code disp_code[]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


unsigned char code key_code[]={

0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,

0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77 };


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


延時子函數


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

void delayms(uint ms)

{

uchar t;

while(ms--)

{

for(t = 0; t < 120; t++);

}

}



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


鍵盤掃描子函數


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

uchar keyscan()

{

uchar scan1,scan2,keycode,j;


P3=0xf0;

scan1=P3;

if((scan1&0xf0)!=0xf0) //判鍵是否按下

{

delayms(30); //延時30ms

scan1=P3;

if((scan1&0xf0)!=0xf0) //二次判鍵是否按下

{

P3=0x0f;

scan2=P3;

keycode=scan1|scan2; //組合成鍵編碼


for(j=0;j<=15;j++)

{

if(keycode== key_code[j]) //查表得鍵值

{

key=j;

return(key);

}

}

}

}

else P3=0xff;


return (16);

}


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


判鍵是否按下子函數


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

void keydown()

{

P3=0x0f;

if((P3&0x0f)!=0x0f)

{

keyscan();

P0=disp_code[key];

beep();

}

}


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


主函數


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

main()

{

P0 = 0xbf;

P2 = 0x7f; //數碼管顯示"-"

P3 = 0xff;

while(1)

{

keydown();

}

}

④ 求大佬教51單片機代碼,c語言

網路文庫上有相關的教程,你可以看一下

⑤ C51單片機 簡單代碼

//TR0 =0;

//TR = 1

這兩條指令不行。在c語言中//表示解釋說明,單片機是不認識的!

⑥ 51單片機常用代碼

51單片機常用有不同的代碼,那麼單片機的代碼呢還是你用他的最原始的代碼書寫文件就可以了,這樣的話就可以做出來非常成功的描述。

⑦ c51單片機代碼求解釋

不知道這些代碼是幹嘛的,程序也不完整,只能給你字面的解釋:

//XX子程序,有兩個輸入參數,一個是位變數CHTimeIcon,UCHAR的原型應該是關鍵字unsigned char 那麼另一個是無符號字元型變數RowSeq
void LeftShift(bit CHTimeIcon, UCHAR RowSeq)
{
bit cFlg;//定義了1個位變數cFlg
UCHAR i, k;//定義了2個無符號字元型變數i和k
UCHAR bdata CHCode;//定義了1個可位定址的無符號字元型變數CHCode

i = RowSeq<<1;//RowSeq沒有在該子程序內聲明,應該是全局變數,將RowSeq整個數據左移1位,最高位被移走,最低位變成0,然後將該值賦給變數i

if (CHTimeIcon==1 || G_OrderIcon!=0)//如果CHTimeIcon的值是1或者G_OrderIcon的值不等於0則進入下一行(CHTimeIcon和G_OrderIcon也是全局變數)
cFlg = IBytesLeftShift(&G_Cur_TimeCode[i+1], 0);//執行IBytesLeftShift(&G_Cur_TimeCode[i+1], 0)這個子程序,返回1個位變數,並將該值賦給cFlg,&G_Cur_TimeCode[i+1]的意思是把數組G_Cur_TimeCode[]的第i+1位數取出來作為地址變數參數送到IBytesLeftShift子程序中。
else
{
if (i == 0 || i == 16)//如果i等於0或者i=16,執行下面一句程序
CHCode = G_Cur_CHCode[i/16];將數組G_Cur_CHCode[]中的第i/16位數值取出送給變數CHCode
//取位元組最高位,並左移
//cFlg = ReturnFlg(&CHCode);
cFlg = (CHCode & 0x80)>>7;//將CHCode除了最高位,其它位統統清0,然後把最高位移動到最低位的位置上,例如10110001->10000000->00000001,然後把結果賦值給變數cFlg,要注意的是cFlg是bit變數,在C語言里char變數賦值給bit變數,只要char變數的值不為0則賦給bit變數的值就是1,反之則是0。
CHCode<<=1;//CHCode整體左移1位,例如00000001->00000010
}

//顯示緩沖區漢字點陣碼左移位
for (k = _WIN_CH_NUM_; k > 0; k--)//將_WIN_CH_NUM_的值賦給k,作為k的初值,只要k的值大於0則執行下面的程序,執行完畢後k的值減1,然後判斷k的值是否還大於0,大於0則繼續循環,否則退出for語句
cFlg = TwoBytesLeftShift(&G_CHCode[k-1][i+1], cFlg);//執行TwoBytesLeftShift(&G_CHCode[k-1][i+1], cFlg)這個子程序,返回1個bit變數,並將該值賦給cFlg,TwoBytesLeftShift有兩個輸入參數,1個是&G_CHCode[k-1][i+1],1個是cFlg,上面有類似的語句說明。
}

⑧ 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);
}

}

⑨ 求單片機C51代碼

用兩個變數來控制就可以了,一個PWM控制占空比,一個T控制頻率。
一個計數變數內cnt來計數。
cnt<PWM 輸出高電平容
cnt>=PWM && cnt<T 輸出低電平。
用按鍵來調節PWM和T就可以改變占空比和頻率。