① 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就可以改变占空比和频率。