完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
//#include "reg51.h" #include "intrins.h" #define FOSC 11059200L #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; #define URMD 0 //0:使用定时器2作为波特率发生器 //1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器 //2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器 #define ADC_POWER 0x80 //ADC电源控制位 #define ADC_FLAG 0x10 //ADC完成标志 #define ADC_START 0x08 //ADC起始控制位 #define ADC_SPEEDLL 0x00 //540个时钟 #define ADC_SPEEDL 0x20 //360个时钟 #define ADC_SPEEDH 0x40 //180个时钟 #define ADC_SPEEDHH 0x60 //90个时钟 void InitUart(); void InitADC(); void SendData(int dat); BYTE GetADCResult(int ch); void Delay(WORD n); void ShowResult(int ch); int i,h,j; void main() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; P6M0 = 0x00; P6M1 = 0x00; P7M0 = 0x00; P7M1 = 0x00; InitUart(); //初始化串口 InitADC(); //初始化ADC while (1){ ShowResult(0); //显示通道0 // ShowResult(1); //显示通道1 // ShowResult(2); //显示通道2 // ShowResult(3); //显示通道3 // ShowResult(4); //显示通道4 // ShowResult(5); //显示通道5 // ShowResult(6); //显示通道6 // ShowResult(7); //显示通道7 } } /*---------------------------- 发送ADC结果到PC ----------------------------*/ void ShowResult(int ch) { SendData(ch); //显示通道号 for(h=0,j=0;j<=5;j++) { h+=GetADCResult(ch); } h=h/4; SendData(h); //显示ADC高8位结果 // SendData(ADC_LOW2); //显示低2位结果 } /*---------------------------- 读取ADC结果 ----------------------------*/ BYTE GetADCResult(int ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); //等待4个NOP _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成 ADC_CONTR &= ~ADC_FLAG; //Close ADC return ADC_RES; //返回ADC结果 } /*---------------------------- 初始化串口 ----------------------------*/ void InitUart() { SCON = 0x5a; //设置串口为8位可变波特率 #if URMD == 0 T2L = 0xd8; //设置波特率重装值 T2H = 0xff; //115200 bps(65536-18432000/4/115200) AUXR = 0x14; //T2为1T模式, 并启动定时器2 AUXR |= 0x01; //选择定时器2为串口1的波特率发生器 #elif URMD == 1 AUXR = 0x40; //定时器1为1T模式 TMOD = 0x00; //定时器1为模式0(16位自动重载) TL1 = 0xd8; //设置波特率重装值 TH1 = 0xff; //115200 bps(65536-18432000/4/115200) TR1 = 1; //定时器1开始启动 #else TMOD = 0x20; //设置定时器1为8位自动重装载模式 AUXR = 0x40; //定时器1为1T模式 TH1 = TL1 = 0xfb; //115200 bps(256 - 18432000/32/115200) TR1 = 1; #endif } /*---------------------------- 初始化ADC ----------------------------*/ void InitADC() { P1ASF = 0x01; //设置P1口为AD口 ADC_RES = 0; //清除结果寄存器 ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); //ADC上电并延时 } /*---------------------------- 发送串口数据 ----------------------------*/ void SendData(int dat) { while (!ti); //等待前一个数据发送完成 TI = 0; //清除发送标志 SBUF = dat; //发送当前数据 } /*---------------------------- 软件延时 ----------------------------*/ void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } |
|
相关推荐
3个回答
|
|
#include
#include #include "intrins.h" typedef unsigned char BYTE; typedef unsigned int WORD; #define FOSC 11059200L //系统频率 #define BAUD 115200 //串口波特率 #define NONE_PARITY 0 //无校验 #define ODD_PARITY 1 //奇校验 #define EVEN_PARITY 2 //偶校验 #define MARK_PARITY 3 //标记校验 #define SPACE_PARITY 4 //空白校验 #define PARITYBIT EVEN_PARITY //定义校验位 #define URMD 0 //0:使用定时器2作为波特率发生器 //1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器 //2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器 #define ADC_POWER 0x80 //ADC电源控制位 #define ADC_FLAG 0x10 //ADC完成标志 #define ADC_START 0x08 //ADC起始控制位 #define ADC_SPEEDLL 0x00 //540个时钟 #define ADC_SPEEDL 0x20 //360个时钟 #define ADC_SPEEDH 0x40 //180个时钟 #define ADC_SPEEDHH 0x60 //90个时钟 bit busy; //adc void InitUart(); void InitADC(); void SendData(int dat); BYTE GetADCResult(int ch); void Delay(WORD n); void ShowResult(int ch); int i,h,j; int dianliu=300; unsigned char yuliang; void job() _task_ 0 { os_create_task (1); //首次开机关闭 os_create_task (2); //自动开 os_create_task (3); //自动关 os_create_task (4); //计算电流ADC os_create_task (5); // while(1) { P35=1; os_wait(K_TMO,50,0); } } void num1() _task_ 1 { while(1) { P20=~P20; os_wait(K_TMO,50,0); } } void num2 () _task_ 2 { yuliang=0; while (1) { if(dianliu<400) if(P16==1) P21=0; else P21=1; } } void num3 () _task_ 3 { while (1) { P33=0; P2=0; os_wait(K_TMO,50,0); P33=1; P2=1; os_wait(K_TMO,50,0); } } //void num4 () _task_ 4 /* { void SendData(int dat); void SendString(int *s); while(1) { #if (PARITYBIT == NONE_PARITY) SCON = 0x50; //8位可变波特率 #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) SCON = 0xda; //9位可变波特率,校验位初始为1 #elif (PARITYBIT == SPACE_PARITY) SCON = 0xd2; //9位可变波特率,校验位初始为0 #endif AUXR = 0x40; //定时器1为1T模式 TMOD = 0x20; //定时器1为模式2(8位自动重载) TL1 = //0xfd; //(256 - (FOSC/32/BAUD)); //设置波特率重装值 TH1 = (256 - (FOSC/32/BAUD)); TR1 = 1; //定时器1开始工作 ES = 1; //使能串口中断 EA = 1; if(RI==1) { // SendString("STC15F2K60S2rnUart Test !rn"); } } } /*---------------------------- UART 中断服务程序 -----------------------------*/ /*void Uart() interrupt 4 using 1 { if (RI) { RI = 0; //清除RI位 P0 = SBUF; //P0显示串口数据 P22 = RB8; //P2.2显示校验位 } if (TI) { TI = 0; //清除TI位 busy = 0; //清忙标志 } } /*---------------------------- 发送串口数据 ----------------------------*/ /*---------------------------- 发送字符串 ----------------------------*/ /*void SendString(int *s) { while (*s) //检测字符串结束标志 { SendData(*s++); //发送当前字符 } } /*void SendData(int dat) { while (busy); //等待前面的数据发送完成 ACC = dat; //获取校验位P (PSW.0) if (P) //根据P来设置校验位 { #if (PARITYBIT == ODD_PARITY) TB8 = 0; //设置校验位为0 #elif (PARITYBIT == EVEN_PARITY) TB8 = 1; //设置校验位为1 #endif } else { #if (PARITYBIT == ODD_PARITY) TB8 = 1; //设置校验位为1 #elif (PARITYBIT == EVEN_PARITY) TB8 = 0; //设置校验位为0 #endif } busy = 1; SBUF = ACC; //写数据到UART数据寄存器 } */ void num5 () _task_ 5 { InitUart(); //初始化串口 InitADC(); //初始化ADC while (1){ ShowResult(0); //显示通道0 // ShowResult(1); //显示通道1 // ShowResult(2); //显示通道2 // ShowResult(3); //显示通道3 // ShowResult(4); //显示通道4 // ShowResult(5); //显示通道5 // ShowResult(6); //显示通道6 // ShowResult(7); //显示通道7 } } /*---------------------------- 发送ADC结果到PC ----------------------------*/ void ShowResult(int ch) { SendData(ch); //显示通道号 for(h=0,j=0;j<=5;j++) { h+=GetADCResult(ch); } h=h/4; SendData(h); //显示ADC高8位结果 // SendData(ADC_LOW2); //显示低2位结果 } /*---------------------------- 读取ADC结果 ----------------------------*/ BYTE GetADCResult(int ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); //等待4个NOP _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成 ADC_CONTR &= ~ADC_FLAG; //Close ADC return ADC_RES; //返回ADC结果 } /*---------------------------- 初始化串口 ----------------------------*/ void InitUart() { SCON = 0x5a; //设置串口为8位可变波特率 #if URMD == 0 T2L = 0xd8; //设置波特率重装值 T2H = 0xff; //115200 bps(65536-18432000/4/115200) AUXR = 0x14; //T2为1T模式, 并启动定时器2 AUXR |= 0x01; //选择定时器2为串口1的波特率发生器 #elif URMD == 1 AUXR = 0x40; //定时器1为1T模式 TMOD = 0x00; //定时器1为模式0(16位自动重载) TL1 = 0xd8; //设置波特率重装值 TH1 = 0xff; //115200 bps(65536-18432000/4/115200) TR1 = 1; //定时器1开始启动 #else TMOD = 0x20; //设置定时器1为8位自动重装载模式 AUXR = 0x40; //定时器1为1T模式 TH1 = TL1 = 0xfb; //115200 bps(256 - 18432000/32/115200) TR1 = 1; #endif } /*---------------------------- 初始化ADC ----------------------------*/ void InitADC() { P1ASF = 0x01; //设置P1口为AD口 ADC_RES = 0; //清除结果寄存器 ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); //ADC上电并延时 } /*---------------------------- 发送串口数据 ----------------------------*/ void SendData(int dat) { while (!TI); //等待前一个数据发送完成 TI = 0; //清除发送标志 SBUF = dat; //发送当前数据 } /*---------------------------- 软件延时 ----------------------------*/ void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } |
|
|
|
#include
#include #include "intrins.h" typedef unsigned char BYTE; typedef unsigned int WORD; #define FOSC 11059200L //系统频率 #define BAUD 115200 //串口波特率 #define NONE_PARITY 0 //无校验 #define ODD_PARITY 1 //奇校验 #define EVEN_PARITY 2 //偶校验 #define MARK_PARITY 3 //标记校验 #define SPACE_PARITY 4 //空白校验 #define PARITYBIT EVEN_PARITY //定义校验位 #define URMD 0 //0:使用定时器2作为波特率发生器 //1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器 //2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器 #define ADC_POWER 0x80 //ADC电源控制位 #define ADC_FLAG 0x10 //ADC完成标志 #define ADC_START 0x08 //ADC起始控制位 #define ADC_SPEEDLL 0x00 //540个时钟 #define ADC_SPEEDL 0x20 //360个时钟 #define ADC_SPEEDH 0x40 //180个时钟 #define ADC_SPEEDHH 0x60 //90个时钟 bit busy; //adc void InitUart(); void InitADC(); void SendData(int dat); BYTE GetADCResult(int ch); void Delay(WORD n); void ShowResult(int ch); int i,h,j; int dianliu=300; unsigned char yuliang; void job() _task_ 0 { os_create_task (1); //首次开机关闭 os_create_task (2); //自动开 os_create_task (3); //自动关 os_create_task (4); //计算电流ADC os_create_task (5); // while(1) { P35=1; os_wait(K_TMO,50,0); } } void num1() _task_ 1 { while(1) { P20=~P20; os_wait(K_TMO,50,0); } } void num2 () _task_ 2 { yuliang=0; while (1) { if(dianliu<400) if(P16==1) P21=0; else P21=1; } } void num3 () _task_ 3 { while (1) { P33=0; P2=0; os_wait(K_TMO,50,0); P33=1; P2=1; os_wait(K_TMO,50,0); } } //void num4 () _task_ 4 /* { void SendData(int dat); void SendString(int *s); while(1) { #if (PARITYBIT == NONE_PARITY) SCON = 0x50; //8位可变波特率 #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) SCON = 0xda; //9位可变波特率,校验位初始为1 #elif (PARITYBIT == SPACE_PARITY) SCON = 0xd2; //9位可变波特率,校验位初始为0 #endif AUXR = 0x40; //定时器1为1T模式 TMOD = 0x20; //定时器1为模式2(8位自动重载) TL1 = //0xfd; //(256 - (FOSC/32/BAUD)); //设置波特率重装值 TH1 = (256 - (FOSC/32/BAUD)); TR1 = 1; //定时器1开始工作 ES = 1; //使能串口中断 EA = 1; if(RI==1) { // SendString("STC15F2K60S2rnUart Test !rn"); } } } /*---------------------------- UART 中断服务程序 -----------------------------*/ /*void Uart() interrupt 4 using 1 { if (RI) { RI = 0; //清除RI位 P0 = SBUF; //P0显示串口数据 P22 = RB8; //P2.2显示校验位 } if (TI) { TI = 0; //清除TI位 busy = 0; //清忙标志 } } /*---------------------------- 发送串口数据 ----------------------------*/ /*---------------------------- 发送字符串 ----------------------------*/ /*void SendString(int *s) { while (*s) //检测字符串结束标志 { SendData(*s++); //发送当前字符 } } /*void SendData(int dat) { while (busy); //等待前面的数据发送完成 ACC = dat; //获取校验位P (PSW.0) if (P) //根据P来设置校验位 { #if (PARITYBIT == ODD_PARITY) TB8 = 0; //设置校验位为0 #elif (PARITYBIT == EVEN_PARITY) TB8 = 1; //设置校验位为1 #endif } else { #if (PARITYBIT == ODD_PARITY) TB8 = 1; //设置校验位为1 #elif (PARITYBIT == EVEN_PARITY) TB8 = 0; //设置校验位为0 #endif } busy = 1; SBUF = ACC; //写数据到UART数据寄存器 } */ void num5 () _task_ 5 { InitUart(); //初始化串口 InitADC(); //初始化ADC while (1){ ShowResult(0); //显示通道0 // ShowResult(1); //显示通道1 // ShowResult(2); //显示通道2 // ShowResult(3); //显示通道3 // ShowResult(4); //显示通道4 // ShowResult(5); //显示通道5 // ShowResult(6); //显示通道6 // ShowResult(7); //显示通道7 } } /*---------------------------- 发送ADC结果到PC ----------------------------*/ void ShowResult(int ch) { SendData(ch); //显示通道号 for(h=0,j=0;j<=5;j++) { h+=GetADCResult(ch); } h=h/4; SendData(h); //显示ADC高8位结果 // SendData(ADC_LOW2); //显示低2位结果 } /*---------------------------- 读取ADC结果 ----------------------------*/ BYTE GetADCResult(int ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); //等待4个NOP _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成 ADC_CONTR &= ~ADC_FLAG; //Close ADC return ADC_RES; //返回ADC结果 } /*---------------------------- 初始化串口 ----------------------------*/ void InitUart() { SCON = 0x5a; //设置串口为8位可变波特率 #if URMD == 0 T2L = 0xd8; //设置波特率重装值 T2H = 0xff; //115200 bps(65536-18432000/4/115200) AUXR = 0x14; //T2为1T模式, 并启动定时器2 AUXR |= 0x01; //选择定时器2为串口1的波特率发生器 #elif URMD == 1 AUXR = 0x40; //定时器1为1T模式 TMOD = 0x00; //定时器1为模式0(16位自动重载) TL1 = 0xd8; //设置波特率重装值 TH1 = 0xff; //115200 bps(65536-18432000/4/115200) TR1 = 1; //定时器1开始启动 #else TMOD = 0x20; //设置定时器1为8位自动重装载模式 AUXR = 0x40; //定时器1为1T模式 TH1 = TL1 = 0xfb; //115200 bps(256 - 18432000/32/115200) TR1 = 1; #endif } /*---------------------------- 初始化ADC ----------------------------*/ void InitADC() { P1ASF = 0x01; //设置P1口为AD口 ADC_RES = 0; //清除结果寄存器 ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); //ADC上电并延时 } /*---------------------------- 发送串口数据 ----------------------------*/ void SendData(int dat) { while (!TI); //等待前一个数据发送完成 TI = 0; //清除发送标志 SBUF = dat; //发送当前数据 } /*---------------------------- 软件延时 ----------------------------*/ void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } |
|
|
|
看不明白你到底在问什么?提问提清楚一点,别人才能回答,好不啦
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
180 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
587 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
549 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
548 浏览 0 评论
1051 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11763 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 17:46 , Processed in 0.914364 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号