伟福8051单机实例程式.docx

上传人:scccc 文档编号:12231935 上传时间:2021-12-02 格式:DOCX 页数:22 大小:55.24KB
返回 下载 相关 举报
伟福8051单机实例程式.docx_第1页
第1页 / 共22页
伟福8051单机实例程式.docx_第2页
第2页 / 共22页
伟福8051单机实例程式.docx_第3页
第3页 / 共22页
伟福8051单机实例程式.docx_第4页
第4页 / 共22页
伟福8051单机实例程式.docx_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《伟福8051单机实例程式.docx》由会员分享,可在线阅读,更多相关《伟福8051单机实例程式.docx(22页珍藏版)》请在三一文库上搜索。

1、附录 CC 语言程序清单 LAP2000;软件实验一 存储器块清零/* #define Buffer 0x3000 */ unsigned char Buffer256;void main() unsigned int index;unsigned char * ptr;ptr = &Buffer; /* 起始地址 */for (index = 0; index <= 255; index+) *ptr+ = 0xff; /* 清 0, 地址加一 */ ;软件实验二 二进制到 BCD 码转换/* 将 Number 拆为三个 void main()unsigned char Res

2、ult3;unsigned char Number;Number = 234;Result0 = Number / 100;Result1 = (Number % 100) / 10; /*Result2 = Number % 10;/*;软件实验三 二进制到 ASCII 码转换 /* 将 A 拆为二个 ASCII 码 ,BCD 码, 并存入Result 数组 */除以 100, 得百位数 */ 余数除以 10, 得十位数 */ 余数为个位数 */并存入 Result 数组 */unsigned char const ASCIITable16 = "0123456789ABCDEF&

3、quot; /* 定义数字对应的 ASCII 表 */ void main()unsigned char Result2; unsigned char Number;Number = 0x1a;Result0 = ASCIITableNumber / 16; /*Result1 = ASCIITableNumber & 0xf; /*高四位 */ 低四位 */while(1);软件实验四 内存块移动unsigned char Buffer1256;unsigned char Buffer2256;void main()unsigned char * ptr1; unsigned cha

4、r * ptr2;unsigned int index;ptr1 = &Buffer10;ptr2 = &Buffer20;for (index=0; index <= 255; index+) *ptr2+ = *ptr1+ - 1;软件实验五 程序跳转表 void Func0() void Func1() void Func2() void Func3() void FuncEnter(unsigned char FuncID) switch (FuncID) case 0: Func0(); break;case 1:Func1(); break;case 2:Fu

5、nc2(); break;case 3:Func3(); break;default: break;void main()FuncEnter(0);FuncEnter(1);FuncEnter(2);FuncEnter(3); ;软件实验六 数据排序#define Size 10unsigned char ArraySize= 5,2,1,0,2,3,8,6,5,9;void main ()unsigned char Change;unsigned char index;unsigned char Temp;do Change = 0;for (index = 0; index < (S

6、ize-1); index+) if (Arrayindex > Arrayindex+1) Change = 1;Temp = Arrayindex;Arrayindex = Arrayindex+1; Arrayindex+1 = Temp; while (Change);while (1);硬件实验一 用 74LS245 读入外部数据 extern unsigned char IN(unsigned int port);extern void OUT(unsigned int port, unsigned char v);#define CS245 0x8000 unsigned

7、char b;void main()while (1) b = IN(CS245);b +;硬件实验二 用 74LS273 扩展 I/O 口 extern unsigned char IN(unsigned int port); extern void OUT(unsigned int port, unsigned char v);#define CS273 0x8000void main()unsigned char i, b;while(1)b = 1;for (i=0; i<8; i+) OUT(CS273, b);b <<= 1;硬件实验三 方向灯控制实验 #defi

8、ne CS273 0x8000#define CS245 0xa000#define DelayCounter 4000#define ON 1#define OFF 0 extern unsigned char IN(unsigned int port);extern void OUT(unsigned int port, unsigned char v); unsigned char P1Buf;unsigned char Flash; void main()unsigned int FlashCounter;OUT(CS273,0);FlashCounter = DelayCounter

9、;Flash = 0xff; while (1) OUT(CS273,(IN(CS245) & Flash); FlashCounter-;if (FlashCounter = 0) FlashCounter = DelayCounter;Flash = Flash;硬件实验四 PWM 转换电压实验/* 输出 50% (5:5) 占空比 PWM */ /* 输出 10% (1:9) 占空比 PWM */ /* 输出 90% (9:1) 占空比 PWM */extern unsigned char IN(unsigned int port); extern void OUT(unsign

10、ed int port, unsigned char v);#define CS273 0x8000void Delay(unsigned char CNT)unsigned char i;while (CNT-) for (i=0; i<50; i+) ;void main()while (1) OUT(CS273,1);Delay(1);OUT(CS273,0);Delay(9);硬件实验五 8253 计数器实验#define CONTROL 0x8003#define COUNT0 0x8000#define COUNT1 0x8001#define COUNT2 0x8002ex

11、tern unsigned char IN(unsigned int port);extern void OUT(unsigned int port, unsigned char v);unsigned int i,j;void main()OUT(CONTROL, 0x30); /* counter0,16bit,mode 3,binary */ OUT(COUNT0, 0); /* low byte of counter */ OUT(COUNT0, 0); /* high byte of counter */ while(1)OUT(CONTROL, 0x0); /* counter1,

12、16bit,mode 3,binary */i = IN(COUNT0); /* low byte of counter */i += IN(COUNT0)*256; /* high byte of counter */j = i ;硬件实验六 8259 外部中断实验#define CS273 0x8000 /* 273 输出地址 */ #define ICW1 0x13/* 单片 8259, 上升沿中断 , 要写 ICW4 */ #define ICW2 0x20/* 中断号为 20H */#define ICW4 0x01/*工作在 8086/88 方式 */#define OCW1 0x

13、fe/*只响应 INT0 中断 */#define CS8259A 0xa000#define CS8259B 0xa001extern unsigned char IN(unsigned int port);extern void OUT(unsigned int port, unsigned char v);extern void DISABLE(void);extern void ENABLE(void);extern void SETINT(unsigned char NO, unsigned int *ENTER); unsigned char CNT;interrupt IEnte

14、r()CNT+;OUT(CS273, CNT);OUT(CS8259A, 0x20); /*中断服务程序结束指令 */void IInit()OUT(CS8259A, ICW1);OUT(CS8259B, ICW2);OUT(CS8259B, ICW4);OUT(CS8259B, OCW1);void main()DISABLE(); /* 关闭中断响应 */IInit();SETINT(ICW2, &IEnter); /*中断入口地址 */CNT = 0;OUT(CS273, CNT);ENABLE(); /*打开中断响应 */while (1); /*等待中断,并计数。 */;硬件

15、实验七 8253 定时器实验#define CONTROL 0x8003#define COUNT0 0x8000#define COUNT1 0x8001#define COUNT2 0x8002extern unsigned char IN(unsigned int port); extern void OUT(unsigned int port, unsigned char v);void main()OUT(CONTROL, 0x36); /* 计数器 0,16 位 , 方式 3, 二进制 */OUT(COUNT0, 10000 % 256); /*计数器低字节 */OUT(COUNT

16、0, 10000 / 256); /*计数器高字节 */OUT(CONTROL, 0x76); /* 计数器 1,16 位,方式 3, 二进制 */OUT(COUNT1, 100 ); /*计数器低字节 */OUT(COUNT1, 0); /*计数器高字节 */while (1) ;硬件实验八 D/A 转换实验#define CS0832 0x8000 extern unsigned char IN(unsigned int port); extern void OUT(unsigned int port, unsigned char v);unsigned char SinTbl9 = 0x

17、00,0x18,0x30,0x46,0x59,0x69,0x75,0x7c,0x7f;void Write0832(unsigned char b)OUT(CS0832,b);/* unsigned char i; */void main()register i;产生锯齿波 */产生正弦波 */n /2)区间的波形*/n /2n )区间的波形*/n3 n /2)区间的波形*/n /22 n )区间的波形*/while(1)for(i=0; i<16; i+)/*Write0832(i*0x10);for(i=0; i<8; i+)/*Write0832(0x80 + SinTbli

18、); /* (0 for(i=8; i>0; i-)Write0832(0x80 + SinTbli); /* ( for(i=0; i<8; i+)Write0832(0x80 - SinTbli); /* ( for(i=8; i>0; i-)Write0832(0x80 - SinTbli); /* (3;硬件实验九 A/D 转换实验#define CS0809 0x8000 extern unsigned char IN(unsigned int port); extern void OUT(unsigned int port, unsigned char v);un

19、signed char Read0809()起动 A/D */ 延时 > 100us */ 读入结果 */unsigned char i;OUT(CS0809, 0); /* for (i=0; i<0x40; i+) ; /* return(IN(CS0809); /* unsigned char b; void main(void) b = Read0809(); b +;硬件实验十8255 输入 /输出实验/*方式0, PA PC输出,PB输入*/#define mode 0x82#define PortA 0x8000 /* Port A */#define PortB 0

20、x8001 /* Port B */#define PortC 0x8002 /* Port C */#define CAddr 0x8003 /* 控制字地址 */ extern unsigned char IN(unsigned int port); extern void OUT(unsigned int port, unsigned char v);unsigned char i,buf;void Delay(unsigned int CNT) while (CNT)CNT-;void main()while(1)OUT(CAddr, mode); /*输出控制字 */*实验 1: P

21、ortA 输出 */buf = 0x80;for(i=0; i<8; i+)OUT(PortA, buf); /*输出到A端口 */buf >>= 1; /*移位 */Delay(0x5000); /*延时 */;/* 实验 2: PortB 输入 PortA 输出 */ buf = IN(PortB); /*读入 PortB */OUT(PortA, buf); /*输出到 PortA */Delay(0x8000);硬件实验十一 八段数码管显示实验#define LEDLen 6#define OUTBIT 0xfe02#define CLK164 0xfe04#defi

22、ne DAT164 0xfe06extern unsigned char IN(unsigned int port);extern void OUT(unsigned int port, unsigned char v);unsigned char LEDBufLEDLen; /* 显示缓冲 */ unsigned char const LEDMAP = /* 八段管显示码 */ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;void Delay(un

23、signed char CNT)unsigned char i;while (CNT- !=0)for (i=100; i !=0; i-);void DisplayLED()unsigned char i, j, k;unsigned char Pos;unsigned char LED;Pos = 0x20; /*从左边开始显示 */for (i = 0; i < LEDLen; i+) OUT(OUTBIT,0); /* 关所有八段管 */LED = LEDBufi;for (j = 0; j < 8; j+) /*送 164 */if (LED & 0x80) OU

24、T(DAT164, 1);else OUT(DAT164, 0);OUT(CLK164, 1);OUT(CLK164, 0);LED <<= 1;OUT(OUTBIT, Pos); /*显示一位八段管 */Delay(1);Pos >>= 1; /* 显示下一位 */void main()unsigned char i = 0;unsigned char j;while(1) LEDBuf0 = LEDMAP i & 0x0f;LEDBuf1 = LEDMAP(i+1) & 0x0f;LEDBuf2 = LEDMAP(i+2) & 0x0f;LE

25、DBuf3 = LEDMAP(i+3) & 0x0f;LEDBuf4 = LEDMAP(i+4) & 0x0f;LEDBuf5 = LEDMAP(i+5) & 0x0f;i+;for(j=0; j<20; j+)DisplayLED(); /* 延时 */;硬件实验十二 键盘扫描显示实验#define LEDLen 6#define IN_KEY 0xfe00#define OUTBIT 0xfe02#define CLK164 0xfe04#define DAT164 0xfe06extern unsigned char IN(unsigned int port

26、);extern void OUT(unsigned int port, unsigned char v);unsigned char LEDBufLEDLen; /* 显示缓冲 */ unsigned char const LEDMAP = /* 八段管显示码 */ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;unsigned char const KeyTable = /*键码定义 */0x16, 0x15, 0x14, 0xff,0x13, 0

27、x12, 0x11, 0x10,0x0d, 0x0c, 0x0b, 0x0a,0x0e, 0x03, 0x06, 0x09,0x0f, 0x02, 0x05, 0x08,0x00, 0x01, 0x04, 0x07;void Delay(unsigned char CNT)unsigned char i;while (CNT- !=0)for (i=100; i !=0; i-);void DisplayLED()unsigned char i, j, k;unsigned char Pos;unsigned char LED;Pos = 0x20; /*从左边开始显示 */for (i =

28、0; i < LEDLen; i+) OUT(OUTBIT,0); /* 关所有八段管 */LED = LEDBufi;for (j = 0; j < 8; j+) /*送 164 */if (LED & 0x80) OUT(DAT164, 1);else OUT(DAT164, 0);OUT(CLK164, 1);OUT(CLK164, 0);LED <<= 1;OUT(OUTBIT, Pos); /*显示一位八段管 */Delay(1);Pos >>= 1; /* 显示下一位 */unsigned char TestKey()OUT(OUTBIT

29、, 0); /*输出线置为 0 */return (IN(IN_KEY) & 0x0f); /*读入键状态 ( 高四位不用 ) */unsigned char GetKey()unsigned char Pos;unsigned char i;unsigned char j;unsigned char k;i = 6;Pos = 0x20; /* 找出键所在列 */do OUT(OUTBIT, Pos);Pos >>= 1;k = IN(IN_KEY) & 0x0f; while (-i != 0) && (k = 0);/* 键值 = 列 X 4

30、+ 行 */if (k != 0) i *= 4;if (k & 2)i += 1;else if (k & 4)i += 2;else if (k & 8)i += 3;OUT(OUTBIT, 0);do Delay(10); while (TestKey(); /*等键释放 */return(KeyTablei); /* 取出键码 */ else return(0xff);void main()LEDBuf0 = 0xff;LEDBuf1 = 0xff;LEDBuf2 = 0xff;LEDBuf3 = 0xff;LEDBuf4 = 0x00;LEDBuf5 = 0x

31、00;while (1) DisplayLED();if (TestKey() LEDBuf5 = LEDMAPGetKey() & 0x0f;#define LEDLen 6#define IN_KEY 0xfe00#define OUTBIT 0xfe02#define CLK164 0xfe04#define DAT164 0xfe06#define CS8251D 0x8000#define CS8251C 0x8001extern unsigned char IN(unsigned int port); extern void OUT(unsigned int port, u

32、nsigned char v);unsigned char LEDBufLEDLen; /* 显示缓冲 */unsigned char const LEDMAP = /* 八段管显示码 */0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;unsigned char const KeyTable = /*键码定义 */0x16, 0x15, 0x14, 0xff,0x13, 0x12, 0x11, 0x10,0x0d, 0x0c, 0x0b, 0x0a,0x

33、0e, 0x03, 0x06, 0x09,0x0f, 0x02, 0x05, 0x08,0x00, 0x01, 0x04, 0x07;void Delay(unsigned char CNT) unsigned char i;while (CNT- !=0)for (i=100; i !=0; i-);void DisplayLED()unsigned char i, j, k; unsigned char Pos; unsigned char LED;Pos = 0x20; /*从左边开始显示 */for (i = 0; i < LEDLen; i+) OUT(OUTBIT,0); /

34、* 关所有八段管 */LED = LEDBufi;for (j = 0; j < 8; j+) /*送 164 */if (LED & 0x80) OUT(DAT164, 1); else OUT(DAT164, 0);OUT(CLK164, 1);OUT(CLK164, 0);LED <<= 1;OUT(OUTBIT, Pos); /*显示一位八段管 */Delay(1);Pos >>= 1; /* 显示下一位 */unsigned char TestKey()OUT(OUTBIT, 0); /*输出线置为 0 */return (IN(IN_KEY)

35、& 0x0f); /*读入键状态 ( 高四位不用 ) */unsigned char GetKey()unsigned char Pos;unsigned char i;unsigned char j;unsigned char k;i = 6;Pos = 0x20; /* 找出键所在列 */do OUT(OUTBIT, Pos);Pos >>= 1;k = IN(IN_KEY) & 0x0f; while (-i != 0) && (k = 0);/* 键值 = 列 X 4 + 行 */if (k != 0) i *= 4;if (k &

36、2) i += 1;else if (k & 4) i += 2;else if (k & 8) i += 3;OUT(OUTBIT, 0);do Delay(10); while (TestKey(); /*return(KeyTablei); /* else return(0xff);void IInit()OUT(CS8251C,0x4f); /* 1OUT(CS8251C,0x15); /*void Send(unsigned char TBuf)unsigned ss;OUT(CS8251C,0x15);/*while( !(IN(CS8251C) & 0x1

37、); /*OUT(CS8251D,TBuf);/*unsigned char Receive()while( !(IN(CS8251C) & 0x2); /* return (IN(CS8251D); /* void main()unsigned char RCVBUF;IInit();LEDBuf0 = 0xff;LEDBuf1 = 0xff;LEDBuf2 = 0xff;LEDBuf3 = 0xff;LEDBuf4 = 0x00;LEDBuf5 = 0x00;等键释放 */取出键码 */停止位,无校验, 8 数据位 */ 清错误标志,允许接收发送 */清错误标志,允许接收发送 */

38、 发送缓冲是否为空 */ 送出数据库 */是否已收到数据 */ 读入数据 */while (1) DisplayLED(); /* if(!(IN(CS8251C) & 0x2) /* if (TestKey()/*Send(GetKey();/* elseRCVBUF = Receive(); /*LEDBuf5 = LEDMAPRCVBUF & 0x0f; /*LEDBuf4 = LEDMAPRCVBUF / 0x10; /* 显示 */是否收到数据 */如果有键按下 */ 则用串口输出 */已收到数据 */ 显示低 4 位 */ 显示高 4 位 */;硬件实验十四直流电机

39、控制实验;硬件实验十五 电子琴#define CONTROL 0x8003#define COUNT0 0x8000#define COUNT1 0x8001#define COUNT2 0x8002#define IN_KEY 0xfe00#define OUTBIT 0xfe02extern unsigned char IN(unsigned int port); extern void OUT(unsigned int port, unsigned char v);unsigned int const ToneTable = 2273, 2024, 1805, 1704, 1517, 1

40、353, 1205, 1136;unsigned char const KeyTable = /* 0x16, 0x15, 0x14, 0xff, 0x13, 0x12, 0x11, 0x10, 0x0d, 0x0c, 0x0b, 0x0a, 0x0e, 0x03, 0x06, 0x09, 0x0f, 0x02, 0x05, 0x08, 0x00, 0x01, 0x04, 0x07;unsigned char TestKey()OUT(OUTBIT, 0);/*return (IN(IN_KEY) & 0x0f); /*unsigned char GetKey()unsigned ch

41、ar Pos; unsigned char i;unsigned char j; unsigned char k;键码定义 */输出线置为 0 */读入键状态 ( 高四位不用 ) */i = 6;Pos = 0x20; /* 找出键所在列 */ do OUT(OUTBIT, Pos);Pos >>= 1;k = IN(IN_KEY) & 0x0f; while (-i != 0) && (k = 0);/* 键值 = 列 X 4 + 行 */if (k != 0) A if (k & 2)i += 1;else if (k & 4)i +=

42、2;else if (k & 8)i += 3;return(KeyTablei); /* else return(0xff);取出键码 */void Delay(unsigned char CNT) unsigned char i;while (CNT- !=0)for (i=100; i !=0; i-); void OutTone(unsigned int Tone)OUT(CONTROL, 0x36); /* counter0,16bit,mode 3,binary */OUT(COUNT0, Tone % 256); /* low byte of counter */ OUT

43、(COUNT0, Tone / 256); /* high byte of counter */ void main()unsigned char Key;unsigned int Tone;while (1) while (! TestKey() ; /*等按键 */Key = GetKey();if ( (Key >= 1) && (Key <= 8) ) Tone = ToneTableKey-1 ;OutTone(Tone);delay(600);OutTone(2);硬件实验十六 步进电机控制实验;硬件实验十七 空调温度控制实验#define LEDLen

44、 6#define ADPort 0x8000 /* AD采样输入片选 */#define CS273 0xa000 /* 控制输出片选 */#define IN_KEY 0xfe00#define OUTBIT 0xfe02#define CLK164 0xfe04#define DAT164 0xfe06extern unsigned char IN(unsigned int port);extern void OUT(unsigned int port, unsigned char v);unsigned char LEDBufLEDLen; /* 显示缓冲 */unsigned char const LEDMAP = /* 八段管显示码 */0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1